Java基礎語法(六)
阿新 • • 發佈:2020-12-25
技術標籤:Javajava類classintellij 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();
}
}
如上例,Pig
和 Dog
有公共的成員屬性 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; //定義全域性常量
}