面向對象的三大特性之二——繼承(含super的使用)


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;子類的訪問權限要大於等於父類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM