Day11多态部分-6 【1.3 对象的向上转型和向下转型】
【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() + "],銷售業績排第一");
}
} ? ??
-
- + -
- + -
總結
以上是生活随笔為你收集整理的Day11多态部分-6 【1.3 对象的向上转型和向下转型】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day11多态部分-5
- 下一篇: Day11多态部分-6 【1.4 多态的