1. 程式人生 > 其它 >Java基礎語法(六)

Java基礎語法(六)

技術標籤:Javajavaclassintellij idea

Java基礎語法(六)

繼承

文章目錄

一 面向物件繼承

類繼承

語法:

	class 子類 extends 父類 {}

繼承結構中,很多情況會把子類稱為派生類,把父類稱作超類(後面會有一個關鍵字super)

eg:

	定義一個狗類(Dog),成員屬性有 name, age, sex,方法有eat(), snore() -->(打鼾)
	一個豬類(Pig),成員屬性有 name, age, sex, 方法有eat(), watch()
	父類(Animal)
//定義父類Animal
public class Animal {
    private String name;
    private  int age;
    private  String sex;

    //定義無參構造方法
    public Animal() {
    }

    //定義全參構造方法
    public Animal(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //定義set(),get()方法
public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; } public void eat() { System.out.println("能吃是福!"); } } //定義子類Dog類 class Dog extends Animal { public void watch() { System.out.println("俺能看家"); } } //定義子類Pig類 class Pig extends Animal { public void snore() { System.out.println("吼呼吼呼吼俺會打鼾"); } }

測試類:

public class Test {
    public static void main(String[] args) {

        Pig p = new Pig();
        p.setName("佩奇");
        p.setAge(21);
        p.setSex("boy");
        p.eat();
        p.snore();

        Dog d = new Dog();
        d.setName("哮天犬");
        d.setAge(44);
        d.setSex("man");
        d.eat();
        d.watch();
    }
}

如上例,PigDog 有公共的成員屬性 name, age, sex ,公共的方法 eat() ,把這些公共的屬性,方法封裝到一個父類 Animal 中,以達到精簡程式碼,提高複用性.

子類物件例項化

eg:子類物件例項化,觀察無參構造呼叫

class Person {
    public Person() {   //父類無參構造
        System.out.println("呼叫父類構造例項化物件");
    }
}

class Student extends Person {
    public Student() {      //子類無參構造
        System.out.println("呼叫子類構造例項化物件");
    }
}

public class JavaDemo1 {
    public static void main(String[] args) {
        Student st = new Student();     //例項化子類物件
    }
}

執行結果:

	呼叫父類構造例項化物件
	呼叫子類構造例項化物件

通過執行結果可見,父類構造會被預設呼叫,執行完畢才呼叫了子類構造.
實際上相當於子類的構造方法隱含了一個super().

但是如果父類沒有提供無參構造時,就要通過super(引數...)呼叫指定引數的構造方法,且必須放在子類構造方法首行.

繼承限制

  • 限制一
    一個子類只能繼承一個父類,存在單繼承侷限.

    	class A {}
    	class B {}
    	class C extends A,B {}	//[錯誤]一個子類只能繼承一個父類
    

    但是允許多層繼承.(注意繼承層次不能過多,不建議超過三層)

    	class A {}
    	class B extends A {}
    	class C extends B {}
    
  • 限制二
    對於所有的非私有(no private)操作屬於顯示繼承;而所有的私有操作屬於隱式繼承.
    eg:

//定義父類
public class Person {
    private int idNum;  //私有成員屬性 idNum
    String name;        //成員屬性    name

    public int getIdNum() { //獲取私有屬性
        return idNum;
    }

    public void setIdNum(int idNum) {
        this.idNum = idNum;
    }
}
//定義子類
public class Student extends Person {
    public Student(int idNum, String name) {    //定義構造方法
        setIdNum(idNum);
        this.name = name;
    }

    public String getInfor() {
        return "身份證號碼: " + getIdNum();
    }
}
//測試類
public class Test {
    public static void main(String[] args) {
        Student stu = new Student(456, "湯姆");
        System.out.println(stu.getInfor());
        System.out.println(stu.name);
    }
}

執行結果:

身份證號碼: 456
湯姆

二 覆寫

方法覆寫

在類繼承結構中,子類可以繼承父類所有方法,單父類方法無法滿
足子類設計的需求時,就可以對已有的方法進行擴充,子類中,方法名,返回值型別,引數型別及個數與父類完全相同稱為 方法覆寫.
eg:

//父類定義
class Channel {
    public void connect() {			//父類定義方法
        System.out.println("資源連線!");
    }
}
//子類定義
class DatabaseChannel extends Channel {
    public void connect() {			//子類方法覆寫,保留已有方法名稱
        System.out.println("資料庫連線!");
    }
}

public class Demo4 {
    public static void main(String[] args) {
        DatabaseChannel dataC= new DatabaseChannel();	//例項化子類物件
        dataC.connect();								//呼叫被覆寫的方法
    }
}

執行結果:

資料庫連線!

本例中,子類中定義了與父類結構完全相同的connect方法,利用子類例項化物件呼叫connect方法時呼叫的是被覆寫的方法.
子類若想呼叫覆寫前的方法,只能通過super.connect() 呼叫.

方法覆寫限制

被子類覆寫的方法不能擁有比父類更嚴格的訪問控制權限;
如果父類的方法為private,則子類無法覆寫此方法.

三 final 關鍵字

Java裡final關鍵字用於定義不能被繼承的類,不能被覆寫的方法,常量和全域性常量.

final class Demo1 {}	//此類不能有子類
class Demo2 {
	public final void connect() {}	//方法無法被覆寫
}
class Demo3 {
	private final int ON = 1;	//定義常量
}
class Demo4 {
	public static final int ON = 1;		//定義全域性常量
}