一、抽象數據類型
1.面向對象基本概念
1. 面向對象
面向對象程序設計(OOP)是一種基于對象概念的軟件開發方法,是目前軟件開發的主流方式。
常見面向對象的語言:C++ 、Python 、Java
常見面向過程的語言:C
面向對象的三大特征:封裝、繼承、多態。
封裝(Encapsulation):封裝是面向對象編程的核心概念之一。它指的是將數據和操作封裝在類中,并限制對數據的直接訪問。通過封裝,可以隱藏實現細節,提高代碼的安全性和可維護性。
繼承(Inheritance):繼承是面向對象編程中實現代碼重用的機制之一。通過繼承,一個類可以繼承另一個類的屬性和方法,并且可以添加新的屬性和方法。這樣可以實現代碼的層次化組織,提高代碼的可復用性。
多態(Polymorphism):多態是面向對象編程中的一個特性,它允許使用統一的接口處理不同的對象類型。多態可以通過繼承和接口實現,通過動態綁定在運行時確定要調用的方法。這種靈活性有助于編寫可擴展的代碼。
2. 對象
在面向對象的世界中認為萬事萬物皆對象。對象就是具體的某一事物。
3. 類.
類是具有相同的狀態和相同的行為的一組對象的集合。
類是多個對象進行綜合抽象的結果,是實體對象的概念模型,而一個對象是一個類的實例。
2. 定義類
1. 定義類
類的定義由關鍵字 class
開始,后面跟著類名。以下是一個簡單的類的定義示例:
public class Car {// 類的成員變量String model;int year;// 類的方法public void start() {// 方法體System.out.println("Car started");}
}
2. 類的成員
類的成員包括成員變量和方法。成員變量是類的屬性,用于存儲對象的狀態。方法是類的行為,用于定義對象的操作。
在上面的示例中,model
和 year
是類的成員變量,而 start()
是類的方法。
3. 靜態初始化
靜態初始化是指在類加載時對靜態成員變量進行初始化,在整個程序生命周期內只執行一次
。可以使用靜態代碼塊來實現靜態初始化。
以下是一個靜態初始化的示例:
public class MyClass {static int myStaticVariable;static {myStaticVariable = 10;System.out.println("Static initialization block executed");}
}
4. 實例初始化
實例初始化是指在每次創建對象時對實例成員變量進行初始化
。可以使用構造函數或實例初始化塊來實現實例初始化。
以下是一個實例初始化的示例:
public class MyClass {int myInstanceVariable;{myInstanceVariable = 20;System.out.println("Instance initialization block executed");}public MyClass() {System.out.println("Constructor executed");}
}
4. 構造函數
構造函數是一種特殊類型的方法,用于創建和初始化對象。它具有與類相同的名稱,并且沒有返回類型。
以下是一個具有構造函數的示例:
public class Person {String name;public Person(String n) {name = n;System.out.println("Person object created with name: " + name);}
}
3. static 作用
static
關鍵字表示靜態成員,它可以應用于成員變量、方法和代碼塊。靜態成員屬于類本身,而不是對象實例。它們在類加載時被初始化,并且可以通過類名直接訪問。
以下是靜態成員的示例:
public class MyClass {static int myStaticVariable = 5;static void myStaticMethod() {System.out.println("Static method");}
}
實例(非靜態/實例)
實例或非靜態成員屬于對象實例,每個對象都擁有自己的一份實例成員變量。只有通過創建對象的實例才能訪問實例成員。
以下是實例成員的示例:
public class MyClass {int myInstanceVariable = 10;void myInstanceMethod() {System.out.println("Instance method");}
}
4. 構造重載
構造重載是指在同一個類中定義多個具有不同參數列表的構造函數。這樣可以根據參數的不同創建不同的對象。
以下是構造重載的示例:
public class DemoPerson {public String name;public String gender;public int age;// 第一種構造方法重載:定義無參構造方法public DemoPerson() {this.name = "小羊呆呆";System.out.println(name);}// 第二種構造方法重載:定義帶參構造方法public DemoPerson(String name) {System.out.println("你好!" + name);this.name = name;}// 第一種work() 方法重載,無參的 work() 方法public void work() {System.out.println(this.name + "的工作理念是:工作讓生活更美好!");}// 第二種work() 方法重載,帶參的 work() 方法public void work(String content) {System.out.println(this.name + "," + this.gender + "," + this.age + "歲的工作理念是:" + content);}public static void main(String[] args) {DemoPerson p1 = new DemoPerson("犯困桃子");DemoPerson p2 = new DemoPerson();p2.name = "康盛科技人才";p2.gender = "男";p2.age = 20;p1.work();p2.work("冒泡、摸魚、打游戲。");}
}
輸出:
你好!犯困桃子
小羊呆呆
犯困桃子的工作理念是:工作讓生活更美好!
康盛科技人才,男,20歲的工作理念是:冒泡、摸魚、打游戲。
5. 實例化的過程
實例化是指創建對象的過程。在實例化過程中,首先會進行靜態初始化(只執行一次),然后進行實例初始化,最后執行構造函數。
以下是實例化過程的示例:
public class MyClass {static int myStaticVariable = 5;int myInstanceVariable;static {System.out.println("Static initialization block executed");}{System.out.println("Instance initialization block executed");}public MyClass() {System.out.println("Constructor executed");}public static void main(String[] args) {MyClass obj = new MyClass();}
}
輸出:
Static initialization block executed
Instance initialization block executed
Constructor executed
6. 遮蔽(shadowing)
遮蔽是指在子類或局部作用域中使用與父類或外部作用域中同名的變量,從而隱藏了原有的變量。
以下是遮蔽的示例:
public class ParentClass {int x = 10;public void printX() {int x = 20; // 局部變量 x 遮蔽了成員變量 xSystem.out.println("Local x: " + x);System.out.println("Instance x: " + this.x);}
}public class ParentClass {int x = 10;// 遮蔽(shadowing)public void printX(int x) {System.out.println("Local x: " + x);System.out.println("例子 x: " + this.x);}public static void main(String[] args) {ParentClass p = new ParentClass();p.x = 200;p.printX(20);}
}
/*
Local x: 20
例子 x: 200
*/public class ChildClass extends ParentClass {int x = 30;public void printX() {int x = 40; // 局部變量 x 遮蔽了父類的成員變量 xSystem.out.println("Local x: " + x);System.out.println("Instance x: " + this.x);System.out.println("Parent x: " + super.x);}
}
1. this 解決遮蔽問題
this
關鍵字可以用于引用當前對象,通過 this
可以訪問當前對象的成員變量。
以下是使用 this
解決遮蔽問題的示例:
public class ParentClass {int x = 10;public void printX() {int x = 20;System.out.println("Local x: " + x);System.out.println("Instance x: " + this.x); // 使用 this 引用成員變量 x}
}
2. className.staticField 解決遮蔽問題
通過使用類名限定的方式,可以訪問被遮蔽的成員變量。
以下是使用類名限定解決遮蔽問題的示例:
public class ParentClass {static int x = 10;public void printX() {int x = 20;System.out.println("Local x: " + x);System.out.println("Static x: " + ParentClass.x); // 使用類名限定訪問靜態變量 x}
}