Java有三大特性:封装 继承 多态
多态: 多种形态。是面向对象的三大特性之一。多态是建立在封装和继承之上
实现多态的条件:
1.继承:必须要有子类继承父类的继承关系。
2.重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
方法的重写和重载就是方法的多态的体现形式
class Person {
public void eat () {
System.out.println("吃饭");
}
}
class Man extends Person {
@Override //方法的重写就是方法多态的一种体现
public void eat() {
System.out.println("吃枸杞");
}
多态的向上转型
本质就是:父类的引用指向子类对象
语法格式:
父类 父类引用 = new 子类();
将子类的对象赋值给了父类的引用。小范围(子类) 转为大范围(父类)自动转
父类的引用可以调用父类的所有成员方法,可以调用子类的重写父类的方法,但是不能调用子类独有的方法。
class Animal {
public void cry () {
System.out.println("动物在叫");
}
}
class Dog extends Animal {
@Override
public void cry() {
System.out.println("汪汪");
}
//自己独有的方法
public void eat () {
System.out.println("狗吃shit");
}
}
class Cat extends Animal {
@Override
public void cry() {
System.out.println("喵喵喵.....");
}
public void sleep () {
System.out.println("睡觉打呼噜");
}
}
public class Demo1 {
public static void main(String[] args) {
//多态 父类的引用指向子类的对象
Animal animal = new Dog();
animal.cry();
//父类的引用是指向不了子类独有的方法的,就意味着
//父类的引用不能调用子类独有的方法
//animal.eat();
Animal animal2 = new Cat();
animal2.cry();
//animal2.sleep();
}
}
多态向下转型(需要先向上转型,再向下转型)
语法格式:
父类类型 父类引用 = new 子类(); 子类类型 子类引用 = (子类类型)父类的引用;向下转型需要强转
向上转型=====》 父类引用指向了子类的对象 子类赋值给父类引用
向下转型=====》将父类的引用赋值给子类 父类赋值给子类引用
注意点:
先向上转型,再向下转型
1.5instanceof 关键字
比较操作符,返回值是布尔类型的数据
语法格式:
对象引用 instanceof 运行类型 用来判断对象的运行类型(=右边), 是否是xx类型或者xx类型的子类
目的是为了在强转的时候不出现问题
总结 左边 的辈分小(对象的引用) 右边辈分大(类) true
左边 的辈分大( 对象的引用) 右边辈分小(类) false