java中多态的小例子

来源:互联网 发布:域名查询 美橙互联 编辑:程序博客网 时间:2024/06/05 04:03


class BaseClass
{
public int book = 6;
public void base(){
System.out.println("父类的普通方法");
}
public void test(){
System.out.println("父类的被覆盖的方法");
}
}




 class SubClass extends BaseClass{
public String book = "Thingking in Java";
public void test(){
System.out.println("子类的覆盖父类的方法");
public void sub(){
System.out.println("子类的普通方法");
}
}


public class SubClassDemo{
public static void main(String[] args)
{
BaseClass bc = new BaseClass();
bc.base();
bc.test();
SubClass sc = new SubClass();
sc.base();
sc.test();
BaseClass ploymophicBc = new SubClass();//向上转型
System.out.println(ploymophicBc.book);//成员变量编译运行都看左边
ploymophicBc.base();//成员函数编译看左边,运行看右边
ploymophicBc.test();
//ploymophicBc.sub(); 编译会不通过
}
}


运行结果:
父类的普通方法
父类的被覆盖的方法

父类的普通方法
子类的覆盖父类的方法

6
父类的普通方法
子类的覆盖父类的方法




ploymophicBc比较特殊,在编译时类型是Baseclass,运行时类型是Subclass,当调用该引用变量的test()方法时,实际上执行的是Subclass中覆盖后的test()方法。

引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。

与方法是不同的是,对象的实例变量不具备多态性System.out.println(ploymophicBc.book);并不是输出Subclass里定义的实例变量。


老毕Java视频中这样总结的:

在多态中成员函数的特点:编译看左,运行看右
在编译时:参阅引用型变量所属的类中是否有调用的方法。如果有,则编译通过。没有则不通过。
在运行时:参阅对象所属的类中是否有调用的方法。

在多态中成员变量的特点:全都看左
无论编译还是运行,都参看左边(引用型变量所属的类)

0 0
原创粉丝点击