1.下边的程序运行结果是什么?
2.你如何解释会得到这样的输出?
3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?
源代码:
package duotai;
class Parent
{
public int myValue=100;
public void printmyValue()
{
System.out.println("Parent.myValue,myValue="+myValue);
}
}
class Child extends Parent {
public int myValue=200;
public void printmyValue()
{
System.out.println("Child.printmyvalue,myValue="+myValue);
}
}
public class ParentChildTest{
public static void main(String[]args)
{
Parent p=new Parent(); //定义对象并使对象指向引用p
p.printmyValue(); //引用调用方法
Child c=new Child();
c.printmyValue();
p=c; //引用子类引用,调用方法时也是调用子类方法
p.printmyValue(); //输出200
p.myValue++;
p.printmyValue();
((Child)p).myValue++;
((Child)p).printmyValue();
}
}
实验结果截图:
解释输出结果:
- 第一个输出是Parent类的引用调用其方法从而输出myValue的值100.
- 第一个输出是Child类的引用调用其方法从而输出myValue的值200.
- 第三个输出200,是由于Parent类的引用对象p引用Child类的引用对象c,因此p调用printmyValue()方法来自于Child类,故输出结果是200
- 第三个输出200,是由于
- 第五个输出201,是由于基类对象通过(Child)p从而赋给子类对象,故(Child)p调用printmyValue时调用的是Child的方法,从而输出201.
Java语法特性:
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
请使用javap查看编译器为TestPolymorphism.java生成的字节码指令,然后通过互联网搜索资料,尝试从底层开始理解Java编译器是如何为多态代码生成字节码指令,在程序运行过程中,多态特性又是如何实现的。
class Parent
{
public int value=100;
public void Introduce()
{
System.out.println("I'm father");
}
}
class Son extends Parent
{
public int value=101;
public void Introduce()
{
System.out.println("I'm
son");
}
}
class Daughter extends Parent
{
public int value=102;
public void Introduce()
{
System.out.println("I'm
daughter");
}
}
public class
TestPolymorphism
{
public static void main(String args[])
{
Parent p=new Parent();
p.Introduce();
System.out.println(p.value);
p=new Son();
p.Introduce();
System.out.println(p.value);
p=new Daughter();
p.Introduce();
System.out.println(p.value);
}
}
结果:
I'm
father
100
I'm son
100
I'm daughter
100
用多态的方法模拟ATM操作
结果截图: