Java基礎之面向物件詳解
目錄
創作不易,如果本篇部落格對您有一定的幫助,大家記得留言+點贊哦。
對Java語言來說,一切皆是物件。把現實世界中的物件抽象地體現在程式設計世界中,一個物件代表了某個具體的操作。一個個物件最終組成了完整的程式設計,這些物件可以是獨立存在的,也可以是從別的物件繼承過來的。物件之間通過相互作用傳遞資訊,實現程式開發。
什麼是類?
類是物件的抽象,它用於描述一組物件的共同特徵和行為。類中可以定義成員變數和成員方法,其中成員變數用於描述物件的特徵,也被稱之為屬性,成員方法用於描述物件的行為,簡稱為方法。
public class Student { //成員變數 private String name;//姓名 private int age;//年齡 //成員方法 //學習的方法 public void study(){ System.out.println("好好學習,天天向上"); } //吃飯的方法 public void eat(){ System.out.println("乾飯人乾飯時間"); } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } //封裝私有變數 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //帶參建構函式 public Student(String name, int age) { this.name = name; this.age = age; } //無參建構函式 public Student() { }
什麼是物件?
物件 :是一類事物的具體體現。物件是類的一個 例項 (物件並不是找個女朋友),必然具備該類事物的屬性和行為。public static void main(String[] args) { //建立物件 Student stu1=new Student("張三",9); Student stu2=new Student("李四",9); //使用物件訪問類中的成員 stu1.setAge(18); stu1.eat(); stu2.setName("趙四"); stu2.study(); }
面向物件的三大特性(封裝、繼承、多型)
一、封裝
封裝:封裝是面向物件方法的一個重要原則,它有兩個含義:第一個含義是,把物件的全部屬性和全部服務結合在一起,形成一個不可分割的獨立單位(即物件);第二個含義也稱作資訊隱蔽,即儘可能隱蔽物件的內部細節,對外形成一個邊界,只保留有限的對外介面使之與外部發生聯絡。
1.使用private關鍵字來修飾成員變數
2.對需要訪問的成員變數,提供對應的一對getXxx方法、SetXxx方法。
public class Student {
//私有成員變數
private String name;//姓名
private int age;//年齡
//提供供外界訪問的公有方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
訪問修飾符
關鍵字this的含義
- this代表所在類的當前物件的引用(地址值),即物件自己的引用。
- 方法被哪個物件呼叫,方法中的this就代表哪個物件。即誰在呼叫,this就代表誰。
變數封裝了當前值,方法封裝了程式碼和行為,類封裝兩者以同時提供一堆狀態和函式。介面封裝了方法。
二、繼承
繼承:繼承是一種使使用者得以在一個類的基礎上建立新的類的技術。新的類自動繼承舊類的屬性和行為特徵,並可具備某些附加的特徵或某些限制。
繼承:就是子類繼承父類的屬性和行為,使得子類具有與父類相同的屬性、相同的行為。子類可以直接訪問父類的非私有的屬性和行為。
提高了程式碼的複用性。類與類之間產生了關係,是多型的前提。
class 父類{
···
}
class 子類 extends 父類{
···
}
繼承後的特點--成員變數
如果子類父類出現不同名的成員變數,程式碼的訪問沒有影響。
如果子類父類出現了同名的成員變數,在子類中需要訪問父類中非私有成員變數是,需要使用super關鍵字,修飾父類的成員變數。
class Zi extends Fu {
// Zi中的成員變數
int num = 6;
public void show() {
//訪問父類中的num
System.out.println("Fu num=" + super.num);
//訪問子類中的num
System.out.println("Zi num=" + this.num);
}
}
繼承後的特點--成員方法
如果子類父類出現不同名的成員方法,程式碼的訪問沒有影響。
如果子類父類出現了同名的成員方法,這時出現了方法重寫(Override)
方法重寫:子類中出現與父類一模一樣的方法是(返回值型別、方法名和引數列表都相同),會出現覆蓋效果。宣告不變,重新實現。
//父類
class Fu {
public void show() {
System.out.println("Fu show");
}
}
//子類
class Zi extends Fu {
//子類重寫了父類的show方法
public void show() {
System.out.println("Zi show");
}
}
//測試類ExtendsDemo
public class ExtendsDemo{
public static void main(String[] args) {
Zi z = new Zi();
// 子類中有show方法,只執行重寫後的show方法
z.show(); // Zi show
}
}
super和this的含義
- super:代表父類的儲存空間標識,只能出現在方法中(可以理解父類的引用)
- this:代表當前物件的引用(誰呼叫就代表誰)。
父類空間由於子類物件產生
在每次建立子類物件時,先初始化父類空間,再建立子類物件本身。目的在於子類物件中包含了其對應的父類空間,便可以包含其父類的成員,如果父類成員非private修飾,子類可以隨意使用父類成員。程式碼體現在子類的構造方法呼叫時,一定先呼叫父類的構造方法。
三、多型
多型:在收到訊息時物件要予以響應,不同的物件收到同一訊息可以產生完全不同的結果, 這一現象叫做多型。
多型存在的條件:
- 1.存在繼承關係
- 2.方法需要重寫
- 3.父類的引用指向子類
//子類的引用 指向——> 子類
父類型別 變數名 = new 子類物件;
變數名.方法名();
父類型別:指子類物件繼承父類型別,或者實現的父介面型別。 多型是方法的多型,屬性沒有多型。
//抽象的父類
public abstract class Animal {
public abstract void eat();
}
//子類Cat
class Cat extends Animal {
public void eat() {
System.out.println("吃魚");
}
}
//子類Dog
class Dog extends Animal {
public void eat() {
System.out.println("吃骨頭");
}
}
//測試類Test
public class Test {
public static void main(String[] args) {
// 多型形式,建立物件
Animal a1 = new Cat();
// 呼叫的是 Cat 的 eat
a1.eat();
// 多型形式,建立物件
Animal a2 = new Dog();
// 呼叫的是 Dog 的 eat
a2.eat();
}
}
在多型的程式碼中,成員方法的訪問規則是: 看new的是誰,就優先用誰,沒有則向上找。