一个对象的多种状态称为多态
多态在以后的学习过程中会经常用到。
Pupil pupil= new Pupil();
Student pupil2 = new Pupil();
这里的代码并没有错。
另外编译时多态就是重载
运行时候多态就是子类对象指向父类引用
要形成多态,必须要先有继承,子类的对象指向了父类的引用,如下代码所示:
Student student2 = new Pupil();
Student student3 = new MiddleStudent();
Student student4 = new CollegeStudent();
左边就是引用,右边就是new就是创建对象。
而且我们可以进行强制类型转换,比如如下代码

这里就把Pupil的pupil3强制转化为了pupil2;
但是有时候会出错,我们可以看如下图:

当进行强制类型转换后,两个对象在栈中对应堆中地址是相同的。但是强转有可能会报错的。
下面是强转的一些规则:
子类对象指向父类引用的时候,父类引用可以强转为子类对象。
子类之间不能强转
父类对象不能强转为子类
可以通过instanceof 判断一个对象是不是某一种类型,如果是则可以通过强制类型转换进行强转 如果不是强转则会报错ClassCastException 类型强转异常
if(student3 instanceof MiddleStudent) {
MiddleStudent middleStudent = (MiddleStudent)student3;
}

上面的parent就是父类,下面就是它所派生的三个子类
对象调用成员变量的时候,值跟调用类型有关
如下代码
package oop2;
public class Student {
public int a = 10;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void introduce() {
System.out.println("我是一个学生");
}
}
package oop2;
/**
* 小学生类
* @author HASEE
*
*/
public class Pupil extends Student{
public int a = 20;
@Override
public int getA() {
return a;
}
public void introduce() {
System.out.println(super.getA());
System.out.println(getA());
System.out.println("我是一个小学生");
}
public void a() {
System.out.println("小学生输出a");
}
}
这两个类里面有一个父类一个子类,两个类里都有一个公共的a变量。其输出哪一个a取决于对象调用成员变量的时候的调用类型。
Pupil pupil = new Pupil();
Student student2 = new Pupil();
第一个pupil当输出pupil.a的时候会输出20。
但是第二个当输出student2.a的时候会输出10。
661

被折叠的 条评论
为什么被折叠?



