今天做到了比较难的一道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 }
输出结果:

浙公网安备 33010602011771号