今天做到了比较难的一道java笔试题,关于多态,继承的实际应用。

运行结果:

 1 package com.mao;
 2 
 3 class Base{
 4     int i = 99;
 5     public void amethod() {
 6         System.out.println("Base.amethod()");
 7     }
 8     Base(){
 9         System.out.println("我是父类的构造器。。。");
10         amethod();
11     }
12 }
13 public class Derived extends Base{
14      int i = -1;
15      Derived(){
16          System.out.println("我是子类的构造器。。。");
17      }
18     public static void main(String[] args) {
19         Base b = new Derived();
20         System.out.println(b.i);
21         b.amethod();
22     }
23     public void amethod() {
24         System.out.println("Derives.amethod()");
25     }
26 }

 

1. 主方法运行到Base b = new Derived();

子类的实例化,首先初始化父类Derived的构造方法,输出“我是父类的构造器。。。”

在父类的构造器中调用了amethod()方法,实际上是调用了子类重写父类的amethod()方法,输出"Derives.amethod()"

然后调用子类的构造器(如果子类没有构造器,编译时java虚拟机会自动添加空的构造器),输出“我是子类的构造器。。。”

2.System.out.println(b.i);

打印输出对象b的变量i的值,子类在继承父类时会继承父类的属性和方法(不包括私有和静态的方法),所以在子类中实际上有两个变量i,该语句的对象是父类的对象指向了子类的引用(向上转型),所以它输出的是父类的变量i的值。

3.b.amethod();

这句是调用子类重写的父类方法,因为方法是直接继承的,在子类中有两个变量i,但是只有一个方法amethod(),它是子类的方法。

注意:如果父类中有静态方法,那么出现向上转型时,调用静态方法是从父类调用,而不是子类。

========================================================================================

例如下面的实例:

 

 1 package com.mao;
 2 
 3 class Base2{
 4     public void amethod() {
 5         System.out.println("Base.amethod()");
 6     }
 7     public static void bmethod() {
 8         System.out.println("Base.bmethod()");
 9     }
10 }
11 public class exercise03 extends Base2{
12      exercise03(){
13          System.out.println("我是子类的构造器");
14      }
15     public static void main(String[] args) {
16         Base2 b = new exercise03();
17         b.amethod();
18         b.bmethod();
19     }
20     public void amethod() {
21         System.out.println("Derives.amethod()");
22     }
23     public static void bmethod() {
24         System.out.println("Derives.bmethod()");
25     }
26 }

 

 

 输出结果: