多态
1.对多态的理解:同一个对象在不同时刻体现出来的不同状态。
简单来说就是猫和狗都是动物,但他们又有许多不同,猫和狗是动物向下延伸的不同结果,这就是多态。
2.多态的前提:
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。
3.多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多态
interface Fu {}
Fu f = new Zi();
4.多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造(注:子类默认调用父类的无参构造,等于默认在子类的构造方法中有super();)
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
package com.lenovo.demo3;
/**
* 动物类
* @author Petrichor
*
*/
public class Animal {
int a = 10;
public Animal() {
System.out.println("动物无参构造");
}
public Animal(int a) {
System.out.println("动物有参构造");
}
public void eat() {
System.out.println("动物吃东西");
}
public void sleep() {
System.out.println("动物睡觉");
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
package com.lenovo.demo3;
/**
* 猫类
* @author petrichor
*
*/
public class Cat extends Animal {
int a = 20;
public Cat(int a) {
System.out.println("猫的有参构造");
}
public Cat() {
super(5);
System.out.println("猫的无参构造");
}
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
super.sleep();
System.out.println("猫躺着睡");
}
public void fly(){
System.out.println("猫能飞?");
}
}
package com.lenovo.demo3;
/**
* 测试类
* @author Petrichor
*
*/
public class Tset {
public static void main(String[] args) {
// 多态
Animal cat = new Cat();
// 动物有参构造 猫的无参构造
cat.eat();// 猫吃鱼
cat.sleep();// 动物睡觉 猫躺着睡
// cat.fly();不能调用,Animal中没有fly方法
System.out.println(cat.a);// 10
System.out.println(cat.getA());// 10
cat.setA(30);
System.out.println(cat.getA());// 30
// 普通
Cat cat2 = new Cat(5);// 动物无参构造 猫的有参构造
cat2.fly();// 猫能飞?
System.out.println(cat2.a);// 20
System.out.println(cat2.getA());// 10
cat2.setA(40);
System.out.println(cat2.getA());// 40
}
}
这个动物和猫类基本体现多态中成员变量、成员方法、构造方法的调用,可以看到当我们
Animal cat = new Cat();
调用的a是Animal类的。而当
Cat cat2 = new Cat(5);
调用的a是Cat类的。
5.多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
6.多态的弊端:
父不能使用子的特有功能。
现象:
子可以当作父使用,父不能当作子使用。
7.多态中的转型
A:向上转型
从子到父
B:向下转型
从父到子