多层次继承,构造器之间的调用顺序!
import static java.lang.System.*; class Creature{ public Creature(){ out.println("Creature类无参数的构造器!"); } } class Animal extends Creature{ public Animal(){ out.println("Animal类无参数的构造器!"); } public Animal(String name){ out.println("Animal类一个参数的构造器:name="+name); } public Animal(String name,int age){ //-用this访问本类中一个参数的构造器 this(name); out.println("Animal类两个参数的构造器:name="+name+",age="+age); } } public class Wolf extends Animal{ public Wolf(){ //-用super限定访问父类中两个参数的构造器 super("张三",33); out.println("Wolf类无参数的构造器"); } public static void main(String[] args){ Wolf w=new Wolf(); } }
运行结果:
代码稍加改动后:
import static java.lang.System.*; class Creature{ public Creature(){ out.println("Creature类无参数的构造器!"); } } class Animal extends Creature{ public Animal(){ out.println("Animal类无参数的构造器!"); } public Animal(String name){ out.println("Animal类一个参数的构造器:name="+name); } public Animal(String name,int age){ //-用this访问本类中一个参数的构造器 this(name); out.println("Animal类两个参数的构造器:name="+name+",age="+age); } } public class Wolf extends Animal{ public Wolf(){ //-去掉:用super限定访问父类中两个参数的构造器 //super("张三",33); out.println("Wolf类无参数的构造器"); } public static void main(String[] args){ Wolf w=new Wolf(); } }
运行结果:
知识要点:
1、创建任何对象,总是从该类继承树最顶层类的默认构造器开始执行,然后依次向下执行,最后才执行本类的构造器。
2、如果某个类没有指定引用哪个构造器,则默认引用无参数的构造器,如果该类没有无参数的构造器,则编译报错,如下:。
import static java.lang.System.*; class Creature{ public Creature(){ out.println("Creature类无参数的构造器!"); } } class Animal extends Creature{ public Animal(String name){ out.println("Animal类一个参数的构造器:name="+name); } public Animal(String name,int age){ //-用this访问本类中一个参数的构造器 this(name); out.println("Animal类两个参数的构造器:name="+name+",age="+age); } } public class Wolf extends Animal{ public Wolf(){ //-去掉:用super限定访问父类中两个参数的构造器 //super("张三",33); out.println("Wolf类无参数的构造器"); } public static void main(String[] args){ Wolf w=new Wolf(); } }
编译报错:
热心技术,并兼吃喝,偶谈风月,不言国事.