Java之-多态

一.Java中多态的定义

  1.体现出多态的前提必须要有子父类关系,或者是类实现接口的关系

  2.多态的最终体现就是:父类引用指向子类对象;父类引用调用方法时,如果子类重写了该方法,会调用子类重写后的方法,如若没有重写该方法,会调用父类中的方法(成员方法,在编译时,会检索父类,如果父类中有该方法,编译成功!运行时会优先运行子类重写后的方法)。例:   

package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:55 2018/04/22
 */
public class Father {

    public void test_01(){
        System.out.println("Father");
    }
}
package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:56 2018/04/22
 */
public class Son extends Father{
    //重写父类的方法
    public void test_01() {
        System.out.println("Son");
    }
}
package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:58 2018/04/22
 */
public class Test {
    public static void main(String[] args){
        //父类引用指向子类对象
        Father f = new Son();
        //使用父类引用调用子类重写后的方法,以下打印结果为Son
        f.test_01();
    }

}

注释掉子类重写后的方法,再次调用,如下:

package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:56 2018/04/22
 */
public class Son extends Father{

    //重写父类的方法
    /*public void test_01() {
        System.out.println("Son");
    }*/
}
package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:58 2018/04/22
 */
public class Test {
    public static void main(String[] args){
        //父类引用指向子类对象
        Father f = new Son();
        //由于子类没有重写该方法,所以调用父类的方法,打印结果为Father
        f.test_01();

    }

}

二.成员变量的特点

  成员变量,编译的时候检索父类,父类中有,编译成功;运行时,也会运行父类中的成员变量的值,例:

package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:55 2018/04/22
 */
public class Father {

    //父类中的成员变量a
    int a = 100;

    public void test_01(){
        System.out.println("Father");
    }
}
package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:56 2018/04/22
 */
public class Son extends Father{

    //子类中的成员变量a
    int a = 1;

    //重写父类的方法
    public void test_01() {
        System.out.println("Son");
    }
}
package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:58 2018/04/22
 */
public class Test {
    public static void main(String[] args){
        //父类引用指向子类对象
        Father f = new Son();

       //使用父类引用调用成员变量,打印结果为100
        System.out.println(f.a);

    }

}


三.instanceof关键字

  instanceof是一个比较运算符,判断一个引用类型是否属于某个类型(要有继承或实现关系)的对象,例:

package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:58 2018/04/22
 */
public class Test {
    public static void main(String[] args){
        //父类引用指向子类对象
        Father f = new Son();
        
        //判断f 是否是Father类型的对象,返回的是boolean值,以下打印结果为true
        boolean b = f instanceof Father;
        System.out.println(b);

    }

}


四.多态中的向上、下转型

  Java中,父类引用指向子类对象,已经做了自动类型提升,将子类 类型提升为父类,这就是向上转型。但有时候,我们要用到子类中特有的方法,就需要向下转型。例:

package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:56 2018/04/22
 */
public class Son extends Father{

    //重写父类的方法
    public void test_01() {
        System.out.println("Son");
    }

    //子类中特有的方法
    public void son(){
        System.out.println("我是子类");
    }
}
package com.xiao.variable;

/**
 * @Author 笑笑
 * @Date 19:58 2018/04/22
 */
public class Test {
    public static void main(String[] args){

       //父类引用指向子类对象
        Father f = new Son();

        //向下转型,要强制转换
        Son s = (Son) f;

        //子类对象调用子类特有的方法,打印结果为“我是子类”
        s.son();


    }

}



 



猜你喜欢

转载自blog.csdn.net/u012430402/article/details/80042211