[b]
有如下一个关于类继承的例子,但是弄不清程序里的调用执行顺序,如何理解 new Wolf()这个语句来创建对象,因为平时都是用 Wolf W = new Wolf()这种格式来创建的。
class Creature
{
public Creature()
{
System.out.println("Creature 无参数的构造方法");
}
} class Animal extends Creature
{
public Animal(String name)
{
System.out.println("Animal 带一个参数的构造方法,该动物的name为" + name);
}
public Animal(String name, int age)
{
//使用this调用同一个重载的构造方法
this(name);
System.out.println("Animal 带两个参数的构造方法,其age为" + age);
}
} public class Wolf extends Animal
{
public Wolf()
{
//显式调用父类有两个参数的构造方法
super("土狼", 3);
System.out.println("Wolf无参数的构造方法");
}
public static void main(String[] args)
{
new Wolf();
}
}
有如下一个关于类继承的例子,但是弄不清程序里的调用执行顺序,如何理解 new Wolf()这个语句来创建对象,因为平时都是用 Wolf W = new Wolf()这种格式来创建的。
class Creature
{
public Creature()
{
System.out.println("Creature 无参数的构造方法");
}
} class Animal extends Creature
{
public Animal(String name)
{
System.out.println("Animal 带一个参数的构造方法,该动物的name为" + name);
}
public Animal(String name, int age)
{
//使用this调用同一个重载的构造方法
this(name);
System.out.println("Animal 带两个参数的构造方法,其age为" + age);
}
} public class Wolf extends Animal
{
public Wolf()
{
//显式调用父类有两个参数的构造方法
super("土狼", 3);
System.out.println("Wolf无参数的构造方法");
}
public static void main(String[] args)
{
new Wolf();
}
}
{
public Creature()
{
System.out.println("Creature 无参数的构造方法");//1
}
} class Animal extends Creature
{
public Animal(String name)
{
System.out.println("Animal 带一个参数的构造方法,该动物的name为" + name);//2
}
public Animal(String name, int age)
{
//使用this调用同一个重载的构造方法
this(name);
System.out.println("Animal 带两个参数的构造方法,其age为" + age);//3
}
} public class Wolf extends Animal
{
public Wolf()
{
//显式调用父类有两个参数的构造方法
super("土狼", 3);
System.out.println("Wolf无参数的构造方法");//4
}
public static void main(String[] args)
{
new Wolf();
}
}
public Creature()
{
System.out.println("Creature 无参数的构造方法");
}
这个方法里面咯。然后就是依次打印了。
System.out.println("Creature 无参数的构造方法");
System.out.println("Animal 带一个参数的构造方法,该动物的name为" + name);
System.out.println("Animal 带两个参数的构造方法,其age为" + age);
System.out.println("Wolf无参数的构造方法");
就是创建一个Wolf实例
Wolf W = new Wolf()
创建一个Wolf实例,并将实例引用给W.因为面试官想考你的是执行过程。所以省略Wolf W = ...,因为new Wolf()就足够达到执行Wolf构造函数的目的。执行过程,所有类在构造时都会默认先调用父类的构造。
据上,所以执行过程为
1、System.out.println("Creature 无参数的构造方法");
2、System.out.println("Animal 带一个参数的构造方法,该动物的name为" + name);
3、System.out.println("Animal 带两个参数的构造方法,其age为" + age);
4、System.out.println("Wolf无参数的构造方法");
如果一个对象只使用一次,那么就可以将其定义为匿名对象。匿名对象比正常的实例化对象少了一个栈内存的引用关系,所以匿名对象是一个只开辟了堆内存的实例对象。
Animal 带一个参数的构造方法,该动物的name为土狼
Animal 带两个参数的构造方法,其age为3
Wolf无参数的构造方法
new wolf()表示创建一个无名实例,与wolf w=new wolf();等效
static{System.out.println("静态代码块执行...");}
{System.out.println("非静态代码块执行...");}
public Super(){System.out.println("父类无参构造执行...");}
public Super(int test){System.out.println("父类全参构造执行...");}
}
class Sub extends Super{
public Sub(){System.out.println("子类无参构造执行...");}
public Sub(int test){System.out.println("子类全参构造执行...");}
}
class SubTest extends Super{
public SubTest(){//子类无参构造,显调父类有参构造
super(1);
System.out.println("子类无参构造执行");}
public SubTest(int test){
super(1);
System.out.println("子类全参构造执行...");
}
}
public class Test{
public static void main(String[] args) {
// 实例化子类,无参构造
Sub s=new Sub();
//实例化子类,全参构造
Sub s1=new Sub(1);
System.out.println("********华丽分割线********");
//实例化子类,无参构造
SubTest ts=new SubTest();
//实例化子类,全参构造
SubTest ts1=new SubTest(1);
}
}输出:
静态代码块执行...
非静态代码块执行...
父类无参构造执行...
子类无参构造执行...
非静态代码块执行...
父类无参构造执行...
子类全参构造执行...
********华丽分割线********
非静态代码块执行...
父类全参构造执行...
子类无参构造执行
非静态代码块执行...
父类全参构造执行...
子类全参构造执行...看看吧,执行的顺序和调用方法不同的问题...