java 父类子类继承 同名变量 同名方法
来源:互联网 发布:免费mysql服务器 编辑:程序博客网 时间:2024/06/09 17:02
无意中发现的这个有趣的问题。
观察下列代码, 父类和子类中都定义有 String name变量,那最终继承之后是不是只剩下1个name?还是父类子类的name互相不相干?
通过赋值后,最后会输出什么?见如下
public class Son extends Parent{ String name; // 子类中的name void value(){ name ="a"; super.value(); //调用父类中的value(),给name赋值b System.out.println(name); //结果输出 a System.out.println(super.name); //结果输出 b } public static void main (String[] args){ TestTest test =new TestTest(); test.value(); } }//end class class Parent{<span style="white-space:pre"></span> //定义父类String name; //父类中的namevoid value (){name = "b"; } }//end class
输出:
a
b
由此可见,子类首先 name=“a”,即使调用了父类value()中的 name ="b",
System.out.println(name); 仍然是输出 a ,可见子类通过引用父类方法并不改变子类中的name的值,即使赋值的变量名都是name
然而,改变的是父类中自己的name变量,因此System.out.println(super.name);输出 b
综合得知,父类与子类定义同名的变量,并不会覆盖,而是各自还有自己的空间,即使变量名相同
子类中调用父类的对同名变量name赋值的方法,仍然只是改变父类自己的name变量的值
再看一个,结合父类引用,多态问题
public class Son_test extends Parent{int i = 10;public static void main(String[] args){Son_test son_test = new Son_test();System.out.println("son.i=" + son_test.i);//输出子类的 i=10;son_test.set(100); // 调用继承的父类方法,由上可知,改变的只是父类自己的 iSystem.out.println("son.i=" + son_test.i); // 输出的仍然是 子类的 i=10Parent son =son_test; // 多态,子类对象赋值给父类引用, 引用类型是父类Parent System.out.println( son.i); // 输出的竟然是父类的 i=100 ,,,,,,,}}class Parent{int i = 10;public void set(int i){this.i = i;}}输出:
son.i=10
son.i=10
100
由此可见,当父类子类存在同名变量时,引用类型是父类,即使是子类的对象,son.i 中的 i 却是 父类中的 i 。
分界线
我们知道,如 Parent a = new Son(); 其中son的父类是parent, 利用引用 a.变量 或者 a.方法时候,即使son类中有对应的变量或方法,而父类parent 中没有a.变量 或者 a.方法,是不能通过编译的,
但若父类parent 中存在对应的 变量和方法 ,son子类中也有同名的变量和方法, 则a.方法 调用的是子类的方法,而 a.变量 调用的确是 父类的变量。
见如下代码
public class A {Animal animals = new Dog();Dog dogs = new Dog();public static void main(String[] args) { A as =new A(); as.go2(); } void go2(){animals.eat(); // Animal animals =new Dog(),父类应用类型,子类对象System.out.println(animals.i); }//内部类 class Animal { int i=10; //子类的ivoid eat() {System.out.println("animal are eating"); } } class Dog extends Animal {int i=100; //父类的ivoid eat() {System.out.println("dogs are eating"); } }
输出:
dogs are eating ( animal.eat() 调用的是子类的 eat() )
10 ( animal.i 调用的是父类的 i )
0 0
- java 父类子类继承 同名变量 同名方法
- Java 理解 子类成员变量与父类成员变量同名 方法的重写
- java中子类继承父类和实现接口有同名方法怎么处理
- c++父类子类同名变量
- java 父类子类同名方法的调用
- C++继承基类与子类中的同名变量与同名函数
- 子类父类 成员同名
- Java中关于子类成员变量与父类成员变量同名
- 父类子类有同名变量时候的初始化
- java中子类与父类的同名变量覆盖问题
- 继承中的同名成员变量处理方法
- JS中子类中如何调用父类的同名方法(继承时候,父类的同名方法被覆盖了)
- java 类继承两个父类,同名变量 public 比protected具有优先访问权限
- java 向上转型之后调用子类的同名变量/方法的问题(多态)
- (多态)Java向上转型之后调用子类的同名变量/方法的问题
- C++多级继承子类访问“爷爷类”同名成员
- 父类和子类 同名成员变量和静态成员变量
- JAVA继承父类的同名成员方法的访问权限
- NSNumber转成NSString
- 通过表格元素的id来改变值
- 黑马程序员java之多线程
- javaSE基础编程——GUI窗体设计之记事本(使用监听器)
- jaxb 将xml转化为bean时报异常javax.xml.bind.UnmarshalException: unexpected element
- java 父类子类继承 同名变量 同名方法
- T20调出 “经典模式”,大家可以试试~~
- sharepoint 2016 学习系列篇(7)-如何给网站分配用户访问权限site permission for users
- WCF错误一例
- java 语言基础语法小结
- 程序执行的优先选择
- NDK开发之调用方法
- 终于看到配置成功的Android模拟器是什么样子
- iOS开发,集成高德poi功能