類 與 物件
面向物件概述
- 面向物件的程式設計(OOP)是建立在把物件作為基本實體看待的面向物件(object oriented)的模型上的,這種模型可以使物件之間互動操作。
- 面向物件的程式設計具有3個基本特徵:封裝、繼承、多型,可以大大增強程式的可靠性、程式碼的重用性和程式的可維護性,從而提高程式的開發效率。
- (1)封裝(encapsulation):就是把客觀事物抽象並封裝成物件,即將資料成員、屬性、方法和事件集合在一個整體內。通過訪問控制,還可以將隱藏內部成員,只允許可信的物件訪問或操作自己的資料或方法。 封裝保證了物件的獨立性,可以防止外部程式破壞物件的內部資料,同時便於程式的維護和修改。
- (2)繼承(inheritance):是面向物件的程式設計中程式碼重用的主要方法。繼承允許使用現有類的功能,並在無須重新修改原來類的情況下,對這些功能進行擴充套件。繼承可以避免程式碼複製和相關的程式碼維護等問題。 繼承的過程,就是從一般到特殊的過程。被繼承的類稱為“基類(base class)”、“父類”或“超類(super class)”,通過繼承建立的新類稱為“子類(subclass)”或“派生類(derived class)”。
一個子類只能有一個基類(單一繼承),但允許多個介面。 - (3)多型(polymorphism):是指同樣的訊息被不同型別的物件接收導致完全不同的行為。多型性允許每個物件以自己的方式去響應共同的訊息,從而允許使用者以更明確的方式建立通用軟體,提高軟體開發的可維護性。
類與物件概述
類
類(class)是java語言的核心,java的一切型別都是類,所有的語句都必須位於類內。java類庫中包含大量解決問題通用的類,一般可以通過建立自定義類和使用Java類庫來解決實際問題。
類是一個數據結構,類定義資料型別的資料(欄位)和行為(方法)。物件(object)是基於類的基本例項(instance)。
物件是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個物件由一組屬性和對這組屬性進行操作的一組服務組成。
類的例項化可生成物件,一個物件的生命週期包括三個階段:生成、使用、消除。
當不存在對一個物件的引用時,該物件成為一個無用物件。Java的垃圾收集器自動掃描物件的動態記憶體區,把沒有引用的物件作為垃圾收集起來並釋放。當系統記憶體用盡或呼叫System.gc( )要求垃圾回收時,垃圾回收執行緒與系統同步執行。
- 類的宣告:
- 使用類宣告可以建立新的類。宣告一個類就是建立一個新的資料型別,而類在java中屬於引用資料型別。java使用關鍵字class來宣告類。類的屬性稱為資料成員,對資料成員進行的操作稱為成員方法。類的組成成分是資料成員和成員方法。資料成員用來描述物件的屬性,它可以是任何變數型別,包括物件型別;成員方法用來刻畫物件的行為或動作,每一個成員方法確定一個功能或操作。類的宣告的簡明形式如下:
[類修飾符] class 類名[extends 基類][implements 介面列表]{
類體}
- 各部分意義:
(1)類修飾符(可選):用於定義類的可訪問性等資訊(public、abstract、final、private、protected)。
(2)class:關鍵字,注意首字母小寫。
(3)類名:所要定義的類的識別符號,必須符合識別符號的命名規則,一般採用PascalCase命名規範,例如MyClass。
(4)extends 基類(可選):用於宣告要繼承的類。
(5)implements 介面列表(可選):用於宣告要實現的一個或多個介面。
(6)類體:用於定義該類的成員包括在一對花括號之間,類體可以為空。
類的構造方法:
將成員變數初始化封裝起來的方法稱為構造方法(constructor)。
(1)構造方法名必須與類名相同。
(2)構造方法總是和new運算子一起被呼叫。
(3)構造方法不返回任何值,也沒有返回型別(包括void型別)。
(4)每一個類可以有零個或多個構造方法,即構造方法可以過載。
(5)構造方法在建立物件時自動執行,一般不能顯式地直接呼叫。
(6)如果使用者在一個自定義類中未定義該類的構造方法,系統將自動為這個類定義一個預設的空構造方法。
class Person{
public int age;//資料成員 或稱 成員屬性
public String name;
public String sex;
public Person(){ //不帶引數的構造方法
}
public Person(int age1,String name1,String sex1){//帶三個引數的構造方法
age = age1;
name = name1;
sex = sex1;
}
public int getAge() { //成員方法 get set
return age;
}
public void setAge(int age) {
this.age = age; //this 指明賦值號左邊為引用當前物件的成員變數
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void sleep(){//行為 成員方法 函式
System.out.println("Person.sleep()");
}
public void eat(){
System.out.println("Person.eat()");
}
}
public class ClassObject {
public static void main(String[] args) {
//建立Person 類的兩個物件person1,person2
Person person1 = new Person(20, "lili", "woman");
Person person2 = new Person(21, "Tom", "man");
//物件的資料成員的使用
person1.age = 20;
person1.name="lili";
person1.sex="woman";
person2.age = 21;
person2.name="Tom";
person2.sex="man";
//物件的成員方法的呼叫
System.out.println("Age of person1:"+person1.getAge());
System.out.println("Name of person1:"+person1.getName());
System.out.println("Sex of person1:"+person1.getSex());
System.out.println("Age of person2:"+person2.getAge());
System.out.println("Name of person2:"+person2.getName());
System.out.println("Sex of person2:"+person2.getSex());
}
}
- 物件的初始化有兩種方式:
(1)get set方法的呼叫;
(2)通過合適的建構函式進行初始化: - 物件的建立分為兩步:
(1)首先為物件分配記憶體;
(2)呼叫合適的建構函式;
this的引用:
在java中,系統預設每個類都預設地具有null、this和super三個物件引用變數,所以在任意類中不加說明直接使用這三個物件。其中,null代表空物件,一般用null來代表未建立的物件;this是指當前物件的引用,指的是當前物件的記憶體;super是指對父類物件的引用。
當需要引用當前物件的資料成員或成員方法時,便可以利用this來實現這個目的,this表示的就是當前物件本身,即當前物件的一個引用。可以通過“this.類中的方法名(成員名)” 來實現對類的方法或成員的訪問。
class Person{
private int age;//private 只能被這個類本身訪問,構造方法為private則其它類不能聲稱該類的一個例項
public String name;//public 可以被所有類訪問
public String sex;
protected void setAge(int age){ //protected 可以被這個類本身、它的子類和同一個包中的所有其他的類訪問
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
Person(int age,String name,String sex){
this.setAge(age);
this.setSex(sex);
this.setName(name);
}
public void print(){
System.out.println("name="+name+"age="+age+"sex="+sex);
}
靜態塊初始化 例項塊初始化
- static 修飾的的變數屬於類,不屬於物件 ,存放在 方法區,
static 所修飾的方法或者資料成員不依賴於物件。 - 靜態塊初始化:
static{
}
靜態方法 靜態成員 不屬於物件,不能使用物件名呼叫,靜態資料:靜態塊 同等級, 初始化順序與順序相關。 - 靜態程式碼塊只初始化一次
- 例項塊初始化
{
this.name=“lili”;
this.sex=“woman”;
this.age=20;
}
class Person1 {
private int age;//資料
private String name;
private String sex;
private static int count;
{
this.name = "lili";
this.sex = "woman";
this.age = 20;
System.out.println("instance {} init");//例項塊初始化
}
public Person1() {
System.out.println("Person().constrcutor");//建構函式初始化
}
static { //static所修飾的方法或者資料成員不依賴於物件
count = 1;
System.out.println("static {} init");//靜態塊初始化
}
@Override//覆蓋(重寫)
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
public class ClassObject {
public static void main(String[] args) {
Person1 person1 = new Person1();
System.out.println(person1);
}
}
輸出:
static {} init
instance {} init
Person().constrcutor
Person{age=20, name='lili', sex='woman'}
- 物件的初始化順序:
靜態塊初始化====》》例項程式碼塊初始化======》》建構函式初始化
Over…注意物件初始化時get()、set()方法的使用,this.方法,是指當前物件的引用,指的是當前物件的記憶體。