Java 繼承 與 抽象類
Java 繼承 與 抽象類
繼承
1、一個類 從另一個類中派生而來,就是繼承。
2、繼承也是面嚮物件語言的三大特徵之一。 面向物件的語言都具有三大特徵,分別是 封裝,繼承,多型。
3、什麼時候需要繼承?
建立類時,如果已有的某個類中的成員變數或成員方法與當前類相同,此時就可以考慮採用繼承的方式。
4.繼承時 要使用 extends關鍵字
public class son extends father{
public static void main(String[] args) {
}
}
class father {
}
5.被繼承的類 我們一般稱為 超類(或父類)。; 繼承超類的類 稱為 子類。在Java中允許多重繼承,C繼承 B B 繼承 A ;
6.超類中 非私有的成員變數和成員方法可以被子類繼承,亦這些成員變數和方法成為了子類的成員變數和方法。如果是私有的成員變數和方法不能被繼承。在子類中也不可以被使用。
public class son extends father{
public static void main(String[] args) {
new son();
}
public son(){
super.kiri="牛基" ;
System.out.println(super.kiri);
}
}
class father{
private String name;
public String kiri="李四";
private void nameti(){
System.out.println("張三");
}
}
7.有可能 子類 中定義的成員變數 與超類中的 成員變數同名,此時我們通過子類來使用該成員變數時,使用的是子類中的成員變數。
public class son extends father {
public static void main(String[] args) {
new son();
}
public son(){
super.kiri="牛基";
nameti();
}
@Override
public void nameti(){
System.out.println("張三的兒子");
}
}
class father{
private String name;
public String kiri="李四";
public void nameti(){
System.out.println("張三");
}
}
8.在成員變數 同名情況下,如果子類要使用父類的同名的成員變數。需要在成員變數前 加super關鍵。此時super表示的就是父類的物件。
public class son extends father{
private String kiri="李四的兒子";
public static void main(String[] args) {
new son();
}
public son(){
System.out.println(super.kiri);
}
@Override
public void nameti(){
System.out.println("張三的兒子");
}
}
class father{
private String name;
public String kiri="李四";
public void nameti(){
System.out.println("張三");
}
}
9.如果子類中具有與父類同名的方法(引數完全相同)。此時會發生方法的覆蓋。這就是方法的重寫。如果設計子類時,如果父類中的某個方法不滿足子類的要求,就可以進行方法的重寫(子類的方法及引數與父類的某個方法及引數完全一致,返回值和修飾符可以不一致)。在子類中呼叫父類中被重寫的方法也要使用super關鍵。
public class son extends father{
private String kiri="李四的兒子";
public static void main(String[] args) {
new son();
}
public son(){
super.nameti();
}
@Override
public void nameti(){
System.out.println("張三的兒子");
}
}
class father{
private String name;
public String kiri="李四";
public void nameti(){
System.out.println("張三");
}
}
10.在Java中,如果 一個類 繼承了 另一個類,這兩個類就具有了關係,它們具有父類與子類的關係。
11.如果一個子類被例項化,首先要例項化 它的父類的物件,然後用super來引用父類物件並把super交給子類使用。此時super就是一個引用型別的變數,它引用的就是父類的物件,然後再 例項化子類的物件,此時也會給 子類傳遞一個引用型別的變數this,它引用的就是當前子類的物件。
public class son extends father{
private String kiri="李四的兒子";
public static void main(String[] args) {
new son();
}
public son(){
//父類沒有無參構造方法時,必須呼叫有參構造方法,且這條語句要在子類構造方法的第一條語句,呼叫
super("父親的有參構造方法");
System.out.println("son");
}
@Override
public void nameti(){
System.out.println("張三的兒子");
}
}
class father{
private String name;
public String kiri="李四";
public void nameti(){
System.out.println("張三");
}
//當寫了構造方法(不管你寫的構造方法是有參的還是無參的)時,預設提供的無參構造方法,將不會被呼叫。
public father(String name){
this.name=name;
System.out.println(name);
}
}
12.任何類被例項化都必須呼叫構造方法,通過構造方法來初始化成員,
13、如果超類沒有無參的構造方法(它一定有帶參的構造方法),子類就必須要有顯示的構造方法,且在構造方法的第一行呼叫超類的構造方法。Super(嘻嘻嘻,xx);之所以這樣,是因為任何類被例項化時都必須對成員變數進行初始化,例項化子類的物件之前必須要例項化超類的物件,以保證超類中的成員變數已經被初始化,如果 超類中有帶參的構造方法,這就說明超類的初始化要通過帶參的構造方法來完成以保證 成員變數能夠接受外部的傳值。
14、在Java中 不允許一次繼承多個類,也就是extends 類名1,類名2…。這種繼承方式稱為多繼承。在C++中允許多繼承。在多繼承的情況下,可能會發生超類的成員變數和成員方法 同名。造成子類的混亂。如果在實際開發中,真的需要進行 多繼承,Java提供了三種解決方案,第一,採用組合的方式(把本就是超類的物件作為子類的一個成員變數);第二種方案就是採用介面,第三種方案 就是採用內部類。
採用組合來實現繼承的功能,可以減少對類的侵入,這也是當前被多數人推崇的方式。
抽象類
在 設計類時,有的類中的方法沒有辦法確定它的具體行為,此時就可以把該方法宣告為抽象的方法。抽象方法需要使用abstract關鍵字進行宣告。
public class son extends father{
}
abstract class father{
}
如果一個類中有抽象的方法,那麼該類就必須宣告為抽象類。
public class son extends father{
@Override
public void nameti() {
}
}
abstract class father{
//abstract 和 public不能省略(但是在介面中可以省略)(介面中對於表達抽象方法)
abstract public void nameti();
}
1.抽象類 不能被例項化為物件。原因在於,在一個具體的物件上,不能夠存在抽象的 成員。
public class son extends father{
public static void main(String[] args) {
father yi=new son(); // 但是可以多型 來使用
yi.nameti();
}
@Override
public void nameti() {
System.out.println("重寫的");
}
}
abstract class father{
abstract public void nameti();
}
2.抽象類只能被繼承,它只能作為超類使用。此時,子類就必須實現抽象類的抽象方法。
3.在 實現抽象方法時,方法上面應該加上 @Override 註釋,這樣的編譯器就知道該方法是重寫或實現超類的方法(抽象方法),如果方法被加上了 @Override ,那麼方法的名稱和引數只能與超類的方法保持一致,否則編譯不能通過。
4.抽象類也可以有自己的構造(也就是也有自己的構造方法),它只能作為超類使用,被子類繼承,所有與繼承有關的規則,在這種情形都適用。
public class son extends father{
public static void main(String[] args) {
new son();
}
public son(){
super("抽象父類構造方法");
System.out.println("son");
}
@Override
public void nameti() {
}
}
abstract class father{
public father(String name){
System.out.println(name);
}
abstract public void nameti();
}