Java-9 多态与重写

介绍多态,需要先了解向上转型与方法的重写

一、向上转型(多态的前提)

1、概念

实际上就是创建一个子类对象,把它当做父类对象来使用。

就是常规写法是Cat cat = new Cat( );

现在写成 Animal animal = new Cat( );

2、语法

父类类型 对象名 = new 子类类型( );

eg. Animal animal = new Cat( );

3、案例演示

比如有一个Animal类,现在有一个Cat类继承了Animal类,我们可以实例化一个Cat对象,但父类Animal引用这个对象。

class Animal{
    String name;
    int age;
}
class Cat extends Animal{
    
}
public class TestDemo {
    public static void main(String[] args) {
        Cat cat = new Cat(); //实例化一个cat
        Animal animal = cat; //父类Animal引用了子类Cat的对象
    }
}

也可以直接写成

 Animal animal  = new Cat();

4、访问权限

即使父类引用了子类的对象,依然只能访问父类自己的属性/方法

 

向上转型的优点:让代码实现更简单灵活

向上转型的缺点:不能调用子类特有的属性和方法 

5、使用场景

1、直接赋值

Animal animal = new Cat("mimi"); 

2、方法的参数

public class TestDemo {
    public void eat(Animal animal){  //形参为父类引用,可以接收任意子类的对象
        animal.eat();
    }
}

3、方法的返回值 

public Animal buyAnimal(String var){  //返回任意子类对象
        if("狗" == var){
            return new Dog();
        } else if ("猫" ==var) {
            return new Cat();
        }else {
            return null;
        }
    }

二、重写(多态的基础)

 1、概念:

子类与父类方法的名称,返回值,参数列表都相同,被称为方法的重写

2、案例演示

在父类Animal类中有一个eat( )方法,在Cat( )中又写了一个eat( )方法,并且它们的名称,返回值,参数列表都相同,则eat( )方法发生了重写

class Animal{
    public void eat(){
        System.out.println("吃食物");
    }
}
class Cat extends Animal{
    public void eat(){ //重写了父类的eat方法,让小猫吃猫粮
        System.out.println("吃猫粮");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Animal animal  = new Cat();
        animal.eat();//使用animal调用eat()方法,显示吃猫粮
    }
}

 使用animal调用eat()方法,显示吃猫粮

 3、动态绑定

在编译的时候,还是Animal的eat( )方法,但在运行的时候,就变成了Cat的eat( )方法,因此被称为运行时绑定

 重载:函数或者方法有相同的名称,但参数列表不同的。它是静态绑定的,在编译时就已经被赋值了

4、注意

静态方法不能被重写

 private方法不能被重写

被final修饰的方法不能被重写

子类的访问修饰限定符应该大于等于父类 

访问修饰限定符:public > protected > 包访问权限 > private

三、多态

1、概念

多态是一种思想,同一个方法,因为调用这个方法的引用,引用对象不同,所执行的行为也是不一样的。

2、案例演示

在Animal类中写一个eat( )方法,然后我们在Cat类和Dog类中都重写一个eat( )方法,想要猫吃猫粮,狗吃狗粮,这样因为调用者不同,产生不同的结果,我们称之为多态

在Cat类和Dog类中重写eat( )方法:

class Animal{
   public void eat(){
        System.out.println("吃食物");
    }
}
class Cat extends Animal{
    public void eat(){
        System.out.println("吃猫粮");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("吃狗粮");
    }
}

分别调用Cat类和Dog类

public class TestDemo {
    public static void main(String[] args) {
        Animal animal1  = new Cat();
        animal1.eat(); //animal1引用cat
        Animal animal2 = new Dog();
        animal2.eat();//animal1引用dog
    }
}

结果:

猜你喜欢

转载自blog.csdn.net/benxiangsj/article/details/129544276