java 子类实例化时是否同时存在一个父类对象.

java 子类实例化时是否同时存在一个父类对象.
假如父类A中有个int a = 1;
子类B继承A,同时B中覆盖个int a = 2;

运行:
A test = new B();
system.out.println(test.a);

结果是1,是父类中的属性.这个时候是否存在父类对象,我的理解是存在的.
我又试,把父类用抽象abstract修饰,按理说abstract累不能实例化吧,肯定不能得到父类中的a属性,结果还是一样的.
怎么理解.
是不是创建子类对象,肯定会出现一个父类的对象?

不会产生父类对象,只是用了父类的构造函数而已,并不是用到构造函数就会产生对象,构造函数只是起对象初始化作用的,而不是起产生对象作用的,如果new A();即只有new语句才会产生父类A的对象。

变量是静态绑定 ,方法是动态绑定。 这里面变量在编译期间实现了变量调用语句与变量定义赋值语句的绑定,绑定的自然是父类的,因为调用时类型是父类的,所以值是父类中定义的值

其实你可以这么理解 创建了一个子类对象时,在子类对象内存中,有两份这个变量,一份继承自父类,一份子类。
绝对不会产生父类对象,父类中的成员被继承到子类对象中,用指向子类对象的父类引用调用父类成员,只不过是从 子类对象内存空间中找到那个被继承来的父类成员,也就是说实质是用子类对象调用变量a,这样就可以解释成员必须通过对象调用的规定,只不过这时调用的是子类对象中的继承自父类的a(子类对象中有两个a,一个继承自父类,一个属于自己)

哎,话说的有些乱。 这个问题也困惑我很久,上网查询发现很多人是错误的,最后找到几篇好的文章才明白,可能很多java老手也都会犯“产生父类对象”这个错误,最近才搞明白。

你自己想想,如果产生父类对象,如果父类是抽象类,抽象类允许产生对象吗?所以这种说法不严谨
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-09-12
第一,实例化子类不会实例化父类,所以不存在一个父类对象;
第二,构造方法只是为变量赋值,只是赋值;
第三,变量是编译期间静态绑定的。
第2个回答  2011-10-15
这其实是个多态的问题,
简单的理解为Java不支持属性字段覆盖(override),只支持方法覆盖,
换句话说,多态的含义是运行时对象行为发生了改变,但属性字段不发生改变,因为属性字段封装了数据,数据只能由方法或者说对象的行为发生改变

这和c#有点不同,c#字段也可以override
第3个回答  2011-10-15
A test = new B();这行代码表明现在的test是父类引用,但是指向的是子类对象。子类对象在构造的时候会先调用其父类的构造方法,也就是说,在执行new B()的时候实际上先执行的是new A(),这样int a = 1;这条语句就被执行了,test引用虽然指向的是子类的对象,但是test对外仍然是A类型,故当你打印test.a的时候,就是父类A的属性a的值。只有当父类引用指向子类对象,且子类中重写了父类中的方法时,这种情况下,调用父类的被其子类重写的方法才会实际去执行被子类重写过的方法体,这就是Java中的多态,我想你不能理解的地方应该就是在这里了。多态的前提是:父类引用指向子类对象,且子类重写了父类中的方法。据我目前的理解(不一定是对的,哪位大侠如果明确的觉得错了请帮忙指正)属性应该是不存在什么多态的。希望能帮到你。追问

你的意思是,创建一个子类,同时也创建了一个父类,,可以这么理解吗?

追答

可以这样理解吧,创建子类对象个过程中也创建了一个匿名的父类对象。

第4个回答  2011-10-14
A test = new B();
关键在这一句,对象的上转型对象。
父类型 引用 = new 子类型();
父类型的引用指向子类的一个实例。
这里需要掌握的东西:
1 内存模型
2 extends权限 public protected private friendly
3 什么叫重写
4 this 与 super
5 RTTI 与 object slicing

java 子类实例化时是否同时存在一个父类对象.
不会产生父类对象,只是用了父类的构造函数而已,并不是用到构造函数就会产生对象,构造函数只是起对象初始化作用的,而不是起产生对象作用的,如果new A();即只有new语句才会产生父类A的对象。变量是静态绑定 ,方法是动态绑定。 这里面变量在编译期间实现了变量调用语句与变量定义赋值语句的绑定,绑...

JAVA实例化子类时候同样也实例父类,O bject是所有类的父类,难不成实 ...
实例化子类的时候会调用父类的构造方法, 所有类都是Object的子类,在实例化的时候都会调用Object的构造方法,由于Object中有很多方法很多类都会用到,比如toString(),为了保证这些方法所以才会设计Object这个类。

new一个子类的时候,父类对象有没有生成
有父类对象的生成,要不你怎么可以继承父类中的成员变量呢!在内存中生成一个子类SubClass的对象区域,在此区域当中还包含着一个父类(Base)对象. (如下图)

父类对象由子类实例化是什么意思
既然如此那么当我们使用子类实例化一个对象子后,那么这个对象同样也拥有了父类的所有特性,所以这时如果我们将这个子类的对象进行类型转化为父类的对象是完全可以的,为什么呢?因为子类的对象拥有父类的一切特性。而Person p = new Student()这个语句其实就相当于隐式声明了一个子类对象然后将其隐式转化...

子类实例化,调用父类构造器,会实例化父类吗
究其原因,想必是 Java 语言设计者,要求子类有责任保证它所继承的父类尽快进入到一个稳定、完整的状态中。试想,如果没有这个约束,那么子类的某个继承自父类的方法可能会使用到父类中的一些变量,而这些变量并没有进行初始化,从而产生一些难以预料的后果。也因此,当一个类的构造方法是 private 时...

Java子类是否会有父类的private方法和属性
那么:分析内存后,会发现,当一个子类被实例化的时候,默认会先调用父类的构造方法对父类进行初始化,即在内存中创建一个父类对象,然后再父类对象的外部放上子类独有的属性,两者合起来成为一个子类的对象。所以:子类继承了父类的所有属性和方法或子类拥有父类的所有属性和方法是对的,只不过父类...

为什么在实例化子类的对象的时候会调用先调用父类的构
因为子类继承父类之后,获取到了父类的内容(属性\/字段),而这些内容在使用之前必须先初始化,所以必须先调用父类的构造函数进行内容的初始化.

java 子类调用父类构造方法会创建父类对象吗
调用初始化方法并不代表会生成对象,你的java代码中出现new关键字加上构造方法的调用,只会生成一个对象,其父类对象不会生成,所以调用父类为抽象类的构造方法完全是合理的。抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,...

如何理解Java中"父类对象由子类实例化
父类为:Animal,成员变量有,名字,性别,颜色 子类为:Dog ,成员变量有,[名字,性别,颜色],尾巴长度,舌头大小。定义一个变量A Animal A = new Dog ();这样,虽然实例化用Dog(),但我只需要使用[名字,性别,颜色]这个变量,而不关心{尾巴长度,舌头大小}这2个变量的情况。在某些场合下...

...了父类的默认构造函数,这代表创建了一个父类对象吗?
没有创建父类对象,D的构造函数里隐式的有一个super();代表父类的构造函数,函数里输出了C,对象是new出来 ,构造函数只是创建对象后进行初始化, 你的代码里只new了一个D 你的理解是调用构造函数即创建了一个对象,理解有问题.对象的创建是new ,构造函数只是初始化,即在创建对象的同时执行了构造函数....

相似回答