面向对象之多态
1.1多态的概述
- 是面向对象的三大特征之一
- 是一个事物所具有的多种形态(例如:Student继承于Person,那么Student的具体对象/事物“小李同学”既是学生也是人。)
1.2多态的体现
- 父类的引用指向了子类,或者说子类对象赋值给了父类的引用
1.3多态的前提
- 要存在继承关系
- 要存在方法重写
1.4多态的格式
- 普通类多态格式:
父类 变量名=new 子类(); - 抽象类的多态格式:
抽象类 变量名=new 抽象子类(); - 接口的多态格式:
接口 变量名=new 接口实现类();
2.1多态的使用
- 方法使用(一个子类继承了父类,在多态前提下调用对象方法的时候,编译期间,根据父类的引用只能调用父类中的方法,但是运行期间,根据子类对象调用子类对象中重写的方法)
- 总结:编译看左边,运行看右边
- 注意:成员变量编译、运行都看左边
package csdn;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void eat() {
System.out.println("吃饭饭");// 在Person中创建一个公共方法eat
}
public void sleep() {
System.out.println("睡觉觉");// 在Person中创建一个公共方法sleep
}
}
//创建Person的一个子类Man
class Man extends Person {
public void eat() {
System.out.println("多吃一点点");// 重写从父类中继承的eat方法
}
public void earnMoney() {
System.out.println("负责挣钱养家");// 创建一个Man特有的方法
}
}
//创建Person的一个子类Woman
class Woman extends Person {
public void eat() {
System.out.println("少吃一点点");// 重写从父类中继承的eat方法
}
public void Beauty() {
System.out.println("负责貌美如花");// 创建一个Woman特有的方法
}
}
- 创建一个测试类
package csdn;
//创建一个测试类
public class TestPerson {
public static void main(String[] args) {
Man man=new Man();//普通对象创建
man.earnMoney();
Person person=new Man();//多态对象创建
//person.earnMoney(); 多态时,子类特有的方法不能调用,编译不通过
person.sleep();
person.eat();//执行的是被Man改写后的eat
}
}
2.2多态的转型
- 向上转型:
子类对象赋值给一个父类引用,便是向上转型,多态本身就是向上转 型。
向上转型格式:
父类类型 变量名=new 子类类型();
如:Person person=new Man(); - 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式将父类引用转换为子类引用,这个过程是向下转型。
向下转型格式:
子类类名 变量名=(子类类型)父类类型的变量
Man man=(Man)person;//变量person实际指向Man对象 - 在多态前提下利用向下转型调用子类特有的方法
- 案例
package csdn;
//创建一个测试类
public class TestPerson {
public static void main(String[] args) {
Person person=new Man();//多态对象创建
//person.earnMoney(); 多态时,子类特有的方法不能调用,编译不通过
Man man=(Man)person;//强制类型转换
man.earnMoney();
}
}
2.3使用多态的场景
- 使用多态为成员变量赋值、为局部变量赋值
- 方法传参使用多态形式(最能体现多态优点的应用)
- 方法返回返回值使用多态形式