代码改变世界

Java和C#的隐藏方法

2010-05-31 17:48  DeguangLi  阅读(499)  评论(0编辑  收藏  举报

发表于 @ 2006年10月06日 02:18:00

今晚在群里讨论很久关于隐藏方法,的一些相关东东,总结一下内容.

Java

1.根据Java Language Specification (Version 3) 8.4.8 的描述,子类在继承父类时,对于方法而言,存在两种关系:
A. override 即覆盖,这是对实例方法(instance method)而言的;子类与父类中形构相同的方法(原文中是 subsignature,它的范围比“形构相同”要大,请参考原文)会override 父类中的那个方法。
B. hide 即隐藏,这是对类方法(class method)即static 方法而言的。如果子类中定义了静态方法,则它会隐藏父类中形构相同的(原文中是 subsignature,它的范围比“形构相同要”大,请参考原文)所有方法,但如果隐藏了父类中的实例方法,则会编译报错。
public class TestHideMethod
{
    
public static void staticMethod()
    {
        System.out.println(
"Test 's static Method");
    }

    
public static void main(String[] args)
    {
        TestHideMethodSub ts 
= new TestHideMethodSub();
          
//调用的还是子类的方法,相当于 TestHideMethodSub.staticMethod();
        ((TestHideMethod) ts).staticMethod();
    }
}

class TestHideMethodSub extends TestHideMethod
{
    
//隐藏方法
    public static void staticMethod()
    {
        System.out.println(
"TestStatic 's static Method");
    }
}

结论:

隐藏方法:重写父类的一个static方法. JAVA中除了static方法外,实例方法是无法被隐藏的因为当调用static method时,即使是通过实例调用此方法,但实际上编译时,就首先取出该实例的类型,并对类型的该方法进行了绑定,所以再动态转型也时无济于事的.(引用群主:midthinker)

 

C#

new方法
class Test
{
    
public virtual  void test()
    {
        Console.WriteLine(
"test");
    }
    
static void Main(String[] args)
    {
        Test3 t3 
= new Test3();
        t3.test();
        
//调用的是父类的方法.
        ((Test)t3).test(); 
     }
}

class Test3
{
   
//隐藏方法
    public new void test()
    {
        Console.WriteLine(
"Test3");
    }

结论:

对方法得调用依据得是引用类型,而不是实例本身得类型啊,所以当你将t3得引用类型转型成Test后,她实际调用得是Test.test method,而不管实际得类型是什么,所以这里就排斥了多态.(引用群主:midthinker) Java和C#的隐藏方法的区别在Java中隐藏方法只能对static method进行,因为static成员属于类成员,所以java中即便是动态转换,调用的还是改类(子类)的静态方法.进行隐藏主要目的是不要从父类继承下来的静态方法. C#中则不一样,可以对父类得virtual函数进行隐藏,而且隐藏方法可以通过动态转换来调用父类的virtual方法,这一点跟override是不一样的..感觉灵活性大,但具体在哪种场景下使用还未知.