前言:了解多态
封装、继承和多态是Java的三大特性
封装是面向对象的思想的特性对属性进行封装 对方法进行封装 对类进行封装 对项目进行封装
继承是从已有的类中派生出新的类,新的类(子类)能吸收已有类(父类)的数据属性和行为,并能扩展出新的能力
多态意思是多种形态,建立在封装和继承之上,方法的重写和重载就是方法的多态的体现形式
一.对象的多态
在学习对象的多态之前我们要知道一个对象的的编译类型和运行类型是不一样的,编译类型是在定义对象的时候,就已经确定好的,是不可以改变的,但运行类型是可以改变的。
编译类型在等号的左边 运行类型在等号的右边
Person person = new Person();
多态指的是父类的引用指向子类的对象
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("狗吃骨头");
}
}
public class Demo1 {
public static void main(String[] args) {
//多态 父类的引用指向子类的对象
Animal animal = new Dog();
animal.cry();
//父类的引用是指向不了子类独有的方法的,这意味着父类的引用不能调用子类独有的方法
//animal.eat();
}
}
上面的例子中,父类Animal的引用animal指向了子类的对象Dog(),所以我们使用animal.就可以使用子类中重构的父类方法,但这种方法无法使用子类所独有的方法这时候就需要转型了。
二.多态的转型
1.向上转型
向上转型的本质就是:父类的引用指向子类对象
语法格式:
父类 父类引用 = new 子类();
将子类的对象赋值给了父类的引用。小范围(子类) 转为大范围(父类)可以自动转
父类的引用可以调用父类的所有成员方法,可以调用子类的重写父类的方法,但是不能调用子类独有的方法。
2.向下转型
向下转型的本质就是:对象的还原过程
语法格式:
父类类型 父类引用 = new 父类();
子类类型 子类引用 = (子类类型)父类的引用;
一般不用这个方法,会报错
父类类型 父类引用 = new 子类();
子类类型 子类引用 = (子类类型)父类的引用;
可以看到,向下转型就是先向上转型然后再将父类的引用强制转换为子类类型再“赋值”给子类的引用。
父类的引用无法调用子类独有的方法是因为父类中没有这个方法,但是我们将父类的引用强制转换为子类类型再“赋值”给子类的引用之后这个子类的引用就可以调用这个子类的所以方法了。
//Object类是所有的类的父类!!!
class Person1 {
public void feed (Object obj ) {
//向下转型
Cat cat = (Cat)obj;
cat.eat();
}
}
class Cat {
public void eat () {
System.out.println("猫吃小鱼。。。");
}
}
public class Demo3 {
public static void main(String[] args) {
Person1 person1 = new Person1();
Cat cat = new Cat();
//Object 是Cat的父类
person1.feed(cat);
String string = new String();//普适性
}
}
三.instanceof 关键字
比较操作符,返回值是布尔类型的数据
语法格式:
对象引用 instanceof 运行类型
用来判断对象的运行类型(=右边),是否是xx类型或者xx类型的子类,目的是为了在强转的时候不出现问题
class AA {}
class BB extends AA {}
public class Demo1 {
public static void main(String[] args) {
BB bb = new BB();
BB bb1 = new BB();
AA aa = new AA();
//instanceof 的左边放的对象的引用,右边是类
System.out.println(bb instanceof BB);//true
System.out.println(bb1 instanceof BB);//true
//判断对象bb是否是AA的对象或者子类的对象
System.out.println(bb instanceof AA);//true
System.out.println(aa instanceof AA);//true
System.out.println(aa instanceof BB);//false
//总结: 左边 的辈分小(对象的引用) 右边辈分大(类) 屡试不爽
AA aa2 = new BB();
System.out.println(aa2 instanceof AA);//true
System.out.println(aa2 instanceof BB);//true
Object object = new Object();
System.out.println(object instanceof AA);//false
System.out.println(object instanceof Object);//true
String string = "qwer";
System.out.println(string instanceof Object);//true
}
}