认识多态~

多态

1. 实现多态需要具备哪些条件?

   (1) 发生向上转型
   (2) 需要方法的重写

1.1 什么是向上转型?

   所谓的向上转型,就是将子类对象给到父类对象,换句话说,就是父类引用了当前对象的子类。

向上转型有三种方式:

(1) 直接赋值

public class Animal {
    public String name;
    public int age;

    public Animal(String name){
        this.name = name;
        this.age = age;
    }
}    
class Dog extends Animal{
    public Dog(String name,int age){
        super(name, age);
    }
}
class Test{
    public static void main(String[] args) {
        Dog dog = new Dog("旺财",3);//正常的实例化Dog对象
        Animal animal = new Dog("旺财",4);//发生了向上转型的Dog对象
    }
}

   上面这段代码,定义了一个父类Animal,一个子类Dog继承自Animal,在下面main函数中,第一行实例化了一个Dog对象,第二行就是一个实现了向上转型的Dog对象,即将子类Dog对象给到父类Animal对象。这就是向上转型的第一种形式直接赋值

(2) 作为方法的参数进行传递

class Test{
public static void func(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog("旺财",3);//发生了向上转型的Dog对象
        Dog dog2 = new Dog("阿黄",4);//发生了向上转型的Dog对象
        func(dog1);
        func(dog2);
    }
}
输出结果:
旺财正在吃饭.....
阿黄正在吃饭.....

   上面这段代码中,定义了一个func()方法,形参为父类型的引用,可以任意接收子类对象。这种就是让父类型作为方法的参数进行传递的向上转型

(3) 作为返回值类型

class Test{
public static Animal func2(){
        Dog dog = new Dog("旺财",3);
        return dog;
    }
public static void main(String[] args) {
        Animal animal3 = func2();
    }
}

   func2的返回值类型为父类型,当调用func2时,可以用Animal的对象接收。

1.2 什么是方法的重写?

   当父类有一个方法时,子类的需求这个方法不能满足,子类就需要对父类的方法进行重写。

1.2.1 方法重写要符合三个要求:
(1)方法名相同
(2)参数列表相同(数据类型,顺序,个数)
(3)返回值类型相同
public class Animal {
   
    public void eat(){
        System.out.println(name + "正在吃饭.....");
    }
}
class Dog extends Animal{
   @Override
    public void eat() {
        System.out.println(name + "正在吃狗粮.....");
    }
}

   父类Animal中有一个eat方法,在Dog子类中对eat方法进行了重写。

1.2.2 重写的注意事项

(1)被 private, static, final修饰的方法不能被重写
(2)子类中被重写的方法的访问权限要大于等于父类,比如父类是public,子类必须是public,父类是protected,子类可以是protected,也可以是public

2. 什么是多态?

2.1 多态的定义

   所谓多态,就是一种事物的不同结果,简单来说就是同一件事情,发生在不同对象身上,就会产生不同的结果。

public class Book {
    public String name;
    public int Date;

    public void type(){
        System.out.println("这本书叫做:"+ name);
    }
}
class English extends Book{
    @Override
    public void type() {
        System.out.println("这是一本英语书");
    }
}
class Chemistry extends Book{
    @Override
    public void type() {
        System.out.println("这是一本化学书");
    }
}
class Test {
    public static void func(Book book){
    book.type();
}
    public static void main(String[] args) {
        Book book1 = new English();
        Book book2 = new Chemistry();
        func(book1);
        func(book2);
    }
}
输出结果:
这是一本英语书
这是一本化学书

此时book这个引用,引用的对象不同,当使用不同的对象调用type方法时,会出现不同的结果,这就叫做多态


2.2 多态的优缺点

优点

多态可以降低 圈复杂度,(圈复杂度就是条件分支语句,循环语句的个数)
多态的扩展能力强

缺点:
成员变量没有多态性
构造方法没有多态性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值