多态
定义:是指同一行为,具有多种不同表现形式。
多态的前提:1.继承或实现【二选一】
2.方法的重写
3.父类引用指向子类对象
多态的体现:
格式: 父类类型 变量名 = new 子类对象;
变量名.方法名();
代码如下:
Fu f = new zi();
f.方法名
当使用多态方式调用方法时,首先检查父类中是否有该方法,若果没有,则编译出错;如果有,执行的是子类重写后的方法。
代码如下:
//定义父类
public abstract class Animal01 {
public abstract void eat();
}
//定义子类
public class Cat01 extends Animal01 {
public void eat(){
System.out.println("吃鱼");
}
}
public class Dog01 extends Animal01{
public void eat() {
System.out.println("吃骨头");
}
}
//定义测试类
public class Test01 {
public static void main(String[] args) {
//多态形式创建对象
Animal01 animal01 = new Cat01();
//调用的是Cat 的eat
animal01.eat();
//多态形式创建对象
Animal01 animal02 = new Dog01();
//调用的是Dog的eat
animal02.eat();
}
}
引用类型转换
向上转型:多态本身是子类类型向父类类型转换的过程,这个过程是默认的。
当父类引用指向一个子类对象时,便是向上转型。
使用格式:
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。
使用格式:
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c=(Cat) a
为何使用转型:
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做向下转型。
演示代码如下:
//定义父类 Animal
public abstract class Animal {
public abstract void eat();
}
//定义子类 Cat
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
public void sleep() {
System.out.println("睡觉");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//向上转型
Animal a = new Cat();
a.eat();//调用的是Animal的eat方法
//向下转型
Cat c = (Cat)a;
c.sleep();//调用的是Cat的sleep方法
}
}