多态:一个事物在不同时刻体现的不同形态
多态的前提条件:
1)继承关系,必须存在,没有继承关系----谈不上多态
2)必须存在方法重写,因为子类需要覆盖父类的功能
3)必须有父类引用指向子类对象-------->称为"向上转型"
多态的成员访问特点(重点)
1)成员变量(非静态)
编译看左,运行看左
2)成员方法(非静态)
编译看左,运行看右, 子类的方法将父类的方法覆盖了,所有使用的子类的功能
3)静态方法算不上方法重写---跟类相关,类名.方法名()
编译看左,运行看左
4)构造方法----访问---由于多态还是需要继承的,所以分层初始化
多态的好处是什么:
1)提高代码的复用性(由继承保证)
2)提高代码的扩展性(有多态保证:父类引用指向子类对象)
多态的弊端是什么?
父类引用指向子类对象
对象名.方法名() ---看父类中是否有这个方法,编译看左!
不能访问子类的特有功能
如何解决呢
既然你可以父类引用指向子类对象, (向上转型:使用的都是父类的东西)
Fu fu = new Zi() ;
能不能将使用子类的引用来访问呢?
将父类的引用强转转换为子类的引用 :强转类型转换的格式'
Zi z = (Zi)f ;
子类型 变量名 = (子类型)父的引用;
向下转型
//父类
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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 void eat() {
}
public void sleep() {
}
}
//子类
class Student extends Person{
private String studyId;
public Student() {
}
public Student(String name, int age, String studyId) {
super(name, age);
this.studyId = studyId;
}
public String getStudyId() {
return studyId;
}
public void setStudyId(String studyId) {
this.studyId = studyId;
}
public void eat(){
System.out.println("爱吃饭");
}
public void sleep(){
System.out.println("爱睡觉");
}
public void study(){
System.out.println("我爱学习");
}
}
//测试类
public class PersonTest {
public static void main(String[] args) {
Person p=new Student("高山",19,"1714024067");
Student s=(Student) p;
System.out.println(p.getName()+ " "+ p.getAge()+ " "+ s.getStudyId());
s.eat();
s.sleep();
s.study();
}
}