Java 面向对象 --多态性

1,方法的重载和重写;

2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现

父类Animal:

package com.java1234.chap03.sec13;
 
public class Animal {
 
    public void say(){
        System.out.println("我是一个动物");
    }
}

再搞两个子类,分别是Dog和Cat类,重写父类方法say:

package com.java1234.chap03.sec13;
 
public class Cat extends Animal{
 
    public void say(){
        System.out.println("我是一个猫");
    }
}
package com.java1234.chap03.sec13;
 
public class Dog extends Animal{
 
    public void say(){
        System.out.println("我是一个狗");
    }
}

然后我们写个Test测试类:

package com.java1234.chap03.sec13;
 
public class Test {
 
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.say();
         
        Cat cat=new Cat();
        cat.say();
    }
}

运行输出:

我是一个狗

我是一个猫

 下面我来用多态测试,父类引用指向子类具体实现:

package com.java1234.chap03.sec13;
 
public class Test {
 
    public static void main(String[] args) {
        // 父类引用指向Dog子类的具体实现
        Animal animal=new Dog();
        animal.say();
         
        // 更换实现
        animal=new Cat();
        animal.say();
    }
}

运行输出:

我是一个狗

我是一个猫

 

对象的转型:

向上转型:子类对象->父类对象 安全

向下转型:父类对象->子类对象 不安全

比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上  Animail animal 转型  是安全的;

package com.java1234.chap03.sec13;
 
public class Test {
 
    public static void main(String[] args) {
        // 父类引用指向Dog子类的具体实现
        Animal animal=new Dog();
        animal.say();
         
        // 向下转型
        Dog dog=(Dog) animal;
        dog.say();
         
        // 向下转型  因为animal指向的是Dog具体实现 所以会报错
        Cat cat=(Cat)animal;
        cat.say();
    }
}

运行报错:

我是一个狗

我是一个狗

Exception in thread "main" java.lang.ClassCastException: com.java1234.chap03.sec13.Dog cannot be cast to com.java1234.chap03.sec13.Cat

at com.java1234.chap03.sec13.Test.main(Test.java:15)

转换异常 所以说向下转型是不安全的,我们必须知道具体的实现类;

我们上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:

我们再写一个实例:

我们先建一个父类接口People:

package com.java1234.chap03.sec13;
 
public interface People {
 
    public void say();
}

接下来写两个具体实现类,Student Teacher:

package com.java1234.chap03.sec13;
 
public class Student implements People{
 
    @Override
    public void say() {
        System.out.println("我是学生");
    }
 
}
package com.java1234.chap03.sec13;
 
public class Teacher implements People{
 
    @Override
    public void say() {
        System.out.println("我是老师");
    }
 
}

我们来写一个测试类:

package com.java1234.chap03.sec13;
 
public class Test2 {
 
    public static void main(String[] args) {
        People p1=new Student();
        p1.say();
         
        p1=new Teacher();
        p1.say();
    }
}

运行输出:

我是学生

我是老师

 

猜你喜欢

转载自www.cnblogs.com/xyg-zyx/p/9827207.html