面向對象的三大特徵:
1. 封裝
2. 繼承
3. 多態.
1、類和類之間的常見關係
1:既然繼承是描述類和類之間的關係,就需要先來了解類和類之間的常見關係
1.1 現實生活的整體與部分
舉例說明
1:現實生活
1:學生 是人
2:狗 是動物
3:球隊包含 球員整體與部分的關係,部分可以刪除和增加
4:筆記本包含 cpu 整體與部分的關係,部分不可以刪除和增加
5:航母編隊包含(航母 護衛艦驅逐艦 艦載機核潛艇)
1.2 java中的類與類關係
java中的類關係
1:is a 關係(學生是人)
2:has a 整體與部分
2、繼承
1:描述一個學生類
1:姓名年齡學號屬性,學習的方法
2:描述一個工人類
1:姓名年齡工號屬性,工作的方法
3:描述一個人類
1:姓名年齡屬性,說話的方法。
4:發現學生類和人類天生有着聯繫,學生和工人都是人。所以人有的屬性和行爲學生和工人都會有。出現類代碼重複
繼承:繼承是通過關鍵字extends體現的。
3、繼承的格式:
class 類名1 extends 類名2{}
4、繼承要注意的事項:
1. 千萬不要爲了減少重複代碼而去繼承,只有真正存在着繼承關係的時候纔去繼承。2. 父類私有的成員不能被繼承。
3. 父類的構造函數不能被繼承。
4. 創建子類對象時默認會先調用父類無參的構造函數。
//人類
class Person{
String name;
private int age;
public Person(String name){
this.name = name;
}
public Person(){
System.out.println("Person類的構造方法被調用了....");
}
public void eat(){
System.out.println(name+"在吃飯...");
}
}
//學生類
class Student extends Person { // Student 就稱作爲Person類的子類, Person類就稱作爲Student的父類(超類、基類)
int num; //學號
public Student(){
System.out.println("Student類的構造方法被調用了....");
}
public void study(){
System.out.println(name+"good good study , day day up");
}
}
class MyClass
{
public static void main(String[] args)
{
Student s = new Student();
/*
s.name = "二狗";
System.out.println("名字:"+ s.name);
s.eat();
*/
}
}
LoveQideMacBook-Pro:Desktop loveqi$ java MyClass
Person類的構造方法被調用了....
Student類的構造方法被調用了....
疑問: 爲什麼要調用父類的構造方法啊?這樣子做的意義在那?
調用父類 的構造方法是可以初始化從父類繼承下去的屬性的。
class Fu{
int x = 10;
String name;
public Fu(String name){
this.name = name;
System.out.println("Fu類d帶參的構造方法...");
}
public Fu(){
System.out.println("Fu類無參的構造方法...");
}
}
class Zi extends Fu{
int x = 20;
public Zi(String name){
super(name); //指定調用父類一個參數的構造函數。
}
public void print(){
System.out.println("x1 = "+ x);
}
}
class MyClass
{
public static void main(String[] args)
{
Zi z = new Zi("大頭兒子");
System.out.println("name= "+z.name);
}
}
運行結果是:
LoveQideMacBook-Pro:Desktop loveqi$ java MyClass
Fu類d帶參的構造方法...
name= 大頭兒子
5、super關鍵字:
super關鍵字代表了父類空間的引用。
super關鍵字的 作用:
1. 子父類存在着同名的成員時,在子類中默認是訪問子類的成員,可以通過super關鍵字指定訪問父類的成員。
2. 創建子類對象時,默認會先調用父類無參的構造方法,可以通過super關鍵字指定調用父類的構造方法。
super關鍵字調用父類構造方法要注意的事項:
1. 如果在子類的構造方法上沒有指定調用父類的構造方法,那麼java編譯器會在子類的構造方法上面加上super()語句。
2. super關鍵字調用父類的構造函數時,該語句必須要是子類構造函數中的第一個語句。
3. super與this關鍵字不能同時出現在同一個構造函數中調用其他的構造函數。因爲兩個語句都需要第一個語句。
6、super關鍵字與this關鍵字的區別:
1. 代表的事物不一致。1) super關鍵字代表的是父類空間的引用。
2) this關鍵字代表的是所屬函數的調用者對象。
2. 使用前提不一致。
1) super關鍵字必須要有繼承關係才能使用。
2) this關鍵字不需要存在繼承關係也可使用。
3. 調用構造函數的區別:
1) super關鍵字是調用父類的構造函數。
2) this關鍵字是調用本類的構造函數。
class Fu{
int x = 10;
String name;
public Fu(){
System.out.println("Fu類無參的構造方法..");
}
public Fu(String name){
this.name = name;
System.out.println("Fu類帶參的構造方法..");
}
public void eat(){
System.out.println("小頭爸爸吃番薯..");
}
}
class Zi extends Fu{
int x = 20;
int num;
public Zi(String name,int num){
super(name); //指定調用了父類帶參的 構造方法...
this(); // 調用本類無參構造方法..
//super(); //指定調用了父類無參構造方法。。。
System.out.println("Zi類帶參的構造方法..");
}
public Zi(){
System.out.println("Zi類無參的構造方法..");
}
public void print(){
System.out.println("x = " +super.x);
}
public void eat(){
System.out.println("大頭兒子吃龍蝦..");
}
}
class MyClass {
public static void main(String[] args)
{
Zi z = new Zi("二蛋");
}
}
運行結果是:
LoveQideMacBook-Pro:Desktop loveqi$ javac MyClass.java
MyClass.java:28: 錯誤: 對this的調用必須是構造器中的第一個語句
this(); // 調用本類無參構造方法..
^
MyClass.java:51: 錯誤: 對於Zi(String), 找不到合適的構造器
Zi z = new Zi("二蛋");
^
構造器 Zi.Zi(String,int)不適用
(實際參數列表和形式參數列表長度不同)
構造器 Zi.Zi()不適用
(實際參數列表和形式參數列表長度不同)
2 個錯誤
子類的構造函數默認第一行會默認調用父類無參的構造函數,隱式語句
super();
1:父類無參構造函數不存在,編譯報錯。
Son(int y) { //super();隱式語句 this.y = y + x; System.out.println("這是子類的有參構造"); } |
子類顯式調用父類構造函數
在子類構造函數第一行通過super關鍵字調用父類任何構造函數。如果顯式調用父類構造函數,編譯器自動添加的調用父類無參數的構造就消失。構造函數間的調用只能放在第一行,只能調用一次。super()和this()不能同時存在構造函數第一行。
Son(int y) { super(y);// 子類顯式調用父類構造函數 this.y = y + x; System.out.println("這是子類的有參構造"); } |
Son(int y) { this(); //不能同時存在構造函數第一行 super(y); this.y = y + x; System.out.println("這是子類的有參構造"); } |
super思考
如果開發者自定義了一個類,沒有顯示的進行類的繼承,那麼該類中成員函數是否可以使用super關健健字?可以使用,繼承了Object類,Object類是所有類的父類。
class MyClass { public void print(){ System.out.println(super.toString()); } public static void main(String[] args){ new Demo7().print(); System.out.println(); } } |
7、繼承特點
1:描述類和類之間的關係
2:降低類和類之間的重複代碼
1)降低對象和對象之間的代碼重複使用靜態變量
2:降低類和類之間的代碼重複使用就繼承
8、繼承細節:
1:類名的設定,被繼承的類稱之爲父類(基類),繼承的類稱之爲子類
2:子類並不能繼承父類中所有的成員
1)父類定義完整的成員 靜態成員,非靜態,構造方法。靜態變量和靜態方法都可以通過子類名.父類靜態成員的形式調用成功。
2)所有的私有成員不能繼承,private修飾的成員。
3)構造函數不能被繼承
3:如何使用繼承
1)不要爲了使用繼承而繼承。工人和學生都有共性的成員,不要爲了節省代碼,讓工人繼承學生。