封裝 繼承 多型
阿新 • • 發佈:2021-11-27
封裝
- 該露的露,該藏的藏
- 我們程式設計要追求”高內聚,低耦合“。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。
- 封裝(資料的隱藏)
- 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過介面來訪問,這稱為資訊隱藏。
- 記住這句話就夠了:屬性私有,get/set
package com.oop.demo04; //類 private:私有 public class Student { //屬性私有 private String name;//名字 private int id;//學號 private char sex;//姓名 private int age; //提供一些可以操作這個屬性的方法! //提供一些public 的 get、set 方法 //get 獲得這個資料 public String getName(){ return this.name; } //set 給這個資料設定值 public void setName(String name){ this.name = name; } //alt + insert public int getId() { return id; } public void setId(int id) { this.id = id; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { if (age>120 || age<0){//不合法 this.age = 3; }else { this.age = age; } } }
package com.oop; import com.oop.demo04.Student; /* 1. 提高程式的安全性,保護資料 2. 隱藏程式碼的實現細節 3. 統一介面 4. 系統可維護增加了 */ public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.setName("思源"); System.out.println(s1.getName()); s1.setAge(999);//不合法 System.out.println(s1.getAge()); } }
判斷一個類的兩個方法是否相同 主要參考兩個東西:方法名;引數列表
繼承
- 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模。
- extends的意思是“擴充套件”。子類是父類的擴充套件。
- JAVA中類只有單繼承,沒有多繼承!
- 繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合 、聚合等。
- 繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。
- 子類和父類之間,從意義上講應該具有“is a”的關係。
package com.oop; import com.oop.demo05.Person; public class Application { public static void main(String[] args) { Person person = new Person(); } }
package com.oop.demo05;
//在Java中,所有的類,都預設直接或者間接繼承object
//Person 人 : 父類
public class Person /*extends object*/{
//public
//protected
//default
//private
private int money = 10_0000_0000;
public void say(){
System.out.println("說了一句話");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
package com.oop.demo05;
//Teacher is 人 : 派生類,子類
public class Teacher extends Person{
}
package com.oop.demo05;
//學生 is 人 : 派生類,子類
//子類繼承父類,就會繼承父類的全部方法!
public class Student extends Person{
//Ctrl + H
}
- object (在Java中,所有的類,都預設直接或者間接繼承object)
- super
super注意點:
- super呼叫父類的構造方法,必須在構造方法的第一個
- super 必須只能出現在子類的方法或者構造方法中!
- super 和 this 不能同時呼叫構造方法!
Vs this:
代表的物件不同:
this:本身呼叫著這個物件
super:代表父類物件的應用
前提
this:沒有繼承也可以使用
super:代表父類物件的應用
構造方法
this():本類的構造
super():父類的構造!
package com.oop;
import com.oop.demo05.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
//student.test("思源");
//student.test1();
}
}
package com.oop.demo05;
//學生 is 人 : 派生類,子類
//子類繼承父類,就會繼承父類的全部方法!
public class Student extends Person{
public Student() {
//隱藏程式碼: 呼叫了父親類的無參構造
super("name");//呼叫父親的構造器,必須要在子類構造器的第一行
System.out.println("Student無參執行了");
}
private String name = "siyuan";
public void print(){
System.out.println("Student");
}
public void test1(){
print();//Student
this.print();//Student
super.print();//Person
}
public void test(String name){
System.out.println(name);//思源
System.out.println(this.name);//siyuan
System.out.println(super.name);//lin
}
}
package com.oop.demo05;
//在Java中,所有的類,都預設直接或者間接繼承object
//Person 人 : 父類
public class Person /*extends object*/{
public Person(String name){
System.out.println("Person無參執行了");
}
protected String name = "lin";
//私有的東西無法被繼承!
public void print(){
System.out.println("Person");
}
}
- 方法重寫:重點--->多型
package com.oop;
import com.oop.demo05.A;
import com.oop.demo05.B;
public class Application {
//靜態的方法和非靜態的方法區別很大!
//靜態方法:方法的呼叫只和左邊,定義的資料型別有關
//非靜態:重寫
public static void main(String[] args) {
A a = new A();
a.test();//A
//父類的引用指向了子類
B b = new A();//子類重寫了父類的方法
b.test();//B
}
}
package com.oop.demo05;
//繼承
public class A extends B{
//Override 重寫
@Override//註解:有功能的註解!
public void test() {
System.out.println("A=>test");
}
}
package com.oop.demo05;
//重寫都是方法的重寫,和屬性無關
public class B {
public void test(){
System.out.println("B=>test");
}
}
重寫:需要有繼承關係,子類重寫父類的方法!
- 方法名必須相同
- 引數列表必須相同
- 修飾符:範圍 可以擴大,但不能縮小: public>protect>default>private
- 丟擲的異常:範圍 可以縮小,但不能擴大:ClassNotFoundException --> Exception(大)
重寫,子類的方法和父類必須一致,方法體不同!
為什麼需要重寫:
父類的功能,子類不一定需要,或者不一定滿足!
Alt + Insert : override;
多型
- 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。
- 一個物件的實際型別是確定的,但可以指向物件的引用型別有很多(父類,有關係的類)
- 多型存在的條件
- 有繼承關係
- 子類重寫父類方法
- 父類引用指向子類物件
- 注意:多型是方法的多型,屬性沒有多型性
- instanceof (型別轉換) 引用型別
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
//一個物件的實際型別是確定的
//new Student();
//new Person();
//可以指向的引用型別就不確定了:父類的引用指向子類
//Student 能呼叫的方法都是自己的或者繼承父類的!
Student s1 = new Student();
//Person 父型別,可以指向子類,但是不能呼叫子類獨有的方法
Person s2 = new Student();
Object s3 = new Student();
//物件能執行哪些方法,主要看物件左邊的型別,和右邊關係不大!
((Student)s2).eat();//子類重寫了父類的方法,執行子類的方法
s1.eat();
}
}
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
package com.oop.demo06;
public class Student extends Person{
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
多型注意事項:
- 多型是方法的多型,屬性沒有多型
- 父類和子類,有聯絡 型別轉換異常!ClassCastException!
- 存在條件:繼承關係,方法需要重寫,父類引用指向子類物件! Father f1 = new Son();
不能被重寫的(就更不可能實現多型):
- static 方法,屬於類,他不屬於例項
- final 常量
- private 方法