繼承 概念: ① 繼承背後的思想就是基於已存在的類來構建新類; ② 當從已存在類繼承時,就重用了它的方法和屬性,還可以添加新的方法和屬性來定製新類以應對需求; ③ 當從其它類導出的類叫作子類,被導出的類叫作父類; ④ 在Java中,除了Object類外,所有類都是子類,都有唯一父類; ⑤ 繼承在OO
繼承
概念:
① 繼承背後的思想就是基於已存在的類來構建新類;
② 當從已存在類繼承時,就重用了它的方法和屬性,還可以添加新的方法和屬性來定製新類以應對需求;
③ 當從其它類導出的類叫作子類,被導出的類叫作父類;
④ 在Java中,除了Object類外,所有類都是子類,都有唯一父類;
⑤ 繼承在OO中不可或缺;
⑥ 創建一個類時,總是在繼承;
類之間關係:Is-a繼承體現,Has-a組合體現,Like-a實現介面體現;
繼承的意義:代碼重用,體現不同抽象層次;
父子類關係:父類更抽象,更一般;子類更具體,更特殊;
繼承的特點:1、子類繼承父類的成員;2、具有層次結構;
繼承的優點:1、代碼重用;2、父類欄位和方法可用於子類;3、從抽象到具體形成類的結構體系;4、可輕鬆定義子類;
實現:
在Java中,用extends關鍵字來表示一個類繼承了另一個類;
public class Teacher extends Person{
//代碼
}
super關鍵字
特點:
① Super代表父類對象的引用,this代表當前對象的引用;
② 當子父類的成員出現重名時,可以通過super來進行區分;
③ 子類的構造方法中,通過super關鍵字調用父類的構造方法;
public class JavaTeacher extends Teacher(){
public JavaTeacher(String name,String school){
//通過調用父類的構造方法,完成對相關欄位值的初始化
super(name,school);
}
}
☆當構造一個類對象的時候一定會先調用父類的構造方法來構造父類的對象,調用父類的構造方法的語句必須是子類構造方法中的第一條指令;
的
1 public class TeacherDemo{
2 public static void main(String []args){
3 B b=new B();
4
5 //父類中加上showB()方法之後,調用的是子類的showB();
6
7 //若要調用父類的showB();在子類中加上super.showB();
8 b.showB();
9 }
10 }
11
12 class A{
13 public A(){
14 System.out.println("A的構造方法");
15 }
16 public void showA(){
17 System.out.println("A");
18 }
19
20 public void showB(){
21 System.out.println("父類中的showB方法");
22 }
23 }
24
25 class B extends A{
26 public B(){
27 //super();//調用父類無參的構造方法,可以省略
28 System.out.println("B的構造方法");
29 }
30
31 public void showB(){
32 System.out.println("B");
33 //showA();//子類繼承父類,可以調用,同super.showA(); 因為名稱未衝突
34 super.showB();
35
36 }
37 }
View Code
下麵這份代碼更清晰的表達了繼承
1 public class TeacherDemo{
2 public static void main(String []args){
3 JavaTeacher jTeacher=new JavaTeacher("張三","清華");
4 jTeacher.teaching();
5
6 DBTeacher dTeacher=new DBTeacher("李四","清華");
7 dTeacher.teaching();
8 }
9 }
10
11 class Teacher{
12 private String name;
13 private String school;
14
15 public Teacher(String name,String school){
16 this.name=name;
17 this.school=school;
18 }
19
20 public void teaching(){
21 System.out.println("授課前準備");
22 }
23 }
24
25 class JavaTeacher extends Teacher{
26 public JavaTeacher(String name,String school){
27 super(name,school);
28 }
29
30 public void teaching(){
31 super.teaching();//調用父類teaching
32 System.out.println("打開eclipse");
33 System.out.println("書寫java代碼");
34 }
35 }
36
37 class DBTeacher extends Teacher{
38 public DBTeacher(String name,String school){
39 super(name,school);
40 }
41
42 public void teaching(){
43 super.teaching();//調用父類teaching
44 System.out.println("打開Oracle");
45 System.out.println("書寫pl-sql指令");
46 }
47 }
View Code
final關鍵字
① final可以用來修飾變數、方法、類;
② final修飾的變數是一個常量,一旦賦了值就不能在修改。(常量一般都和static關鍵字配合使用);
③ final修飾類代表此類不能被繼承;
④ final修飾方法代表此類方法不能被重寫;
showNumber2未加final前
1 public class FinalDemo{
2 public static void main(String []args){
3 A a=new A();
4 a.showNumber1();
5
6 B b=new B();
7 b.showNumber2();
8 }
9 }
10
11 class A{
12 public final int number1=1;//常量
13 public int number2=2;
14 public void showNumber1(){
15 //number1++;//不能被修改
16 System.out.println(number1);
17 }
18 public void showNumber2(){
19 System.out.println(number2);
20 }
21 }
22
23 class B extends A{
24 public void showNumber2(){
25 System.out.println(number2);
26 }
27 }
View Code
在A中的showNumber2方法中加上final報錯
在A類前加上final也會報錯
final用在引用變數上,代表次引用變數只能引用剛一開始所引用的變數,中途不能改變指向
1 public class FinalDemo{
2 public static void main(String []args){
3 A a=new A();
4 a.showNumber1();
5
6 B b=new B();
7 b.showNumber2();
8
9 //可以修改
10 final A a2=new A();
11 a2.number2=5;
12 a2.showNumber2();//列印5
13
14 /*a2=new A();*/ //final用在引用變數上,代表次引用變數只能引用剛一開始所引用的變數,中途不能改變指向
15 }
16 }
17
18 //常量類不能被繼承
19 /*final*/ class A{
20 public final int number1=1;//常量
21 public int number2=2;
22 public void showNumber1(){
23 //number1++;//不能被修改
24 System.out.println(number1);
25 }
26 //子類不能對父類中的常量方法進行改寫(重寫)
27 public /*final*/ void showNumber2(){
28 System.out.println(number2);
29 }
30 }
31
32 class B extends A{
33 public void showNumber2(){
34 System.out.println(number2);
35 }
36 }
View Code
Object類常見方法
Java中,所有類都直接或間接繼承自java.lang.Object類,可以說Object是java中所有類的祖先即根類;
Java中任何類都繼承了Object類中的方法,只要有toString(),equals(),hashcode(),clone(),getClass(),finalizw()
String toString()
① 返回該對象的字元串描述性信息。預設輸出的格式是:類名[欄位值,欄位值…];
② 只要對象與一個字元串通過“+”連接,系統就自動調用toString()以獲得對象的字元串描述;
③ 常被改寫,可以根據用戶的需求對其進行重寫;
boolean equals()
① Object類原始功能是實現判斷兩個對象是否具有相同引用;要求判斷兩個對象狀態的相等性;
② 在jdk標準庫中提供了一些類,比如String,Date都對equals方法進行了重寫;
③ 常被改寫,可以根據用戶的需求對其進行重寫;
1 public class ObjectDemo{
2 public static void main(String []args){
3 Student stu1=new Student("張三",20);
4 System.out.println(stu1);//列印對象 輸出Student@2a139a55 @之前是類名,之後是哈希碼(可以認為是堆記憶體中的地址)
5
6 System.out.println(stu1.toString());
7 //未重寫toString()之前 輸出與以上內容相同,但Student中未編寫toString()方法,
8 //也可以使用是因為它預設繼承了Object類,該類中有toString()方法
9 //重寫toString()之後,輸出內容為重寫之後的內容
10
11 Student stu2=new Student("張三",20);
12
13 //未重寫equals()方法之前
14 System.out.println(stu2.equals(stu1));//輸出false,不是指向同一個對象
15 System.out.println(stu2.equals(stu2));//輸出true
16 //重寫equals方法之後,如下則全部輸出true
17 }
18 }
19
20 //加上與不加上繼承Object是一樣的,預設就會繼承
21 class Student /*extends Object*/{
22 private String name;
23 private int age;
24
25 public Student(String name,int age){
26 this.name=name;
27 this.age=age;
28 }
29
30 //重寫Object中的toStirng()方法
31 public String toString(){
32 return "姓名:"+name+",年齡:"+age;
33 }
34
35
36 //重寫equals方法
37 public boolean equals(Object obj){
38 //自己與自己比
39 if(this==obj){
40 return true;
41 }
42 if(obj==null)
43 {
44 return false;
45 }
46 if(this.getClass()!=obj.getClass())
47 {
48 return false;
49 }
50
51 Student stu=(Student)obj;
52 if(this.age!=stu.age)
53 {
54 return false;
55 }
56 if(this.name==null)
57 {
58 if(stu.name!=null)
59 {
60 return false;
61 }
62 }
63 else if(!this.name.equals(stu.name)){
64 return false;
65 }
66
67 return true;
68 }
69 }
View Code