C#和Java在多态情况下对成员访问的比较

本文简单比较一下两种语言在里氏替换原则下,父类引用变量访问成员时的访问结果:

如果有两个类,如Person与Student,后者继承了前者,而且子类与父类有重名成员,当Person p = new Student();时,通过p.[重名成员]访问到的结果是什么呢?

Java
1. 多态情况下,如果子父类存在同名的非静态成员变量,那么访问的是父类的成员变量。
2. 多态情况下,如果子父类存在着同名的非静态的函数时,那么访问的是子类 的函数。
3. 多态情况下,如果子父类存在着同名的静态成员时,那么访问的是父类的成员。
4. 多态情况下,不能调用子类特有的成员。
总结:多态情况下(一定是在多态情况下,其它情况下无效),子父类存在同名 的成员时,默认都是访问父类的成员,
   除了同名的非静态函数的时才是访问子类的成员。

class Animal{
    
    int x = 10; 

    static String y = "动物";
    
    public static void eat(){
        System.out.println("动物在吃...");
    }
        public void move(){
                System.out.println("动物在动...");
        }
}

class Dog extends Animal{

    int x  = 20;
    
    static String y = "狗";
    
    public static void eat(){
        System.out.println("狗在吃...");
    }

    //狗特有方法--->咬人
    public void bite(){
        System.out.println(name+"狠狠的咬....");
    }
        public void move(){
                System.out.println("狗在动...");
        }
}

class Demo5 
{
    public static void main(String[] args) 
    {
        //多态:父类的引用类型变量指向了子类的对象
        Animal a  = new Dog();
        a.bite();//报错,无法访问
                System.out.println(a.x);//输出10
                System.out.println(a.y);//输出动物
                a.move();//输出狗在动
                a.eat();//输出动物在吃
         }
}    

C#
1. 父类变量同样不能调用到所指向的子类对象独有的成员
2. 访问非静态成员变量或者方法时访问的都是父类的成员变量或方法
3. C#并不能直接通过对象来访问静态成员或方法

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Student();
            Console.WriteLine(p.name);//输出 Person 即访问非静态成员变量时访问的是父类的成员变量
            p.SayHi();                //输出 Perosn 即访问非静态成员方法时访问的是父类的成员方法
            Console.ReadKey();
        }
    }
    class Person
    {
        public string name = "Person";
        public void SayHi()
        {
            Console.WriteLine("Person");
        }
    }
    class Student:Person
    {
        public string name = "Student";
        public  void SayHi()
        {
            Console.WriteLine("Student");
        }
    }

 

posted @ 2015-10-11 11:29  湘大小生  阅读(441)  评论(0编辑  收藏  举报