!!!本來是放想放日記里的結果發現首頁看不到..這就尷尬了,又重新復制一遍.
因為個人的文化素養太低,所以寫得不好,請多多包涵!
今天講了類的繼承,繼承中方法的重寫(覆蓋).
首先是繼承,顧名思義,子承父業,子類繼承父類的部分資源,要繼承先要滿足一個條件,即判斷兩個類是否能構成繼承關系,比如你只能繼承你老爸的財產,當然有例外,如你對一個老人有恩,他又膝下無子,可能會把財產給你,但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
上面是練習繼承的題,今天就學到這了,感覺講課好慢,這幾天的大多是理論,感覺難受,還是喜歡邏輯思考!
我喜歡考試,但是不喜歡,做作業,這可怎么是好.
