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

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

tongyi55555
tongyi55555   2015.06.14 12:58

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java 父类子类继承 同名变量 同名方法
无意中发现的这个有趣的问题。 观察下列代码, 父类和子类中都定义有 String name变量,那最终继承之后是不是只剩下1个name?还是父类子类的name互相不相干? 通过赋值后,最后会输出什么?见如下 public class TestTest extends son { String name; // 子类中的name void value(){ name ="a";
java中子类与父类的同名变量覆盖问题
变量,或者叫做类的属性,在继承的情况下,如果父类和子类存在同名的变量会出现什么情况呢?这就是这道题要考查的知识点——变量(属性)的覆盖。 这个问题虽然简单,但是情况却比较复杂。因为我们不仅要考虑变量、静态变量和常量三种情况,还要考虑private、friendly(即不加访问修饰符)、protected和public四种访问权限下对属性的不同影响。
继承中的同名成员变量处理方法
继承中的同名成员变量处理方法 1、当子类成员变量与父类成员变量同名时 2、子类依然从父类继承同名成员 3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符) 4、同名成员存储在内存中的不同位置   总结:同名成员变量和成员函数通过作用域分辨符进行区分 #include using namespace std;
Java中父类子类成员变量重名的处理
Java中类成员变量的作用域为类本身。如果在子类中存在和父类相同变量名的成员变量会如何呢? 其实这些可以完全按照C语言中全局变量和局部变量的关系来处理,即局部变量会覆盖全局变量,而在超过局部变量作用域,就是全局变量起作用。 例如:              public class Parent  {                     public int x = 5;      
[C++] 关于子类声明与父类同名同类型的成员变量的问题
在编程语言的世界里,继承意味着子类中包含父类所有的一切。那么如果在子类中声明了跟父类名字以及类型都一样的成员变量时会如何处理?这个其实会涉及到C++中所谓的名字mangling的机制,所谓name mangling是指C++中为了区分输入的相同名字的东西,例如函数重载,多个虚表指针,等等,所以当出现前面提到的情况时,实际上编译器会把父类和子类的成员变量mangling化,使其独一无二,例如,如下两
Java中关于子类成员变量与父类成员变量同名
重写和重载是针对方法的,子类的变量可以覆盖父类的变量,但是不能改变父类的变量。
java基础------>继承--->属性(在子类中调用父类同名属性的两种方式)
在今天的继承复习当中,我有对继承中的属性有新的感悟------>子类继承父类,会继承父类的方法和属性,看下图 从上图可以看出,即使子类是一个空壳,他还是从父类获取到父类的属性name 和方法 test() 但是接下来我说的就是一个小重点--->在继承当中,子类继承父类的属性和继承方法的方式上有所差别 --->父类属性不可被重写,只会被调用,父类方法可以被重写,也可以被调用
java中子类继承父类和实现接口有同名方法怎么处理
Java是一门单继承语言,但是,在子类的继承关系中,会存在父类和接口有同名方法的情况,这种情况该怎么处理呢? 我们来一步步验证: 1.子类继承父类,实现接口,父类和接口有同名方法 public interface MyInterface { void test(); }public class Father { public void test() { System.out.prin
java继承实质、父类引用指向子类对象(多态)、声明时类型、运行时类型
继承是面向对象的三大特征(封装、继承和多态)之一,也是java语言的重要特性。 那么,继承父类的成员变量和继承父类的方法有什么区别吗?答案是肯定的。有的人甚至都不知道这个问题的存在。 继承成员变量和继承方法的区别: 可能大家都认同 “当子类继承父类时,子类会获得父类中定义的成员变量和方法,当访问权限允许的情况下,子类可以直接访问父类的变量和方法”。这种观点其实稍显笼统,因为jav
由一个简单示例 引出java继承中父子类成员变量共享问题 以及super的使用
输出结果为 12 12 13 10 虚拟机执行步骤: 1:虚拟机加载测试类,提取类型信息到方法区。 2:通过保存在方法区的字节码,虚拟机开始执行main方法,main方法入栈。 3:执行main方法的第一条指令,new B(); 这句话就是给B类实例对象分配堆空间。因为B继承A父类,所以,虚拟机首先加载A类到方法区,并在堆中为父类成员变量在子类空间中初始化,