什么是多态?
多态是面向对象的三大特征之一,多态的定义就是一个同一个行为在不同对象上会产生不同的效果,比如小狗、小猫、老虎、大象它们跑起来是不一样的,同样是跑这个动作,再比如蜻蜓、蝴蝶、燕子、麻雀它们飞起来也是不一样的。可以看出来同一个行为,在不同的事物会产生不一样的效果。
多态的前提
- 要么是继承,要么是实现
- 方法需要重写
多态的格式
父类类型 变量名 = new 子类对象;
变量名.方法名();
多态的使用
父类
//父类
public class Animal {
public void eat(){
System.out.println("吃");
}
}
子类
//子类
public class Dog extends Animal{
public void eat(){
System.out.println("骨头");
}
}
//子类
public class Cat extends Animal{
public void eat(){
System.out.println("鱼");
}
}
测试类
//测试类
public class Test02 {
public static void main(String[] args) {
//多态的形式创建对象
Animal a1 = new Dog();//向上转型
//调用的是Dog类里的eat方法
a1.eat();
//多态写法
Test02 t2 = new Test02();
t2.aa(new Dog());
//多态的形式创建对象
Animal a2 = new Cat();//向上转型
//调用的是Cat类里面的eat方法
a2.eat();
//多态写法
t2.aa(new Cat());
//普通写法
Test02 t3 = new Test02();
t3.dog(new Dog());
//普通写法
Test02 t4 = new Test02();
t4.cat(new Cat());
}
//多态写法
public void aa(Animal a){
a.eat();
}
//普通写法
public void dog(Dog d){
d.eat();
}
//普通写法
public void cat(Cat c){
c.eat();
}
}
运行结果:
什么是向上转型和向下转型?
向上转型:舍弃子类特有的属性和方法,子类和父类都有的并且存在着重写关系的,子类覆盖父类。
向上转型的格式
父类类型 变量名 = new 子类类型();
例:
Animal a1 = new Dog();
父类
//父类
public class Animal {
public void eat(){
System.out.println("吃");
}
}
子类
//子类
public class Dog extends Animal{
//方法覆盖
public void eat(){
System.out.println("骨头");
}
//子类特有
public void run(){
System.out.println("小狗跑起来了");
}
}
//子类
public class Cat extends Animal{
//方法覆盖
public void eat(){
System.out.println("鱼");
}
}
测试类
//测试类
public class Test02 {
public static void main(String[] args) {
//多态的形式创建对象
Animal a1 = new Dog();//向上转型
//调用的是Dog类里的eat方法
a1.eat();
//a1.run();
//多态的形式创建对象
Animal a2 = new Cat();//向上转型
//调用的是Cat类里面的eat方法
a2.eat();
}
}
注意:
在Dog类中我们明明有一个特有的run方法,在这个向上转型中却无法正常使用,这就是向上转型的特性,舍弃子类特有的属性和方法,子类和父类都有的并且存在着重写关系的,子类覆盖父类。
向下转型:父类类型向子类类型转换的过程是强制的,一个已经向上转型了的子类对象,将父类引用转为子类引用,可以使用强制类型转换,这就是向下转型。
向下转型的格式
子类类型 变量名 = (子类类型)父类变量名
例:
Dog d = (Dog)a1;
父类
//父类
public class Animal {
public void eat(){
System.out.println("吃");
}
}
子类
//子类
public class Dog extends Animal{
//方法覆盖
public void eat(){
System.out.println("骨头");
}
//子类特有
public void run(){
System.out.println("小狗跑起来了");
}
}
//子类
public class Cat extends Animal{
//方法覆盖
public void eat(){
System.out.println("鱼");
}
//子类特有
public void cry(){
System.out.println("喵喵叫");
}
}
测试类
//测试类
public class Test02 {
public static void main(String[] args) {
//多态的形式创建对象
Animal a1 = new Dog();
//向下转型
Dog d = (Dog)a1;
d.run();
d.eat();
System.out.println("------------");
//多态的形式创建对象
Animal a2 = new Cat();
//向下转型
Cat c = (Cat)a2;
c.eat();
c.cry();
}
}
运行结果: