多态

多态性

Java 引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时的类型由声明时使用的类型决定,运行时的类型是由实际赋给该变量的对象决定。

如果编译时的类型和运行时不一致就会导致多态(Polymorphism [ˌpɒlɪ'mɔːfɪzəm] )。


class BaseClass {
    public String name = "zzs";

    public void base() {
        System.out.println("父类的普通方法!");
    }

    public void test() {
        System.out.println("父类被覆盖的方法!");
    }
}

public class SubClass extends BaseClass {
    public int name = 666;

    public void test() {
        System.out.println("这是子类覆盖父类的方法!");
    }

    public void sub() {
        System.out.println("子类普通方法!");
    }

    public static void main(String[] args) {
        BaseClass bc = new BassClass();
        System.out.println(bc.name);
        bc.base();
        bc.test();
        SubClass sc = new SubClass();
        System.out.println(sc.name);
        sc.sub();
        sc.test();
        BaseClass ploymophicBc = new SubClass();
        System.out.println(ploymophicBc.name);
        ploymophicBc.base();
        ploymophicBc.test();
        //ploymophicBc.sub(); //error

    }
}

java允许把一个子类对象直接赋给他的父类,而无需任何类型的转换,也叫向上转型(upcasting),向上转型由系统自动完成。

BaseClass ploymophicBc =new SubClass(); 这个引用变量编译时是BaseClass ,运行时是SubClass,运行时方法总是表现子类的特征,这就可能出现 相同类型的变量、调用不同方法时呈现不同的行为特征,这就叫多态。

上面注释的ploymophicBc.sub();会在编译时报错,虽然sub()确实是属于SubClass的,但是由于编译时是BaseClass类型的,所以无法报错。

与方法不同的是,对象的实例变量不具备多态性!

注意:

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

java

强制类型转换

基本类型之间的转换只能在数值类型之间转换。(数值类型指整数型、字符型、浮点型。)

引用类型之间的转换只能在具有继承关系的两个类型之间进行。如果不是继承关系编译时会报错。

.........

.........

使用继承的注意点

继承严重地破坏了父类的封装性。因为继承中,子类可以直接访问父类的成员变量和方法,从而造成了子类和父类的严重耦合。

尽量隐藏父类的内部数据,尽量把父类所有成员都设置成private类型。

不要使子类随意访问、修改父类方法。

尽量不要在父类构造器中调用将要被子类重写的方法。

本文导出文档下载地址:Download

Last modification:November 21st, 2020 at 10:18 pm
如果觉得我的文章对你有用,请随意赞赏