1. 对象的多态性
1.1 对象多态性前提
必须有继承或者是接口的实现
必须有方法的重写
多态的语法规则
父类 变量(对象名) = new 子类对象(); //多态写法
多态中:对象调用父类的方法,执行的是子类的方法的重写。
1.2 多态中成员特点
1.2.1 多态中成员变量的特点 (编译看左运行看左)
编译时:若父类中没有成员变量,编译失败
运行时:运行父类中的成员变量,与子类中的成员变量无关
1.2.2 多态中成员方法的特点 (编译看左运行看右)
编译时:若父类中没有成员变量,编译失败
运行时:运行子类的方法重写
1.3 多态的转型
多态的程序中,不能调用子类的特有成员!!
只能调用子类父类的共有成员!!
转型公式:
转型后的类型 变量名 = (转后类型) 要转的数据
public class PolymorphicTest {
public static void main(String[] args) {
//创建对象,多态性
//父类 = new 任意子类对象() 扩展
Animal animal = new Cat();
animal.eat();
// animal.catchMouse(); //没有catchMouse这个方法
//Cat类的特有功能 catchMouse()方法
//类型转换,强制
//Cat提升为了Animal,转回Cat类型
Cat c = (Cat)animal;
//至此c失去多态性 属于子类对象
c.catchMouse();
}
}
补充: 多态性提升扩展性,是否需要强制转换,根据实际功能需求来决定.
1.4 多态中的转型异常
异常ClassCastException 类型转换异常,在多态中经常发生.
是在进行类型的强制转换的时候发生,我们现在的案例是Dog不能转成Cat.
需要解决这个异常 : 对象是Cat转Cat,是Dog换Dog
运算符 : 比较运算符,结果是boolean类型
运算符是关键字 instanceof
instanceof的语法格式:
instanceof的语法格式:
对象名 instanceof 类的名字
解析: 比较这个对象,是不是由这个类产生的 c instanceof Cat
解释: c对象是不是Cat类产生的,如果是结果就是true
1.5 多态转型案例
* 定义Person类,本案例中,是最高的父类 * 属性: * 姓名name(String类型),地址address(String类型) * 电话号码telphone(String类型)和电子邮件地址email(String类型)
* 雇员类 是人类的一种,继承Person * 属性: * 办公室 office(String类型),工资 wage(String类型), * 受雇日期 hiredate(String类型),
* 3) Faculty类中的属性有:学位degree(String类型),级别level(String类型);
* 4) Staff类中的属性有:职务称号duty(String类型)。
* 5) 现有对象Person p1 =new Faculty()和 * Personp2 =new Staff (), * 请分别为p1的属性学位degree赋值“本科”和Staff类的duty赋值“职员”
public class PolymorphicTest {
public static void main(String[] args) {
// 多态创建对象
Person p1 = new Faculty();
Person p2 =new Staff ();
// p1对象的属性赋值本科degree子类的特有成员
// 判断p1对象是不是Faculty类产生
if(p1 instanceof Faculty){
Faculty p11 = (Faculty) p1;
p11.setDegree("本科");
System.out.println(p11.getDegree());
}
if (p2 instanceof Staff){
Staff p22 = (Staff) p2;
p22.setDuty("职员");
System.out.println(p22.getDuty());
}
}
}
public class Person {
private String name;
private String address;
private String telphone;
private String email;
// alt + insert
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTelphone() {
return telphone;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
public class Employee extends Person{
private String office;
private String wage;
private String hiredate;
public String getOffice() {
return office;
}
public void setOffice(String office) {
this.office = office;
}
public String getWage() {
return wage;
}
public void setWage(String wage) {
this.wage = wage;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
}
public class Faculty extends Employee{
static String degree;
static String level;
public static String getDegree() {
return degree;
}
public static void setDegree(String degree) {
Faculty.degree = degree;
}
public static String getLevel() {
return level;
}
public static void setLevel(String level) {
Faculty.level = level;
}
}
public class Staff extends Employee{
private String duty;
public String getDuty() {
return duty;
}
public void setDuty(String duty) {
this.duty = duty;
}
}