2 u010558109 u010558109 于 2015.06.14 09:31 提问

java继承 在子类中声明同名变量的问题???

如下代码:

 class Person {
String name;
int age;

public void introduce(){
System.out.println("姓名是" + name + ",年龄是" + age);
}
}

public class Students extends Person{
//  String name;

public static void main(String[] args) {
Students students = new Students();
students.name = "小明";
students.age = 24;
students.introduce();
}
}

这段代码执行结果打印 姓名是小明,年龄是24
但是把那行注释语句加上的话 打印结果是姓名是null,年龄是24
为什么呢?
貌似有继承中变量的覆盖或者说是隐藏的问题,不是很理解,求助了。

5个回答

CodeofWorker
CodeofWorker   2015.06.14 10:43

class Person{
private String name;
private int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public void introduce(){
System.out.println("姓名是" + name + ",年龄是" + age);
}

}

public class Students extends Person {
public static void main(String[] args){
Students students = new Person("小明",24);
students.introduce();
}
}

danielinbiti
danielinbiti   Ds   Rxr 2015.06.14 09:37

如果父类和子类存在同名变量,这两个同名变量会同时存在,成员变量不存在多态。也就是这两个同名变量,访问这个成员变量的是哪个类,就访问的是哪个类的变量。
比如Person.name就是访问person的,students.name就是访问students

u010558109
u010558109   2015.06.14 09:48

你好,谢谢你的回答。想问一下,
同样是调用父类的introduce()方法,在声明同名变量name之前,访问到的是子类变量的值(如上,打印出的是"小明")
而在声明了同名变量后,调用introduce()方法,咋访问到的是父类的变量值呢( 如上,打印出的是null)

danielinbiti
danielinbiti 回复danielinbiti: 每个类的信息,你可以理解是根据继承关系有层次的。
2 年多之前 回复
danielinbiti
danielinbiti 回复u010558109: 子类继承后,在编译的时候,是会把父类能继承的信息放到方法区内,也就是和父类是两份信息。只是成员变量信息能够记录是父类的还是子类的。如果子类没有该同名成员变量,则相当于用父类的成员变量。但如果子类有同名成员变量,则用子类的同名变量。
2 年多之前 回复
danielinbiti
danielinbiti 回复u010558109: “实例化一个子类,会生成父类和子类两个对象”只有一个对象。不会生成父类对象。
2 年多之前 回复
u010558109
u010558109 回复danielinbiti: 哎呀,好像明白了一些。原来没有同名变量之前,操作的都是父类的变量呀。 我原本对继承的理解是,如果继承了父类的变量,那么子类对象中,也会有自己独立的与父类相同的变量。也就是说,实例化一个子类,会生成父类和子类两个对象,而他们拥有的变量也是一样的。 按你的说法就是,如果实例化子类,会生成两个父类子类两个对象,但如果没有同名变量的情况下,其实只有父类对象中有变量的,子类对象中啥都没有。 是这个意思吗,不好意思,语文不好,话说的绕了些。。
2 年多之前 回复
danielinbiti
danielinbiti 哪有访问到过子类变量name,没有同名变量name之前,子类继承父类的name,也就是操作的是父类的name变量,如果子类有同名变量name,操作子类的就是子类定义的name.
2 年多之前 回复
u010558109
u010558109   2015.06.14 10:43

哎呀,好像明白了一些。原来没有同名变量之前,操作的都是父类的变量呀。
我原本对继承的理解是,如果继承了父类的变量,那么子类对象中,也会有自己独立的与父类相同的变量。也就是说,实例化一个子类,会生成父类和子类两个对象,而他们拥有的变量也是一样的。
按你的说法就是,如果实例化子类,会生成两个父类子类两个对象,但如果没有同名变量的情况下,其实只有父类对象中有变量的,子类对象中啥都没有。
是这个意思吗,不好意思,语文不好,话说的绕了些。。

tongyi55555
tongyi55555   2015.06.14 12:58

注释行放开后,只要关注下打印时是在父类打印的因此name为空。有个选择叫最近选择,具体是哪个变量哪个离得近就是了。

Csdn user default icon
上传中...
上传图片
插入图片