那么如楼上几位所说的如下代码怎么解释?public class B extends A(){ public B(){ super();//调用父类的构造器这时候没有A的对象产生吗? } } //A 的构造器同样 public class A(){ public A(){ super();//调用Object的构造器,这时候到底有没有Object对象产生呢? } }
我是这么理解的: 当一个类的实例化一个对象时,会产生类所描述的属性和方法的实例,它所包含的属性和方法是这个实例独自拥有的 如果这个类有父类,那么它会拥有父类所有可继承的属性和方法 在实例化时,通过调用构造方法,依次初始化父类的属性,并不是产生一个父类的实例(因为不是组合或聚合)综上所述,我认为只生成B的一个实例但如果public class B extends C{ // B是C(is-a)但不能说B拥有C(has-a) Object obj = null; Class A = null; B() { obj = new Object(); A = new A(); } } 这段代码就会产生3个实例。
套用两个回复: public class B extends A(){ public B(){ super();//调用父类的构造器这时候没有A的对象产生吗? } } //A 的构造器同样 public class A(){ public A(){ super();//调用Object的构造器,这时候到底有没有Object对象产生呢? } } 你调用了构造方法,但不产生对象?这怎么可能? 所以会有三个对象,只是A和Object的对象被包含在B对象里????
有三个对象,仅实例化了对象B,其余的没实例化, 可以看看Java 内存分配机制
1.如果创建了A对象的实例,那么意味着被B覆盖的A的某个方法fn()在new B()以后也会存在,那将B转型为A后,但是实际中调用 ((A)B).fn()调用的实际还是B中的fn(),还有A的那些私有属性,创建B就创建A,那给有多少的内存冗余啊.从这个意义上讲,如果你是java语言的设计者,你会搞这么冗余但是又用不到的东西给用户么? 2.构造函数确实是在创建对象的时候调用,但是并不代表调用该构造就一定创建该构造所在对象吧? 真正的判断条件是 new 关键字. 3
只不过在B中包着一个A,在A中包着一个Object
如果你实例化B类,那莫就产生一个B类的对象B类只是继承A类。更不会产生3个对象如果那样的话,OutOfMemory就变成家常便饭了
因为任何类都是Object类的子类
public B(){
super();//调用父类的构造器这时候没有A的对象产生吗?
}
}
//A 的构造器同样
public class A(){
public A(){
super();//调用Object的构造器,这时候到底有没有Object对象产生呢?
}
}
所以要咬文嚼字的话就是确实产生了A对象和Object对象 只不过他们都在B对象里
这个问题提的真不错阿,让人思考经过多方查找,下面这几个观点还是普遍被认同的
第一种说法:
为什么super()在构造方法,super.fun()在方法能用?个人认为应该是super表示对象才能这么调用,可父类对象没被new 而如果是表示父类的话,那fun()应该是static方法啊?迷茫~~ 有些东西可以称为定义,不要钻牛角尖 super();表示调用父类的构造方法,只是调用方法,不构造对象。 第二种说法:
super是对父类的引用,但不是对父对象的引用(没有父对象这个说法),它不是一个对象,所以不能像this一样作为一个对象去使用。 第三种说法:
实际上,请一定注意super是关键字,我想可以说它是一种引用,但是肯定和普通的引用不同,
这个java文法中就完整地定义了super的语法。 其实,上面三种说法的意思都差不多,都表示只是调用父类的构造函数,并不创建对象。不足之处,还望大家指正阿
当一个类的实例化一个对象时,会产生类所描述的属性和方法的实例,它所包含的属性和方法是这个实例独自拥有的
如果这个类有父类,那么它会拥有父类所有可继承的属性和方法
在实例化时,通过调用构造方法,依次初始化父类的属性,并不是产生一个父类的实例(因为不是组合或聚合)综上所述,我认为只生成B的一个实例但如果public class B extends C{ // B是C(is-a)但不能说B拥有C(has-a)
Object obj = null;
Class A = null; B() {
obj = new Object();
A = new A();
}
}
这段代码就会产生3个实例。
所以new一个B类时 先会调用A类的构造方法
产生A B类的两个对象
,同样也包含OBJECT里的方法和属性
可以用SUPER调用A
public class B extends A(){
public B(){
super();//调用父类的构造器这时候没有A的对象产生吗?
}
}
//A 的构造器同样
public class A(){
public A(){
super();//调用Object的构造器,这时候到底有没有Object对象产生呢?
}
} 你调用了构造方法,但不产生对象?这怎么可能?
所以会有三个对象,只是A和Object的对象被包含在B对象里????
2.构造函数确实是在创建对象的时候调用,但是并不代表调用该构造就一定创建该构造所在对象吧? 真正的判断条件是 new 关键字.
3
子类对象会保存父类的私有属性,这是一定的,只不过子类不能直接访问,但可以通过super访问到。
那父类引用指向子类对象的时候,我们也可以用super去调用父类里面的方法和属性啊,所以在创建子类对象的同时还是应该会创建父类的对象吧