『壹』 java中什麼是繼承
繼承在本職上是特殊一般的關系,即常說的is-a關系。子類繼承父類,表明子類是一種特殊的父類,並且具有父類所不具有的 一些屬性或方法。
1.Java繼承的語法格式:
Java繼承的關鍵字是:extends
public class 子類名 extends 父類名{...}
如: public class UNStudent extends Student {...} 註:1.子類又稱超類,拓展類 ;父類又稱基類。
2.Java中類的繼承只能是單繼承(單根繼承),即一個類只能繼承一個父類,但是一個類可以由多個類來繼承它。
3.Java會給每一個沒有設置父類的類,自動添加一個父類就是Object 。
(1)java繼承特點擴展閱讀:
一、子類繼承父類的結果
1.子類繼承父類後,繼承到了父類所有的屬性和方法。註:是所有。
2.子類可調用的方法也要看情況而定:
子類和父類在同一個包下時 「子類和子類的對象」可以調用父類的默認的,受保護的,公有的屬性以及方法。
子類和父類在不同的包下時,在子類中可以調用受保護的,公有的屬性以及方法,而子類的對象可以調用受保護的,公有的屬性以及方法。
二、方法的重寫
1.當子類和父類都有某種方法,而子類的方法更加要求細致,或者實現功能不同,就需要方法的重寫。
2.重寫條件
①必須要存在繼承關系;只有繼承之間的關系才能有方法的重寫
②方法的返回值類型,方法名,參數個數,參數類型,參數順序,必須要完全一致;
如:父類中方法 public void play (int n ; String s){方法體1...}
重寫後的子類方法public void play(int n ; String s){方法體2...}
3.子類重寫方法時的訪問修飾符可以大於或者等於父類方法的訪問修飾符。
4.重寫後的方法會被優先調用。
三、自動轉型
自動轉型的實現要求有繼承關系
格式如下:父類名 對象名 = new 子類構造方法;
如:Student stu = new UNStudent;
而強制轉型格式如下:子類名 對象名 = (子類名)父類對象名
如:UNStudent un = (Student)stu;
自動轉型可以拓寬方法的作用訪問域
在使用自動轉型後,子類自己定義的方法是不能在自動轉型後執行;
原因是因為Java的編譯機制,它會優先判斷父類中是否存在該方法,如果存在則通過編譯,如果不存在則報錯。
第二種自動轉型:轉型後只需要不同類的不同對象調用想吐的方法,很方便!
/**訪問修飾符 返回值數據類型 方法名(父類類型 參數名,...){
調用方法。
}
父類名 對象名 = new 子類名;
子類名 對象名 = new 子類名;
方法名(對象名);
*/
比如拿到駕駛證為A2的人,可以駕駛重型貨車,當然也可以駕駛大型貨車,中型貨車,小型貨車,小客車,小轎車,摩托車... 可以選擇第二種自動轉型的方法,便於調用同一個方法。
自動轉型好處:1.減少冗餘代碼;2.在方法設置參數時,擴大訪問范圍。
四、多態
多態是由方法重載,繼承,方法重寫,自動轉型等技術的組合。
五、為什麼需要繼承?
1.提高代碼的重用性。
2.提高程序的擴展性。
JAVA繼承總結
『貳』 java 中的繼承的 優點和缺點 主要是缺點
java 中的繼承的 優點和缺點如下:
優點:1.可以使用父類的所有非私有方法;而且單繼承可由介面來彌補。
2.可以繼承父類中定義的成員方法以及成員變數,使得子類可以減少代碼的書寫。還可以重寫父類的方法以增加子類的功能。
缺點:1.耦合性太大
2.就是破壞了類的封裝性,其實繼承一般多用於抽象方法的繼承和介面的實現
『叄』 談談Java中的繼承與組合
繼承和組合的概念
在新類里簡單地創建原有類的對象 我們把這種方法叫作 組合 因為新類由現有類的對象合並而成 我們只是簡單地重復利用代碼的功能 而不是採用它的形式
第二種方法是創建一個新類 將其作為現有類的一個 類型 我們可以原樣採取現有類的形式 並在其中加入新代碼 同時不會對現有的類產生影響 這種魔術般的行為叫作 繼承 (Inheritance) 涉及的大多數工作都是由編譯器完成的 對於面向對象的程序設計 繼承 是最重要的基礎概念之一 對於組合和繼承這兩種方法 大多數語法和行為都是類似的(因為它們都要根據現有的類型生成新類型)
組合也就是一個類的對象是另外一個類的成員 一般的程序都有組合的意味 只不過是基本數據類型是成員變數 下面請看具體的例子
class Head
{
Head(){
System out println( head );
}
}
class Body
{
Body(){
System out println( body );
}
}
class Person()
{
Head h=null;
Body b=null;
Person() //人是由頭和身體組成的 Head和Body的對象是Person的一部分
{
h=new Head();
b =new Body();
}
}
繼承作為面向對象的三個重要特性的一個方面 在面向對象的領域有著及其重要的作用 好像沒聽說哪個面向對象的語言不支持繼承
class Person
核扮桐{
private String name=null;
private int age= ;
public Person(String n int a)
{
name=n;
age=a;
}
int getAge()
{
return age;
}
String getName()
{
return name;
}
void getDescription()
{
System out println( name: +name+ + age: +age);
}
}
class Student extends Person
{
private String studno=null;
public Student(String n String no int a)
{
super(n a);
studno=no;
}
}
說明:Student類中有三個成員變數name age studno和一個方法getDescription();
注意:子類繼承了父類的所有變數和函數 只是缺孫子類不能訪問父類的private類型的變數和函數 其實privae類型的變數還是繼承到子類中的
無論還是繼承 都允許我們將子對象置於自己的新類中 大家或許會奇怪兩者間的差異 以及到底該如何選擇
如果想利用新類內部一個現有類的特性 而不想使用它的介面 通常應選擇組合 也就是說 我們可嵌入一個對象 使自己能用它實現新類的特性 但新類的用戶會看到我們已定義的介面 而不是來自嵌入對象的介面 考慮到這種效果 我們改坦需在新類里嵌入現有類的private對象
有些時候 我們想讓類用戶直接訪問新類的組合 也就是說 需要將成員對象的屬性變為public 成員對象會將自身隱藏起來 所以這是一種安全的做法 而且在用戶知道我們准備合成一系列組件時 介面就更容易理解 car(汽車)對象便是一個很好的例子
class Engine {
public void start() {}
public void rev() {}
public void stop() {}
}
class Wheel {
public void inflate(int psi) {}
}
class Window {
public void rollup() {}
public void rolldown() {}
}
class Door {
public Window window = new Window();
public void open() {}
public void close() {}
}
public class Car {
public Engine engine = new Engine();
public Wheel[] wheel = new Wheel[ ];
public Door left = new Door()
right = new Door(); // door
Car() {
for(int i = ; i < ; i++)
wheel[i] = new Wheel();
}
public static void main(String[] args) {
Car car = new Car();
car left window rollup();
car wheel[ ] inflate( );
}
} ///:~
由於汽車的裝配是故障分析時需要考慮的一項因素(並非只是基礎設計簡單的一部分) 所以有助於客戶程序員理解如何使用類 而且類創建者的編程復雜程度也會大幅度降低
如選擇繼承 就需要取得一個現成的類 並製作它的一個特殊版本 通常 這意味著我們准備使用一個常規用途的類 並根據特定的需求對其進行定製 只需稍加想像 就知道自己不能用一個車輛對象來組合一輛汽車——汽車並不 包含 車輛 相反 它 屬於 車輛的一種類別 屬於 關系是用繼承來表達的 而 包含 關系是用組合來表達的
protected
現在我們已理解了繼承的概念 protected這個關鍵字最後終於有了意義 在理想情況下 private成員隨時都是 私有 的 任何人不得訪問 但在實際應用中 經常想把某些東西深深地藏起來 但同時允許訪問衍生類的成員 protected關鍵字可幫助我們做到這一點 它的意思是 它本身是私有的 但可由從這個類繼承的任何東西或者同一個包內的其他任何東西訪問 也就是說 Java中的protected會成為進入 友好 狀態
我們採取的最好的做法是保持成員的private狀態——無論如何都應保留對基 礎的實施細節進行修改的權利 在這一前提下 可通過protected方法允許類的繼承者進行受到控制的訪問
import java util *;
class Villain {
private int i;
protected int read() { return i; }
protected void set(int ii) { i = ii; }
public Villain(int ii) { i = ii; }
public int value(int m) { return m*i; }
}
public class Orc extends Villain {
private int j;
public Orc(int jj) { super(jj); j = jj; }
public void change(int x) { set(x); }
} ///:~
可以看到 change()擁有對set()的訪問許可權 因為它的屬性是protected(受到保護的)
再論合成與繼承
lishixin/Article/program/Java/hx/201311/26635