多态
在Java中多态有两种体现:
- 基于方法重载的多态
方法的重载:指一个类内部存在同名的方法,这些方法的参数类型或个数不同。 - 基于方法覆盖(重写)的多态
方法的覆盖:指子类对父类方法的重新改写,子类方法的声明与父类完全相同 。 - 对象的多态(上转型对象)
向上转型对象
Person是Student的父类,
Person e = new Student();
1、一个引用类型变量如果声明为父类的类型,但实际引用的是子类的对象,那么该变量就不能再访问子类中添加的属性和方法。
如上图e对象无法访问Student类中的school属性。
属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编译错误。
2、虚拟方法调用
public class Student extends Person{
private String school;
public void showInfo() {
System.out.println("Student类的showInfo()");
}
public static void main(String[] args) {
Student stu = new Student();
stu.showInfo();//调用的Student中的showInfo()
Person p = new Person();
p.showInfo();//调用的Person中的showInfo()
Person e = new Student();
e.showInfo();调用的Student中的showInfo()
}
}
public class Person {
int age;
String name;
public void showInfo() {
System.out.println("Penson类的showInfo()");
}
}
其运行结果为:
分析:编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student里的showInfo()方法。
instanceof操作符
x instanceof A;
检验x是否为类A的对象,返回值为boolean型。
public class Student extends Person{
private String school;
public void showInfo() {
System.out.println("Student类的showInfo()");
}
public static void main(String[] args) {
Student stu = new Student();
Person p = new Person();
System.out.println(stu instanceof Person);//true
System.out.println(p instanceof Person);//true
System.out.println(p instanceof Student);//flase
Person e = new Student();
System.out.println(e instanceof Student);//true
System.out.println(e instanceof Person);//true
}
}
其运行结果为: