多态的概念:多态其实是同一个对象在不同时刻体现出来的不同状态
多态的前提:
1、有继承或者实现关系。
2、有方法重写(因为多态就是靠方法重写来体现不同状态的)。
3、要有父类引用指向子类对象。
格式:父 f = new 子()
多态中的成员访问特点:
1、成员变量
编译看左边(父类),运行看左边(子类)。
2、构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
3、成员方法
编译看左边(父类),运行看右边(子类)
(因为成员方法存在方法重写,所以成员方法访问的时候访问的是子类)。
4、静态方法
编译看左边(父类),运行看左边(子类)
(静态和类相关,算不上重写,所以,访问还是左边)
多态的好处:
1、提高了代码的维护性(由继承来保证)
2、提高了代码的扩展性(由多态来保证)
对于下面的代码,是没有用多态来写的,如果创建一个新的子类,就要在工具类中多增加一个方法,如果创建很多个,那么同样的代码要重复好多遍,如果用多态,就可以保证在多增加一个类的同时,工具类中不用再增加一个方法。这就提高了代码的扩展性。
public class Main {
public static void main(String[] args) {
cat c = new cat();
dog d = new dog();
AnimalTool.useCat(c);
AnimalTool.useDog(d);
}
}
//创建工具类
class AnimalTool {
private AnimalTool() {}
//调用猫的功能
public static void useCat(cat c) {
c.eat();
c.sleep();
}
//调用狗的功能
public static void useDog(dog d) {
d.eat();
d.sleep();
}
//如果我创建一个新的子类,就要在这里多增加一个方法,如果创建很多个,那么同样的代码要重复好多遍
}
//创建父类
class Animal {
public void eat() {
System.out.println("eat");
}
public void sleep() {
System.out.println("sleep");
}
}
//创建子类
class cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫卧着睡");
}
}
//创建子类
class dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}
public void sleep() {
System.out.println("狗趴着睡");
}
}
如果用多态,就会节省很多代码:
public class Main {
public static void main(String[] args) {
Animal c = new cat();
Animal d = new dog();
AnimalTool.useAnimal(c);
AnimalTool.useAnimal(d);
}
}
class AnimalTool {
private AnimalTool() {}
//运用多态就能很好的解决代码重复的问题
public static void useAnimal(Animal a) {
a.eat();
a.sleep();
}
}
class Animal {
public void eat() {
System.out.println(eat);
}
public void sleep() {
System.out.println(sleep);
}
}
class cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫卧着睡");
}
}
class dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}
public void sleep() {
System.out.println("狗趴着睡");
}
}
多态的弊端:不能使用子类的特有功能。