C#和Java在多态情况下对成员访问的比较
2015-10-11 11:29
232 查看
本文简单比较一下两种语言在里氏替换原则下,父类引用变量访问成员时的访问结果:
如果有两个类,如Person与Student,后者继承了前者,而且子类与父类有重名成员,当Person p = new Student();时,通过p.[重名成员]访问到的结果是什么呢?
Java
1. 多态情况下,如果子父类存在同名的非静态成员变量,那么访问的是父类的成员变量。
2. 多态情况下,如果子父类存在着同名的非静态的函数时,那么访问的是子类 的函数。
3. 多态情况下,如果子父类存在着同名的静态成员时,那么访问的是父类的成员。
4. 多态情况下,不能调用子类特有的成员。
总结:多态情况下(一定是在多态情况下,其它情况下无效),子父类存在同名 的成员时,默认都是访问父类的成员,
除了同名的非静态函数的时才是访问子类的成员。
C#
1. 父类变量同样不能调用到所指向的子类对象独有的成员
2. 访问非静态成员变量或者方法时访问的都是父类的成员变量或方法
3. C#并不能直接通过对象来访问静态成员或方法
如果有两个类,如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"); } }
相关文章推荐
- Java对象基础的一些小问题
- eclipse部署WEB项目时经常遇到的问题
- java 对list进行排序
- 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口
- Java中Runnable和Thread的区别
- 创建自己Stack底层使用链表java版本
- Java基础知识强化之IO流笔记42:IO流总结(图解)
- eclipse 快捷键大全
- zookeeperのjava应用
- Java枚举类型
- eclipse安装ADT
- java 终端输入小结,输入到数组、文件等(持续更新)
- java 终端输入小结,输入到数组、文件等(持续更新)
- Spring 集成Quartz Scheduler 定时调度任务 Example
- unbutu下安装eclipse
- 日期操作类(Date、Calendar、DateFomat、SimpleDateFormat类)
- Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)
- Java序列化格式详解
- java,Substring简单用法
- Eclipse快捷键