Java面向对象:初识多态

1、多态

多态是面向对象编程的三大基本特性之一。多态指的是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

多态实现条件:

1、继承关系的存在

2、方法的重写

3、父类引用调用重写的方法

例子:

class Animal {
    public void eat() {
        System.out.println("Animal在吃饭");
    }
}

class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("Dog在吃狗粮");
    }
}
class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("Cat在吃猫粮");
    }
}
public class Test {
    public static void eat(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();

        eat(dog);
        eat(cat);
    }
}

输出:

Dog在吃狗粮
Cat在吃猫粮

2、向上转型

向上转型是子类对象赋值给父类引用变量,实际就是创建一个子类对象,将其当作父类对象来使用。

格式:

父类类型 对象名 = new 子类类型

Animal animal = new Dog();

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    @Override
    public void eat(){
        System.out.println(name + "在吃狗粮");
    }
}
public static void main(String[] args) {
    // 显式创建子类对象,然后隐式地赋值给父类引用:
    Dog dog = new Dog("小白",5);
    Animal an;
    an = dog;
    dog.eat();

    // 直接在声明和初始化时隐式地赋值给父类引用
    Animal animal = new Dog("小黄",5);
    animal.eat();
}

输出:

小白在吃狗粮
小黄在吃狗粮

3、向下转型

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    @Override
    public void eat(){
        System.out.println(name + "在吃狗粮");
    }
    public void bark(){
        System.out.println(name + "在叫");
    }
}

public static void main(String[] args) {
    Animal animal = new Dog("小黄",5); // 隐式向上转型

    // 向下转型:检查animal是否是Dog的实例,然后显式转换
    if (animal instanceof Dog) {
        Dog dog = (Dog) animal; // 显式向下转型
        dog.bark(); // 调用Dog类特有的方法
    }
}

输出:

小黄在叫

4、重写

重写(Override)是指子类重新定义或实现了父类中已有的方法。当子类继承一个父类时,它可以通过重写父类的方法来改变该方法的实现方式,以适应子类自己的需求。

4.1、子类需维持父类方法原型

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    @Override
    public void eat(){
        System.out.println(name + "在吃狗粮");
    }
}

4.2、子类重写应维持或提升访问权限

访问权限大小:public > protected > default(默认) > private

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    } 
    @Override
    protected void eat(){ // 此处的访问权限比父类低,程序无法执行
        System.out.println(name + "在吃狗粮");
    }
}

4.3、父类静态、私有方法及构造方法的非重写特性

例子:

class Animal {
    String name;
    int age;
    // 静态方法
    public static void staticMethod() {
        System.out.println("Animal的静态方法");
    }
    // 私有方法
    private void privateMethod() {
        System.out.println("Animal的私有方法");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    // 静态方法不能在实例方法中直接重写,但可以在子类中定义同名静态方法  
    // 这只是隐藏了父类的静态方法,而不是重写  
    public static void staticMethod() {
        System.out.println("Dog的静态方法");
    }
}
  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值