1、什么是多态
-
同一个引用类型(Pet),使用不同的实例(Dog或Cat),调用同一个方法(子类重写过的),导致最终执行结果不同。
-
简单理解:父类引用指向子类对象
-
public class Master { public void feed(Pet pet){ pet.eat();//所有的pet都有eat方法,不同的子类有不同的eat方法 } }
-
2、如何实现多态
-
实现多态的三个要素
-
编写具有继承关系的父类和子类
-
子类重写父类的方法
-
父类引用指向子类对象
-
向上转型(自动类型转换)
-
Pet pet = new Dog();
-
-
-
使用多态的两种形式
-
使用父类作为方法形参,子类作为方法实参
-
使用父类作为方法返回值类型,使用子类作为方法返回值
-
public Pet adopt() { System.out.println("请选择你要的宠物:1.狗 2.猫"); Scanner scanner = new Scanner(System.in); int choose = scanner.nextInt(); Pet pet; if (choose == 1){ pet = new Dog();//真正领养的宠物是狗 } else { pet = new Cat();//真正领养的宠物是猫 } return pet; }
-
3、方法的重写和重载
4、向上转型和向下转型
-
向上转型 Pet pet = new Pet()
-
只能使用Pet中声明的方法,但实际上使用的是子类重写的方法
-
-
向下转型 Dog dog = (Dog) pet;
-
因为经过向上转型,pet无法再使用dog的方法(父类引用无法使用子类独有的方法),如果想使用,可以再向下转型,转回dog
-
向下转型有时候会出现异常ClassCastException,原因是真正的实例无法转换成目标类型
-
为了防止出现该异常应该在向下转型之前判断一下对象的类型
-
if (pet instanceof Cat){ Cat cat = (Cat) pet; cat.play(); } else { System.out.println("这不是一只猫"); }
-
-
instanceof 判断一个对象的类型
-
所有的类都有共同的祖先类Object
-
Cat cat = new Cat(); System.out.println("是否为Cat类:" + (cat instanceof Cat));//true System.out.println("是否为Pet类:" + (cat instanceof Pet));//true System.out.println("是否为Object类:" + (cat instanceof Object));//true
-
5、包装类
-
本来Object是所有类的祖先类,但是基本数据类型不属于类,所以一个方法的参数是Object,基本数据类型原本是放不进去的,但是java为我们提供了包装类,基本数据类型和它的包装类之间是自动转换的,所以即使一个方法的参数是Object,也可以将基本数据类型放进去
-
基本数据类型对应的包装类
-
byte-->Byte
-
short-->Short
-
int --> Integer
-
long --> Long
-
char --> Characher
-
boolean --> Boolean
-
float --> Float
-
double --> Double
-
-
基本数据类型和它的包装类之间是自动装箱和自动拆箱的
-
特殊情况
-
double a = 1;//自动类型转换 Double b = 1;//错误,不能在装箱的同时进行自动类型转换
-
-
包装类的主要作用是可以让基本数据类型作为Object类型使用
-
包装类的方法
-
parseInt
-
String str = "123"; int a = Integer.parseInt(str);
-
-
parseDouble
-