面向對象-類的繼承,方法重寫


  !!!本來是放想放日記里的結果發現首頁看不到..這就尷尬了,又重新復制一遍.

  因為個人的文化素養太低,所以寫得不好,請多多包涵!

  今天講了類的繼承,繼承中方法的重寫(覆蓋).

  首先是繼承,顧名思義,子承父業,子類繼承父類的部分資源,要繼承先要滿足一個條件,即判斷兩個類是否能構成繼承關系,比如你只能繼承你老爸的財產,當然有例外,如你對一個老人有恩,他又膝下無子,可能會把財產給你,但java中沒有這種例外(反正我目前沒發現有特殊哈,如有特殊請注明回復,多謝!),又如,筆記本類,電腦類,電器類,筆記本是電腦類的子類,電腦類是電器類的子類,java中只能單繼承不能多層繼承,java中的類是單根性的,即一個子類只能有一個父類,一個父類可以有多個子類.子類不是父類的子集,而是父類的擴展,用關鍵字  extends(擴展,延伸) 表示: 電腦 extends 電器;

  另外,還有部分資源不能被繼承:

    1.父類的 private(私有) 成員(屬性和方法);

    2.不同包中的 默認修飾符(default) 成員;

    3.構造函數(構造方法);

  繼承的語法結構:

    <修飾符> class 子類名 extends 父類{

        屬性聲明;

        方法聲明;

    }

 在這里需要用到調用父類屬性,方法的關鍵字 super 和 this,它們有什么區別呢:

super:

  代指父類或父類的父類的對象引用,可以訪問子類能夠繼承的成員,可以訪問父類的構造函數,不但可以訪問父類 ,還能訪問父類的父類的父類......

this:

  代指當前類的對象引用,當通過this調用某個屬性或方法時,如果本類中沒有,將會在父類或父類的父類..中查找,只是優先本類中.

方法重寫(覆蓋),在此寫一下前面的方法重載,看一下他們的區別

  方法重寫:

    1.分別在父類和子類中

    2.方法完全相同(返回值相同,參數列表相同)

    3.子類的修飾符大於或等於父類修飾符的范圍(不能比父類小)

  方法重載:

    1.方法名相同

    2.在同一個類中

    3.參數順序,類型,數量不同

    4.跟返回值,修飾符,參數名無關

以上是兩者的區別.注意不要混淆了.

在此附一個修飾符權限范圍表

私有    默認      保護   公共

private < default < protected < public    <--修飾符
同類        v      v        v    <--同一個類中
x          同包      v      v    <--同一個包中
x        x      子類      v      <--子類(包類,外)
x        x       x     整體    <--整體項目

 

這里有三個類:

1.

//創建一個圓類(父類)
public class Circle {
  private double radius;// 半徑(私有)

  public Circle() {
    radius = 1;// 無參構造函數初始化radius為1
  }

  // 下面是封裝,只是演示就不設置條件了直接返回值給方法
  public double getRadius() {
    return radius;
  }

                //形參,由實參傳遞過來 

  public void setRadius(double radius) {
    this.radius = radius;//藍色屬性是指本類的成員radius,this代指本類,綠色radius通過實參傳過來的變量
  }

  // 計算圓的面積
  public double findArea() {
  // 面積公式,還是問人的,十幾年沒用過都忘了,2*半徑*3.14(符號怎么打?尷尬)
    return this.radius * this.radius * 3.14;

  }
}

 

2.

//創建一個圓柱體類繼承上面的圓(子類)
public class Cylinder extends Circle {
  private double length;// 圓柱的高度(長度也可以,咳..)

   public Cylinder() {
     length = 1;// 初始化
   }

   // 這里也不附加限制條件了
   public double getLength() {
     return length;
   }

   public void setLength(double length) {
     this.length = length;
   }

   // 計算圓柱的體積,從父類調用圓的面積算法*高
   public double findVolume() {
     return super.findArea() * this.length;//super 調用父類方法
   }

   // 這個是計算圓柱的表面積的也是調用父類的圓算法,圓柱有兩個圓嘛,再加上側面是長方形,知道一條

   //邊了.另一條可以用底部圓的半徑來算它的周長,即是長方形的邊長
   public double findArea() {
     return super.findArea() * 2 + 2 * 3.14 * getRadius() * length;
   }
}

 

3.

//測試類
public class TestCylinder {
  public static void main(String[] args) {
    // 創建圓柱的對象
    Cylinder cylinder = new Cylinder();
    // 調用圓柱類繼承過來的半徑radius賦值
    cylinder.setRadius(5);
    // 輸出給半徑的值
    System.out.println("半徑:" + cylinder.getRadius());
    // 調用圓柱類的高度賦值
    cylinder.setLength(10);
    // 輸出
    System.out.println("高:" + cylinder.getLength());
    // 調用體積計算方法
    System.out.println("體積:" + cylinder.findVolume());
    // 調用表面積計算方法
    System.out.println("表面積:" + cylinder.findArea());
    // 下面是圓的對象
    Circle circle = new Circle();
    // 賦值半徑
    circle.setRadius(2);
    // 調用父類的面積計算方法
    System.out.println("圓的面積:" + circle.findArea());
  }
}

 

這里是測試的輸出:

半徑:5.0
高:10.0
體積:785.0
表面積:471.0
圓的面積:12.56

上面是練習繼承的題,今天就學到這了,感覺講課好慢,這幾天的大多是理論,感覺難受,還是喜歡邏輯思考!

我喜歡考試,但是不喜歡,做作業,這可怎么是好.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM