【1.3 对象的向上转型和向下转型】
- + -
向上转型
子类对象赋值给父类类型的引用时 会自动将子类对象对应的类型
提升为父类类型
语法:
父类类型 引用 = new 子类的构造方法();
特点:
此时 该引用只能调用父类中所有可见的属性和方法
不能调用子类特有的属性和方法
向下转型
将父类对象引用强制转为子类类型的过程
语法:
子类类型 引用 = (子类类型)父类对象引用;
特点:
1.此时 该引用可以调用子类特有的方法,同时还可以调用从父类中继承过来的所有方法
2.在进行强制类型转换之前,一定要使用instanceof关键字判断一下 否则运行时很容易抛出"ClassCastException" 类型强制转换异常
java.lang.ClassCastException 类型制转转换异常;
【instanceof 运算符】 用来在运行时 指出对象是否是特定类型的一个实例
【instanceof 语法】: 对象 instanceof 类型
【结果是boolean类型】:
true: 对象属于该类型
false: 对象不属于该类型
- + -
/* Animal1 c = new Cat1(); //有个人来给你爸爸去讲课 讲电工培训,
但爸爸不在,我又想挣这钱,就易容成我爸爸,
show(c);//然后去讲课,我只会讲java培训,问讲的是什么课?
还是Java因为实际讲课人是我;
Dog1 dd =(Dog1 ) d;//现在女友来找逛街,
但我此时还是易容成我爸爸的样子,
现在偷偷要去卸妆才出来
* dd.show2();//然后和女友逛街
*/
/*
一个儿子经过化妆成了父亲,但他实际上还是儿子,
那么他做的事(行为),是儿子做的呢?还是父亲做的呢?
显然还是儿子,化了妆的儿子,必须先从'父亲'卸妆成儿子
,才能干儿子特有的事(行为)
*/
- + -
public static void main(String[] args) {
Animal1 c = new Cat1();
show(c);
/*ClassCastException" 类型强制转换异常
Day11.Dog1 cannot be cast to Day11.Cat1 Day11。
狗1不能被扔到Day11.Cat1
Dog1 dd = (Dog1) d;
show(d);*/
Animal1 d = new Dog1();
show(d);
Animal1 p = new Pig1();
show(p);
}
public static void show(Animal1 tmp){//1.进来的是Animal1的引用
tmp.eat();
// Cat1 t = (Cat1) tmp;//(向下转型 )2.转成Cat1的引用
// t.show1();//3.再调Cat1特有的功能
if(tmp instanceof Cat1){//如果tmp进来的是猫就
Cat1 t = (Cat1) tmp;
t.show1();
}else if(tmp instanceof Dog1){//否则 如果进来的是狗就
Dog1 d =(Dog1) tmp;
d.show2();
}else if(tmp instanceof Pig1){
Pig1 p =(Pig1) tmp;
p.show3();
}
}
-
package Day11;
public class Test_03 {
public static void main(String[] args) {
// Manager m =new Manager("000","小");
// m.work();
// m.managerwork();
Employee manager = new Manager("001", "张三丰");
Employee sales = new Sales("002", "欧拉");
Test_03 boss =new Test_03();
boss.show(manager);
boss.show(sales);
}
public static void show(Employee tmp) {// 在Main里普通方法要加static
System.out.println("工号" + tmp.getWorkId());
tmp.work();
if (tmp instanceof Manager) {
Manager m = (Manager) tmp;
m.managerwork();
// tmp.setName("黎经理");
// ((Manager) tmp).managerwork();
} else if (tmp instanceof Sales) {
Sales n = (Sales) tmp;
n.sale();
// tmp.setName("黄经理");
// ((Sales) tmp).managerwork();
}
}
}
class Employee {
private String workId;// workid
private String name;
public Employee() {// 无参构造没有void只有public
super();// 不写也是默认存在的
}
public Employee(String workId, String name) {
super();// 不写也是默认存在的
this.workId = workId;
this.name = name;
}
public void setWorkId(String workId) {
this.workId = workId;
}
public String getWorkId() {
return workId;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void work() {
System.out.println("员工都要开会!");
}
}
class Manager extends Employee {// 经理
public Manager() {// 无参
super();
}
public Manager(String workId, String name) {// 有参
super(workId,name);
}
public void managerwork() {
System.out.println("经理[" + getName() + "],管理普通员工");
}
}
class Sales extends Employee {// 销售
public Sales() {// 无参
super();
}
public Sales(String workId, String name) {// 有参
super(workId,name);
}
public void sale() {
System.out.println("销售部的[" + getName() + "],销售业绩排第一");
}
}
-
- + -
- + -