Java学习之多态

Java面向对象的四大特性: 继承、封装、多态、抽象

多态

同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果
想要实现多态的效果 需要现有继承关系

体现
父类类型的引用 指向 子类的对象 向上转型
   Person p = new Teacher();
该引用只能调用父类中定义的 属性和方法
如果子类中重写了父类方法,那么调用的是子类重写后的 方法
  如果父类与子类有同名的属性 执行父类的属性
  如果父类与子类有同名的方法 执行子类的方法
如果想要调用子类独有的属性或方法
  需要将类型还原成真实类型 强制类型转化 向下转型
   Teacher t = (Teacher p)
强制向下转型时可能会出现一个运行时异常
ClassCastException 造型 异常
所以需要进行判断 instanceof 判断对象是否属于后面类型
对象 instanceof 类

============================================================================================================
设计一个类 银行 有叫号,取钱,存钱方法
设一个类 Person 类 有name
三个子类继承 Person类 OldMan 类,YoungMan类 Toff类(土豪类)
银行依赖于人类,所以银行类有一个属性是Person

// 定义一个抽象类
public abstract class Person {
	protected String name;
	public String getName() {
		return this.name;
	}
	// 定义抽象方法
	public abstract void callName();
	public abstract void transact();
	public abstract void leave();
}
// 继承父类,对父类抽象方法进行重写
public class OldMan extends Person {
	public OldMan() {}
	public OldMan(String name) {
		this.name = name;
	}
	public void callName() {
		System.out.println("年纪大了,不会取号,需要找大堂经理帮忙");
	}
	public void transact() {
		System.out.println("存养老金");
	}
	public void leave() {
		System.out.println("大堂经理送老人家出门");
	}
}
// 继承父类,对父类抽象方法进行重写
public class YoungMan extends Person{
	
	public YoungMan() {}
	public YoungMan(String name) {
		this.name = name;
	}
	public void callName() {
		System.out.println("年纪人,自己取号");
	}
	public void transact() {
		System.out.println("存工资");
	}
	public void leave() {
		System.out.println("自己出去");
	}
}
// 继承父类,对父类抽象方法进行重写
public class Toff extends Person{
	
	public Toff() {}
	public Toff(String name) {
			this.name = name;
	}
	
	public void callName() {
		System.out.println("土豪不用取号,进VIP通道");
	}
	public void transact() {
		System.out.println("转账一个亿");
	}
	public void leave() {
		System.out.println("大摇大摆出门");
	}
}

public class Bank{
	//父类作为参数传递
	public void profession(Person person) {
		System.out.println("欢迎"+person.getName()+"!");
		//因为每个子类对方法进行了重写,所以调用的是子类的方法
		person.callName();
		person.transact();
		person.leave();
	}	
	//这种方法避免了每出现一个新的子类就要在Bank中重新写一个方法
	/*
	public void profession(OldMan ol) {
		System.out.println("欢迎"+ol.getName()+"!");
		ol.callName();
		ol.transact();
		ol.leave();
	}
	*/
}

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Bank bank = new Bank();
		
		Person p = new OldMan("老年人");
		bank.profession(p);
		
		Person p1 = new YoungMan("年轻人");
		bank.profession(p1);
		
		Person p2 = new Toff("土豪");
		bank.profession(p2);

	}
}
/*
欢迎老年人!
年纪大了,不会取号,需要找大堂经理帮忙
存养老金
大堂经理送老人家出门
欢迎年轻人!
年纪人,自己取号
存工资
自己出去
欢迎土豪!
土豪不用取号,进VIP通道
转账一个亿
大摇大摆出门
*/

调用一个方法 名字一样 传递参数却不同
1.利用方法重载----静态加载
2.利用多态效果----动态加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值