多态

一个对象的多种状态称为多态
多态在以后的学习过程中会经常用到。

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值