java多态详解

什么是多态?

​ 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用变量调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
java引用变量有两种类型:一种是编译时类型,一种是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定,如果编译时类型和运行时类型不一致,就可能导致所谓的多态。

多态的优点?

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的条件

  • 继承
  • 重写
  • 父类引用指向子类对象

例子

测试代码:

package ExtendLearn;

public class Test extends Basic{
    public int book=7;
    public void test()
    {
        System.out.println("子类覆盖父类的方法");
    }
    public void sub()
    {
        System.out.println("子类的普通方法");
    }

    public static void main(String[] args) {
        Basic d=new Test();
        d.base();
        d.test();
        d.sub();
        System.out.println(d.book);
    }
}
class Basic{
    public int book=6;
    public void base()
    {
        System.out.println("父类的普通方法");
    }
    public void test()
    {
        System.out.println("父类的被覆盖的方法");
    }
}

在调用d.sub()会爆红,因为basic类中没有sub方法;
注释掉该调用后得到下面结果
在这里插入图片描述
说明了子类中已经完成了对父类方法的重写,所以我们调用时会输出子类覆盖父类的方法,但是输出book是6,说明实例对象并没有被覆盖。
这个地方还没有彻底搞明白底层是怎么搞得,但是多态可以从这个程序中看出来,编译的时候由声明该变量时的类型决定,而实际运行时,由赋给该变量的对象决定,这就是一种方法的多态。

多态的实现方法

  • 重写
  • 接口
  • 抽象类和抽象方法

instanceof

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:
boolean result = obj instanceof Class /* 其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。   注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。 */

你可能感兴趣的:(java,java多态)