java中的多态

目录

一、多态定义

二、多态实现条件

三、多态格式

四、重写

五、重写快捷操作

六、向上转型和向下转型 


一、多态定义

多态是指同一个行为具有不同表现形式或形态的能力。例如:猫和狗都会吃饭,但猫是吃猫粮,狗是吃狗粮,这就是同一个行为,但具有不同的表现形式。

二、多态实现条件

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写(子类对父类中的某些方法进行重新定义)

3. 通过父类的引用调用重写的方法  

三、多态格式

父类类型 变量名=new 子类类型();
变量名.方法名();//调用在子类中重写的方法

例:

//父类
public 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+"正在吃饭!!!");
    }
}
//狗类
public class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

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

    @Override
    public void eat() {
        System.out.println(name+"正在吃猫粮!!!");
    }
}
//
public class Main {
    public static void main(String[] args) {
        Animal dog=new Dog("旺财",3);
        dog.eat();
        Animal cat=new Cat("小黑",2);
        cat.eat();
    }
}

结果如下:

上述代码,dog.eat()和cat.eat()分别是由Dog和Cat这两个实际类型new出来的,因此, dog.eat()调用的是子类Dog中重写的方法,cat.eat()调用的是子类Cat中重写的方法.

四、重写

重写:也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。

重写规则:

1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致

2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的

3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected

4.父类被static、private修饰的方法、构造方法都不能被重写。

五、重写快捷操作

 在子类中右键选择生成

然后选择重写方法

六、向上转型和向下转型 

 1、向上转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。(儿子变父亲)。

语法格式:

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

 例:

Animal dog=new Dog("旺财",3);

Animal是父类类型,但是可以引用子类对象。

父类是大范围的类型,子类是小范围,所以子类向上转型是自动转换。

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

向上转型的缺陷:不能调用到子类特有的方法。

2、向下转型

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。

语法格式:

子类类型 对象名=(子类类型) 父类变量名;

 例:

//
public 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+"正在吃饭!!!");
    }
}
//
public 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 class Main {
    public static void main(String[] args) {
        Animal dog=new Dog("旺财",3);
        dog.eat();
        Dog dog1=(Dog) dog;//向下转型
        dog1.bark();//调用子类独有的方法
    }
}

结果如下:

 

向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。

例:

public class Main {
    public static void main(String[] args) {
        Animal dog=new Dog("旺财",3);
        if(dog instanceof Dog){
            Dog dog1=(Dog) dog;
            dog1.bark();
        }
    }
}

 结果如下:

以上便是本篇文章的全部内容,感谢各位看官观看,如本篇文章对你有所帮助,可以点点关注收藏支持一下,感谢支持!!!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值