国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 轉型(向上或向下轉型)詳解及簡單實例

Java 轉型(向上或向下轉型)詳解及簡單實例

2020-08-20 11:22Java之家 Java教程

這篇文章主要介紹了Java 轉型(向上或向下轉型)詳解及簡單實例的相關資料,需要的朋友可以參考下

Java編程中經常碰到類型轉換,對象類型轉換主要包括向上轉型和向下轉型。

向上轉型

我們在現實中常常這樣說:這個人會唱歌。在這里,我們并不關心這個人是黑人還是白人,是成人還是小孩,也就是說我們更傾向于使用抽象概念“人”。再例如,麻雀是鳥類的一種(鳥類的子類),而鳥類則是動物中的一種(動物的子類)。我們現實中也經常這樣說:麻雀是鳥。這兩種說法實際上就是所謂的向上轉型,通俗地說就是子類轉型成父類。這也符合Java提倡的面向抽象編程思想。來看下面的代碼:

?
1
2
3
4
5
6
package a.b;
public class A {
public void a1() {
    System.out.println("Superclass");
}
}

A的子類B:

?
1
2
3
4
5
6
7
package a.b;
public class B extends A {
public void a1() {
    System.out.println("Childrenclass"); //覆蓋父類方法
}
    public void b1(){} //B類定義了自己的新方法
}

C類:

?
1
2
3
4
5
6
7
package a.b;
public class C {
public static void main(String[] args) {
    A a = new B(); //向上轉型
    a.a1();
}
}

如果運行C,輸出的是Superclass 還是Childrenclass?不是你原來預期的Superclass,而是Childrenclass。這是因為a實際上指向的是一個子類對象。當然,你不用擔心,Java虛擬機會自動準確地識別出究竟該調用哪個具體的方法。不過,由于向上轉型,a對象會遺失和父類不同的方法,例如b1()。有人可能會提出疑問:這不是多此一舉嗎?我們完全可以這樣寫:

?
1
2
B a = new B();
a.a1();

確實如此!但這樣就喪失了面向抽象的編程特色,降低了可擴展性。其實,不僅僅如此,向上轉型還可以減輕編程工作量。來看下面的顯示器類Monitor:

?
1
2
3
4
5
package a.b;
public class Monitor{
public void displayText() {}
public void displayGraphics() {}
}

液晶顯示器類LCDMonitor是Monitor的子類:

?
1
2
3
4
5
6
7
8
9
package a.b;
public class LCDMonitor extends Monitor {
public void displayText() {
    System.out.println("LCD display text");
}
public void displayGraphics() {
    System.out.println("LCD display graphics");
}
}

陰極射線管顯示器類CRTMonitor自然也是Monitor的子類:

?
1
2
3
4
5
6
7
8
9
package a.b;
public class CRTMonitor extends Monitor {
public void displayText() {
    System.out.println("CRT display text");
}
public void displayGraphics() {
    System.out.println("CRT display graphics");
}
}

等離子顯示器PlasmaMonitor也是Monitor的子類:

?
1
2
3
4
5
6
7
8
9
package a.b;
public class PlasmaMonitor extends Monitor {
public void displayText() {
    System.out.println("Plasma display text");
}
public void displayGraphics() {
    System.out.println("Plasma display graphics");
}
}

現在有一個MyMonitor類。假設沒有向上轉型,MyMonitor類代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package a.b;
public class MyMonitor {
public static void main(String[] args) {
    run(new LCDMonitor());
    run(new CRTMonitor());
    run(new PlasmaMonitor());
}
public static void run(LCDMonitor monitor) {
    monitor.displayText();
    monitor.displayGraphics();
}
public static void run(CRTMonitor monitor) {
    monitor.displayText();
    monitor.displayGraphics();
}
public static void run(PlasmaMonitor monitor) {
    monitor.displayText();
    monitor.displayGraphics();
}
}

可能你已經意識到上述代碼有很多重復代碼,而且也不易維護。有了向上轉型,代碼可以更為簡潔:

?
1
2
3
4
5
6
7
8
9
10
11
12
package a.b;
public class MyMonitor {
public static void main(String[] args) {
    run(new LCDMonitor());           //向上轉型
    run(new CRTMonitor());           //向上轉型
    run(new PlasmaMonitor());      //向上轉型
}
public static void run(Monitor monitor) { //父類實例作為參數
    monitor.displayText();
    monitor.displayGraphics();
}
}

