1.繼承的語法:class 子類 extends 父類
例1:
1 class Person 2 { 3 int age; 4 String name; 5 public void print1() 6 { 7 System.out.println("我叫"+name+",今年"+age+"歲。"); 8 } 9 } 10 class Student extends Person 11 { 12 String school; 13 Student(int age,String name,String school) 14 { 15 this.age=age; 16 this.name=name; 17 this.school=school; 18 } 19 public void print2() 20 { 21 System.out.println("我在"+school+"讀書。"); 22 } 23 } 24 public class T02 25 { 26 public static void main(String[] args) 27 { 28 Student s = new Student(21,"Mary","黑龍江科技大學"); 29 s.print1(); 30 s.print2(); 31 } 32 }
2.Java中是單繼承的,不允許多重繼承,但可以使用多層繼承。
即:一個類C只能有一個父類B,類C對類B是單繼承的;而類B只有一個父類A,那么類C對類A就是多層繼承。
class A {} class B extends A {} class C extends B {}
3.Java繼承只能直接繼承父類中的公有屬性和公有方法,而隱含的繼承了私有屬性或私有方法。
修改例1,得到例2:
1 class Person 2 { 3 private int age; 4 String name; 5 public void setAge(int age) 6 { 7 this.age=age; 8 } 9 public int getAge() 10 { 11 return age; 12 } 13 public void print1() 14 { 15 System.out.println("我叫"+name+",今年"+age+"歲。"); 16 } 17 } 18 class Student extends Person 19 { 20 String school; 21 Student(String name,String school) 22 { 23 //setAge(21);//也可以出現在這里,道理同下 24 this.name=name; 25 this.school=school; 26 } 27 public void print2() 28 { 29 print1(); 30 System.out.println("我在"+school+"讀書。"); 31 } 32 } 33 public class T02 34 { 35 public static void main(String[] args) 36 { 37 Student s = new Student("Mary","黑龍江科技大學"); 38 s.setAge(21); 39 s.print2(); 40 } 41 }
從上面例子看出,子類對父類中私有屬性的調用,要借助setter()和getter()方法。即,我們可以通過父類的公有方法(包括構造方法)來訪問父類的私有數據成員。
4.被final修飾的類不能被繼承。
5.super關鍵字的使用。
在上述例1的繼承中,在初始化對象的時候,會默認先調用父類的無參構造方法,然后再調用子類的構造方法。事實上是子類構造方法的首行隱含了一個“super();”語句。下面調用父類有參構造函數來體現super的使用:
1 class Person 2 { 3 int age; 4 String name; 5 Person(int age,String name) 6 { 7 this.age=age; 8 this.name=name; 9 } 10 public void print1() 11 { 12 System.out.println("我叫"+name+",今年"+age+"歲。"); 13 } 14 } 15 class Student extends Person 16 { 17 String school; 18 Student(int age,String name,String school) 19 { 20 super(age,name);//必須寫在第一行,否則不能編譯通過 21 this.school=school; 22 } 23 public void print2() 24 { 25 System.out.println("我在"+school+"讀書。"); 26 } 27 } 28 public class T02 29 { 30 public static void main(String[] args) 31 { 32 Student s = new Student(21,"Mary","黑龍江科技大學"); 33 s.print1(); 34 s.print2(); 35 } 36 }
事實上,super關鍵字的作用就是調用父類中的屬性和方法(包含構造方法)。除特殊需求外,大多數情況是隱式使用,有時候作為和this共同出現區別子類屬性(方法)和父類屬性(方法)。
Student(int age,String name,String school) { super.age=age;//父類屬性 super.name=name;//父類屬性 this.school=school;//子類屬性 }
6.方法的重寫:子類中的方法和父類中的方法的名稱、參數個數和類型、返回值類型等都完全一致時,就稱子類中的方法重寫了父類中的方法。
1 class Father 2 { 3 public void speak() 4 { 5 System.out.println("我叫Tom,我是Alan的父親。"); 6 } 7 } 8 class Son extends Father 9 { 10 public void speak() 11 { 12 System.out.println("我叫Alan,我是Tom的兒子。"); 13 } 14 } 15 public class T02 16 { 17 public static void main(String[] args) 18 { 19 Son p = new Son(); 20 p.speak(); 21 } 22 }
輸出結果:我叫Alan,我是Tom的兒子。
重寫中需要注意的問題:被重寫的方法不能為static;子類的訪問權限要大於等於父類。