public class BaseSubDemo { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Base base=new Base();
Sub sub=new Sub(); }}
class Base{
public Base(){
System.out.println("Base init !");
}
}
class Sub extends Base{
public Sub(){
System.out.println("Sub init !");
}
}
程序执行后为什么会有打印两个Base init?当创建子类实例的时候,父类之前不是已经加载进来了吗,为什么还会打印一个Base init?求教.
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Base base=new Base();
Sub sub=new Sub(); }}
class Base{
public Base(){
System.out.println("Base init !");
}
}
class Sub extends Base{
public Sub(){
System.out.println("Sub init !");
}
}
程序执行后为什么会有打印两个Base init?当创建子类实例的时候,父类之前不是已经加载进来了吗,为什么还会打印一个Base init?求教.
Base init !
Sub init !所以,最终结果是Base init !
Base init !
Sub init !
是有2个
执行Sub sub=new Sub();程序会重新调用Base的构造方法不会引用第一个的
BaseSubDemo中的实例根本无法在Base或者sub 中引用
即使能引用 好像也会再给你重新加载一边 这个我就不太清楚了
你说的类变量只加载一次,指的是类变量属于类,不管你new多少个实例,类变量只有一个,供大家共享.而成员变量不同,你new几个实例,每个实例就会有一个自己成员变量的副本.你是这个意思吧?
我仔细想想,这个题应该是创建子类实例的时候,因为子类构造器一定调用父类的构造器,所以会打印一个Base init,然后调用自己的构造器,所以打印Sub init,加上第一句new了一个Base的实例,会打印一个Base init,所以一共三.无论Base还是Sub类,都只加载一次.如你所说"new 一个类实例时会初始化父类一直到 Object",而构造器不就是用来初始化实例的么,子类又一定调父类的构造器,所以打印结果如此.和加载无关,考察的只是"子类一定调用父类构造器"这个知识点.
不知道我理解的对不对?
Sub sub=new Sub(); --实例化Sub对象,因为继承了Base,所以它必须要继承调用父类的构造方法,因而要打印一下那句,然后再把自己的给打印出来…………
main()方法里第一个为:
Base base=new Base();
System.out.println("Base init !");
一条记录:Base init!
第二个:
Sub sub=new Sub();
注意它的类里会先默认调用super()[即先调用基类的构造方法];
所以是两条记录:Base init! 和Sub init!
共计三条记录。
LZ 可以把super()加进去,试一下!
public Base(){
System.out.println("Base init !");
}
第二样打印是:
public Sub(){
super();/*调用父类的所有方法,所以这里会
打印出一个:Base init !
这个super();是隐藏的,写不写的都一样,
所以父类没有加载两次。
System.out.println("Sub init !");
}
***初学者,分析的不好请见谅***
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Base base=new Base();
base.getInfo();
Sub sub=new Sub();}}
class Base{public void getInfo(){System.out.println("Base init !");}}
class Sub extends Base{
public Sub(){
System.out.println("Sub init !");
}
}
这样 就只有一个了
public Base(){
System.out.println("Base init !");
}
Sub sub=new Sub();这两句都会println一下!
Base init !,再打印Sub init !。