父类构造器含有子类方法
Demo1:
1 class Base 2 { 3 //定义了一个名为i的实例变量 4 private int i = 2; 5 public Base() 6 { 7 //直接输出this.i 8 System.out.println(this.i); 9 this.display(); 10 //输出this实际的类型,将看到输出Derived 11 System.out.println(this.getClass()); 12 //因为this的编译类型是Base,所以依然不能调用sub()方法, 13 //this.sub(); 14 } 15 public void display() 16 { 17 System.out.println(i); 18 } 19 } 20 //继承Base的Derived子类 21 class Derived extends Base 22 { 23 //定义了一个名为i的实例变量 24 private int i = 22; 25 //构造器,将实例变量i初始化为222 26 public Derived() 27 { 28 i = 222; 29 } 30 public void display() 31 { 32 System.out.println(i); 33 } 34 public void sub(){} 35 } 36 public class Test3 37 { 38 public static void main(String[] args) 39 { 40 //创建Derived的构造器创建实例 41 new Derived(); 42 } 43 }
输出:

1、当用子类构造器创建实例时,首先会调用的是父类的构造器
2、在.java文件编译成.class文件后,构造器前的定义初始化和初始化块会放入到构造器中,即执行构造器的时候那些变量已经初始化了
3、父类构造器含有子类的方法;同时调用子类的构造器来创建实例对象,发生编译类型和执行类型不一致的时候。此时,访问引用变量由编译类型决定,访问引用方法由执行类型决定,上述例子:Base this = Derived
Dome2:
1 class Animal 2 { 3 //desc实例变量保存对象toString方法的返回值 4 private String desc; 5 public Animal() 6 { 7 //调用getDesc()方法初始化desc实例变量 8 this.desc = getDesc(); 9 } 10 public String getDesc() 11 { 12 return "Animal"; 13 } 14 public String toString() 15 { 16 return desc; 17 } 18 } 19 public class Wolf extends Animal 20 { 21 //定义name、weight两个实例变量 22 private String name; 23 private double weight; 24 public Wolf(String name , double weight) 25 { 26 //为name、weight两个实例变量赋值 27 this.name = name; 28 this.weight = weight; 29 } 30 //重写父类的getDesc()方法 31 @Override 32 public String getDesc() 33 { 34 return "Wolf[name=" + name + " , weight=" 35 + weight + "]"; 36 } 37 public static void main(String[] args) 38 { 39 System.out.println(new Wolf("灰太郎" , 32.3)); 40 } 41 }
输出:

1、父类构造器含有子类override的方法;同时调用子类的构造器来创建实例对象。首先执行父类的构造器,此时调用子类的方法,而子类的变量成员此时都没有初始化
修改:toString方法,需要装换成字符串的时候自动调用,这点跟C有区别
1 class Animal2 2 { 3 public String getDesc() 4 { 5 return "Animal"; 6 } 7 //public String toString() 8 //{ 9 // return getDesc(); 10 //} 11 } 12 public class Wolf2 extends Animal2 13 { 14 //定义name、weight两个实例变量 15 private String name; 16 private double weight; 17 public Wolf2(String name , double weight) 18 { 19 //为name、weight两个实例变量赋值 20 this.name = name; 21 this.weight = weight; 22 } 23 //重写父类的getDesc()方法 24 @Override 25 public String getDesc() 26 { 27 return "Wolf[name=" + name + " , weight=" 28 + weight + "]"; 29 } 30 public static void main(String[] args) 31 { 32 System.out.println(new Wolf2("灰太郎" , 32.3)); 33 } 34 }

浙公网安备 33010602011771号