Java-多态

来源:互联网 发布:svn迁移到linux 编辑:程序博客网 时间:2024/06/04 19:24

今天再看Java的多态,多了好久终于有点明白了,记录一下自己的理解

首先要说的是Java的继承,子类继承父类,拥有父类的方法,所以有时说子类是一种特殊的父类,下面来实现两个类

//实现父类public class BaseClass {    public int book = 6;//父类book    public void base() {        System.out.println("Parent Method");    }    public void test() {        System.out.println("Overrid Parent");    }}//实现子类public class SubClass extends BaseClass {    public String book = "Java EE";//子类book    public void test() {        System.out.println("Sub Overrid Class");    }    public void sub() {        System.out.println("Sub Method");    }}

然后我们来测试一下

public class PolyTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        BaseClass bClass = new BaseClass();        System.out.println(bClass.book);        bClass.base();        bClass.test();    }}

我们编译类型和运行类型是一样的,所以输出的结果是我们预料的结果。

6Parent MethodOverrid Parent

但是如果我们这样定义一个

        BaseClass ploy = new SubClass();        System.out.println(ploy.book);        ploy.base();        ploy.test();        //ploy.sub();不能调用这个方法

输出结果是下面

6Parent MethodSub Overrid Class

子类是一种特殊的父类,当我们将子类类型赋给父类类型是,我们不需要强制转换,或者说系统自动完成了转换。此时ploy的编译类型是BaseClass,但是运行类型是SubClass。意思就是说我们调用方法时只能调用BaseClass中的方法,但是在运行过程中(当你点击了Run)调用的却是SubClass中的方法,例如,我们调用test();方法时,输出的是“Sub Overrid Class
”。然而当我们要调用sub()方法时,就会报错,尽管可以通过某种方式来调用,但是不能直接调用,因为ploy的类型时BaseClass。ploy和bClass 的编译类型一样,但是调用test()方法时输入的不一样,也就是说,相同类型的变量,调用通过一个方法是呈现出多种不同的行为特征,这就是多态。
与方法不同的是,对象的实例变量则不具备多态性,我们看到book输出的是BaseClass里的实例变量。

引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行至则执行他运行时类型的方法,因此,引用变量只能调用生命该变量是所用类里
包含的方法。

0 0
原创粉丝点击