多态

概念:

​ 1.是建立在继承机制之上,继承机制允许对象看成所属类,也可以看作是超类;

​ 2.当子类重写父类方法,由同一个对象调用产生不同的行为,这种现象就叫多态

​ 3.无继承就无多态

		父Hero hero=new Hero();//将某个对象看成其所属类
		子HanBing hb=new HanBing();//将某个对象看成其所属类
		子ManWang mw=new ManWang();//将某个对象看成其所属类
		hero=hb;//把对象看成超类
		hero=mw;//把对象看成超类
2.三要素:

​ 1.继承

​ 2.重写

​ 3.将子类的实例赋给父类类型(父类引用指向子类实例)

3.语法:
父类 引用=new 子类();
Father f=new Son1();
Father f=new Son2();
4.方法调用
父有子有,调子类
父有子无,调父类
父无子有,将其转换成其本类对象就可以调用,否则就编译错误
((YaSe)hero).fun();
//hero.fun();编译错误
用父类对象调用静态方法和属性,如果子类有,父类有,都是调父类的

Hero hero=new HanBing();
HanBing hb=(HanBing)hero;//因为父类指向的是寒冰对象,然后将父类对象转换寒冰,是类型匹配的,所以不会出错
		//为了保证转换进不出现类转换异常,java提供了一个关键字instanceof,用于判断对象是否是某种类型的实例
//ManWang mw=(ManWang)hero;//将父类对象强制转换成子类,编译期不会出异常,但是运行时会出现ClassCastException 类转换异常
		//可以将一个父类强制转换成子类对象,如果父类所指向的对象是要转的成的对象类型,那么就不会报错,如果转换成的类型原对象类型不一致,出现类转换异常

		hero=new YaSe();
		if(hero instanceof HanBing){
			System.out.println("这个对象是寒冰");
		}else if(hero instanceof ManWang){
			System.out.println("这个对象是蛮王");
		}
		System.out.println(hero.value);
		System.out.println(((YaSe)hero).value);
5.调用次序:

​ 方法先调子类,属性先调父类

6.为什么要使用多态?

​ 1.提高代码的阅读性和减少代码的冗余。

​ 2.提高代码的灵活性和降低代码的维护成本。

7.如何实现多态?

案例:学生要回家,可以选择火车,地铁,汽车,飞机的方式回家,通过面向对象的思想来实现此功能。

​ 1.通过属性来实现多态:

public class Jtgj {//父类
	public void run() {
		System.out.println("..........");
	}
}
public class Hc extends Jtgj {//子类1
	@Override
	public void run() {
		System.out.println("正在从火车,火车以200KM/h的速度飞速行驶....");
	}
}
public class Qc extends Jtgj {//子类2
	@Override
	public void run() {
		System.out.println("正在坐汽车,以100KM/H的速度快速行驶.....");
	}
}
public class Student {
	private String name;
	public Jtgj jtgj=null;//多态实现,将父类作为属性的数据类型
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void goHome() {
		System.out.println("张三要回家了...");
		jtgj.run();//实现多态效果
	}
}
public class Test {
	public static void main(String[] args) {
		Student stu=new Student();
		stu.setName("张三");
		//stu.jtgj=new Hc();//创建不一样的子类对象,则实现不一样的效果。
		stu.jtgj=new Qc();
		stu.goHome();
	}

}

​ 2.通过方法传参实现多态

public class Student2 {
	public String name;
	//将父类作为参数传入
	public void goHome(Jtgj jtgj) {
		System.out.println("张三要回家了...");
		jtgj.run();
	}
}
public static void main(String[] args) {
		Student2 stu=new Student2();
		stu.name="张三";
		stu.goHome(new Qc());//创建子类对象 
	}
8.instanceof关键字

作用:判断对象是否为指定类型的对象,如果是则为true,否则为false

案例:

public static void main(String[] args) {
		Person person = new Teacher();
		person.name = "张三";
		person.age = 20;
		person.sayHi();

		if (person instanceof Student) {// 判断此对象是否为学生对象
			Student stu = (Student) person;//将父类强制转换成子类。
			stu.play();
		}
	}
注意事项:
	如果无instanceof判断,当类型不匹配时,Student stu = (Student) person;在运行的时候会出现类转换异常。
	Exception in thread "main" java.lang.ClassCastException: cn.znsd.oop3.Teacher cannot be cast to cn.znsd.oop3.Student
	at cn.znsd.oop3.Test.main(Test.java:12)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值