新手看Java中的多态

版权声明:随意转载 https://blog.csdn.net/bigcupwater/article/details/76283991

多态?

Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism)

  这是Java疯狂讲义上对多态的解释,头一次看看得我头皮发麻。这……都哪跟哪啊,完完全全感受不到一丁点多态的味道。下面就用大白话说一说我理解的多态。
  简单翻译一下这个定义,就是说我们在定义一个对象的时候,形如A name = new B();(前提B是A的子类),这个时候你会看见左边name的类型是A,但是调用的却是B的构造方法。对照定义,左边的A就是所谓的编译时类型,也就是没运行的时候的类型,而B就是运行时类型了(运行的时候呈现出的类型)。这里可以简单粗暴的理解为左边是编译时类型,右边是运行时类型。左右不一致就是出现多态的前提之二(存在继承算是一个前提之一),这就是编译时类型和运行时类型不一致。
  这就多态了?没看出来啊?嗯,这还是看不出来哪多态了,还没有开始实现多态呢。但我们还得知道实现多态还需要一个前提,那就是子类重写父类的方法。

重写:

子类写了一个和父类一毛一样的方法,方法体内部和父类不一样(也可以一样,但一样还写个毛啊,直接调用父类的不就完了吗)。它有一个标记“@Override“,这个标志就说明方法是重写的。

前提满足之后,我举个栗子表演一波多态:

// 父类,工作方法:退休
public class Father {
    public void work() {
        System.out.println("我退休了");
    }
}

// 儿子,继承父类,工作方法:上班
public class Son extends Father{
    @Override  // 我是重写标记
    public void work() {
        System.out.println("我要上班");
    }
}

// 女儿,继承父类,工作方法:睡觉
public class Dot extends Father{
    @Override  // 我是重写标记
    public void work() {
        System.out.println("我要睡觉");
    }
}

// 多态测试
public static void main(String[] args) {
        // 编译时类型和运行时类型不一致,左右不一样嘛
        Father man = new Son(); 
        Father Faman = new Dot();

        man.work(); // 输出“我要上班”
        Faman.work();  // 输出“我要睡觉”
}

  多态了?对,多态了,因为我们定义的引用变量 man 和 Faman 都是 Father 类型的,但是调用work方法时却得到了不同的结果。这就是多态,引用变量的类型都一样,但是因为用了不同的构造方法去实例化,在调用同一个方法时得到了不同的结果。
  


多态必须满足的三大条件:

1.存在继承关系(右边我们用的构造方法必须不一样,这个构造方法可以属于自己或者自己的子类
2.类重写父类的方法
3.父类的引用类型指向子类(左右类型不一致)

总结

  总结下来就是,父类定义的变量根据引用的子类对象,在调用子类重写父类的方法时是调用的子类里的方法,因为重写后子类里的方法实现都不一样,所以得到了不同的结果。当然,你都写一样了。。。那你是真皮沙发。

猜你喜欢

转载自blog.csdn.net/bigcupwater/article/details/76283991