父类构造器含有子类方法

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 }

 

posted @ 2013-03-04 21:37  hi_stefen  Views(256)  Comments(0)    收藏  举报