日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础(五)继承和多态

發(fā)布時間:2024/4/17 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础(五)继承和多态 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  1.多態(tài)

  先來看一個例子,其中Employee類是父類,Manager類繼承了Employee類:

public static void main(String[] args){// construct a Manager objectManager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);boss.setBonus(5000);Employee[] staff = new Employee[3];// fill the staff array with Manager and Employee objects staff[0] = boss;staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);// print out information about all Employee objectsfor (Employee e : staff)System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());}

  在for循環(huán)中,盡管這里將e聲明為Employee類型,但實際上e既可以引用Employee類型的對象,也可以引用Manager類型的對象。當(dāng)e引用Employee對象時,e.getSalary()方法嗲用的是Employee類中的getSalary()方法;當(dāng)e引用Manager對象時,e.getSalary()調(diào)用的是Manager類中的getSalary方法。

  一個對象變量(例如:e)可以指示多種實際類型的現(xiàn)象被稱為多態(tài)(polymorphism)。在運行時能夠自動地選擇調(diào)用哪個方法的現(xiàn)象稱為動態(tài)綁定。

  一個用來判斷是否應(yīng)該設(shè)計為繼承關(guān)系的簡單規(guī)則,就是“is-a”規(guī)則,它表明子類的每個對象也是父類的對象。“is-a”規(guī)則的另一種表述是置換法則。它表明程序中出現(xiàn)的父類對象的任何地方都可以用子類對象置換。

  在Java中,對象變量是多態(tài)的。也就是,一個對象變量既可以引用它本身的類對象,也可以引用它的任何一個子類的對象。

?

  2.抽象類

  父類中抽象方法可以不用實現(xiàn),為了提高程序的清晰度,包含一個或多個抽象方法的類本身必須被聲明為抽象的。

  除了抽象方法外,抽象類還可以包含具體數(shù)據(jù)和具體方法。

  抽象方法充當(dāng)著占位的角色,它們的具體實現(xiàn)在子類中。擴(kuò)展抽象類可以有兩種選擇:一種是在抽象類中定義部分抽象類方法或者不定義抽象類方法,這樣就必須將子類也標(biāo)記為抽象類;另一種是定義全部的抽象方法,這樣一來,子類就不是抽象的了。

  類即使不含抽象方法,也可以將類聲明為抽象類。

  抽象類不能被實例化。也就是說,如果一個類聲明為abstract,就不能使用創(chuàng)造這個類的對象,但是可以創(chuàng)建一個具體子類的對象。同時,可以定義一個抽象類的對象變量,但是它只能引用非抽象子類的對象。

  例如:Person類是抽象類,Student是具體子類。

?

Person p = new Student();

?

?

  3.受保護(hù)訪問protected

  在前面我們知道了,最好將類中的域標(biāo)記為private,因為任何聲明為private的內(nèi)容對其他類都是不可見的,這對于子類來說也完全適用,即就連子類也不能訪問父類的私有域。

  如果希望父類中的某些方法允許被子類訪問,或允許子類的方法訪問父類的某個域,可以將這些方法或域聲明為protected。

  在實際應(yīng)用中,要謹(jǐn)慎使用protected。如果需要將設(shè)計的類提供給其他程序員使用,而在這個域中設(shè)置了一些受保護(hù)域,由于其他程序員可以由這個類再派生出新類,同時可以訪問其中的受保護(hù)域。在這種情況下,如果需要對這個類的實現(xiàn)進(jìn)行修改,就必須通知所有使用這個類的程序員。這違背了OOP提倡的數(shù)據(jù)封裝原則。

?

  4總結(jié)Java中用于控制可見性的4個訪問控制符

  • private-僅對本類可見
  • public-對任何類都可見
  • protected-對本包和所有子類可見
  • 沒有修飾符-對本包可見

  

  5.總結(jié)繼承的設(shè)計技巧

  • 將公共操作和域放在父類
  • 不要使用受保護(hù)的域

  protected定義的實例域并不能帶來更好地保護(hù),原因主要有兩點:(1)子類集合時無限制的,任何一個人都能夠由某個類派生一個子類,并編寫代碼以直接訪問protected的實例域,從而破壞了封裝性。(2)在Java中,同一個包中的所有類都可以訪問protected域,而不管它是否為這個類的子類。

  • 使用繼承實現(xiàn)“is-a”關(guān)系
  • 除非所有繼承的方法都有意義,否則不要使用繼承
  • 在覆蓋方法時,不要改變預(yù)期的行為
  • 使用多態(tài),而非類型信息

  例如,下面這種情況就應(yīng)該考慮使用多態(tài)性,如果兩個action是相同的概念,就應(yīng)該為這個概念定義一個方法,并將其放置在兩個類的父類或接口中。

if(x是類型1)action(x); else if (x是類型2)action(x);
  • 不要過多地使用反射

?  反射是很脆弱的,即編譯器很難幫助人們發(fā)現(xiàn)程序中的錯誤,因此只有在運行時才發(fā)現(xiàn)錯誤并導(dǎo)致異常。

轉(zhuǎn)載于:https://www.cnblogs.com/BigJunOba/p/9321606.html

總結(jié)

以上是生活随笔為你收集整理的Java基础(五)继承和多态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。