我們也可以采用接口的方式,例如:

?
1
2
3
4
5
package a.b;
public interface Monitor {
abstract void displayText();
abstract void displayGraphics();
}

將液晶顯示器類LCDMonitor稍作修改:

?
1
2
3
4
5
6
7
8
9
package a.b;
public class LCDMonitor implements Monitor {
public void displayText() {
    System.out.println("LCD display text");
}
public void displayGraphics() {
    System.out.println("LCD display graphics");
}
}

CRTMonitor、PlasmaMonitor類的修改方法與LCDMonitor類似,而MyMonitor可以不不作任何修改。

可以看出,向上轉型體現了類的多態性,增強了程序的簡潔性。

向下轉型

子類轉型成父類是向上轉型,反過來說,父類轉型成子類就是向下轉型。但是,向下轉型可能會帶來一些問題:我們可以說麻雀是鳥,但不能說鳥就是麻雀。來看下面的例子:

A類:

?
1
2
3
4
5
6
package a.b;
public class A {
void aMthod() {
    System.out.println("A method");
}
}

A的子類B:

?
1
2
3
4
5
6
7
8
9
package a.b;
public class B extends A {
void bMethod1() {
    System.out.println("B method 1");
}
void bMethod2() {
    System.out.println("B method 2");
}
}

C類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package a.b;
public class C {
   public static void main(String[] args) {
      A a1 = new B(); // 向上轉型
      a1.aMthod();  // 調用父類aMthod(),a1遺失B類方法bMethod1()、bMethod2()
      B b1 = (B) a1; // 向下轉型,編譯無錯誤,運行時無錯誤
      b1.aMthod();  // 調用父類A方法
      b1.bMethod1(); // 調用B類方法
      b1.bMethod2(); // 調用B類方法
      A a2 = new A();
      B b2 = (B) a2; // 向下轉型,編譯無錯誤,運行時將出錯
      b2.aMthod();
      b2.bMethod1();
      b2.bMethod2();
   }
}

從上面的代碼我們可以得出這樣一個結論:向下轉型需要使用強制轉換。運行C程序,控制臺將輸出:

?
1
2
3
4
5
6
Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
        a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2

其實黑體部分的向下轉型代碼后的注釋已經提示你將發生運行時錯誤。為什么前一句向下轉型代碼可以,而后一句代碼卻出錯?這是因為a1指向一個子類B的對象,所以子類B的實例對象b1當然也可以指向a1。而a2是一個父類對象,子類對象b2不能指向父類對象a2。那么如何避免在執行向下轉型時發生運行時ClassCastException異常?使用5.7.7節學過的instanceof就可以了。我們修改一下C類的代碼:

?
1
2
3
4
5
6
7
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}

這樣處理后,就不用擔心類型轉換時發生ClassCastException異常了。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/qq_35101189/article/details/57417933

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧洲免费视频 | 91 在线观看| 观看av| 黄色小视频在线观看 | 欧美精品亚洲精品 | 日韩一级视频 | 日韩av在线一区 | 亚洲欧美中文日韩在线v日本 | 污色视频在线观看 | 精品久久久久久国产 | 一区二区三区精品视频 | 国产羞羞视频免费在线观看 | 国产一区二区在线免费观看 | 亚洲淫视频 | 国产伦精品一区二区三区高清 | 免费看a| 欧美视频一区 | 日韩在线不卡 | 国产黄色在线观看 | 色一色网站| 午夜影院在线观看 | 日韩在线精品 | 亚洲香蕉视频 | 中文在线一区二区 | 亚洲综合一二区 | 久草在线视频网 | 成人视屏免费看 | 久久精品一区二区 | 免费看国产片在线观看 | 精品国产一区二区三区小蝌蚪 | 亚洲电影在线观看 | 黄色片视频免费在线观看 | 日韩和欧美一区二区 | 日韩av片无码一区二区不卡电影 | 一区二区三区欧美 | 久久久久久久久久久福利观看 | 欧美黄色www | 美日韩免费视频 | 亚洲精品乱码久久久久久蜜桃91 | 欧美三区二区一区 | 午夜成人在线视频 |