Java入門教程八(物件導向)

韭菜Java發表於2019-06-06

物件概念

一切皆是物件。把現實世界中的物件抽象地體現在程式設計世界中,一個物件代表了某個具體的操作。一個個物件最終組成了完整的程式設計,這些物件可以是獨立存在的,也可以是從別的物件繼承過來的。物件之間通過相互作用傳遞資訊,實現程式開發。物件有以下特點:物件具有屬性和行為。物件具有變化的狀態。物件具有唯一性。物件都是某個類別的例項。

三大特性

封裝

封裝是將程式碼及其處理的資料繫結在一起的一種程式設計機制,該機制保證了程式和資料都不受外部干擾且不被誤用。
Java 語言的基本封裝單位是類。由於類的用途是封裝複雜性,所以類的內部有隱藏實現複雜性的機制。Java 提供了私有和公有的訪問模式,類的公有介面代表外部的使用者應該知道或可以知道的每件東西,私有的方法資料只能通過該類的成員程式碼來訪問。

繼承

如同生活中的子女繼承父母擁有的所有財產,程式中的繼承性是指子類擁有父類資料結構的方法和機制,這是類之間的一種關係;繼承只能是單繼承

多型

物件導向的多型性,即“一個介面,多個方法”。多型性體現在父類中定義的屬性和方法被子類繼承後,可以具有不同的屬性或表現方式。多型性允許一個介面被多個同類使用,彌補了單繼承的不足。

類和物件

具有相同特性(資料元素)和行為(功能)的物件的抽象就是類,因此物件的抽象是類,類的具體化就是物件,也可以說類的例項是物件。例如:人是一個類,你我就是物件。人類具有身高、體重等屬性和說話、走路等方法。

人類:物件你我他

類是構造物件導向程式的基本單位,是抽取了同類物件的共同屬性和方法所形成的物件或實體的“模板”。而物件是現實世界中實體的描述,物件要建立才存在,有了物件才能對物件進行操作。類是物件的模板,物件是類的例項

類的定義

在 Java 中定義一個類,需要使用 class 關鍵字、一個自定義的類名和一對錶示程式體的大括號,類名應該以下劃線()或字母開頭,最好以字母開頭;第一個字母最好大寫,如果類名由多個單片語成,則每個單詞的首字母最好都大寫;類名不能為 Java 中的關鍵字,例如 boolean、this、int 等;類名不能包含任何嵌入的空格或點號以及除了下劃線()和美元符號($)字元之外的特殊字元

public class Person{
    private int age;//年齡屬性
    private String name;//姓名屬性
    public void speak(){//說話方法
    }
}

常用關鍵字

public:表示“共有”的意思。如果使用 public 修飾,則可以被其他類和程式訪問。每個 Java 程式的主類都必須是 public 類,作為公共工具供其他類和程式使用的類應定義為 public 類。
abstract:如果類被 abstract 修飾,則該類為抽象類,抽象類不能被例項化,但抽象類中可以有抽象方法(使用 abstract 修飾的方法)和具體方法(沒有使用 abstract 修飾的方法)。繼承該抽象類的所有子類都必須實現該抽象 類中的所有抽象方法(除非子類也是 抽象類)。
final:如果類被 final 修飾,則不允許被繼承。
extends:表示繼承其他類。
implements:表示實現某些介面。

物件

物件是對類的例項化。物件具有狀態和行為,變數用來表明物件的狀態,方法表明物件所具有的行為,使用 new 關鍵字建立物件

類名 物件名=new 類名();
//人類
public class Person{
    public int age;//年齡屬性
    public String name;//姓名屬性
    public void speak(){//說話方法
    }
}
//建立類的物件
Person person = new Person();
person.age=20;
person.name="Hello World";

物件的銷燬

物件使用完之後需要對其進行清除。物件的清除是指釋放物件佔用的記憶體。在建立物件時,使用者必須使用 new 操作符為物件分配記憶體。不過,在清除物件時,由系統自動進行記憶體回收,Java 語言的記憶體自動回收稱為垃圾回收(Garbage Collection)機制,簡稱 GC。垃圾回收機制是指 JVM 用於釋放那些不再使用的物件所佔用的記憶體。
一個物件被當作垃圾回收的情況主要如下兩種:

物件的引用超過其作用範圍

{
    Object o=new Object();    //物件o的作用範圍,超過這個範圍物件將被視為垃圾
}

物件被賦值為 null

{
    Object o=new Object();
    o=null;    //物件被賦值為null將被視為垃圾
}

在 Java 的 Object 類中還提供了一個 protected 型別的 finalize() 方法,因此任何 Java 類都可以覆蓋這個方法,在這個方法中進行釋放物件所佔有的相關資源的操作
在 Java 虛擬機器的堆區,每個物件都可能處於以下三種狀態之一。

可觸及狀態:當一個物件被建立後,只要程式中還有引用變數引用它,那麼它就始終處於可觸及狀態。

可復活狀態:當程式不再有任何引用變數引用該物件時,該物件就進入可復活狀態。在這個狀態下,垃圾回收器會準備釋放它所佔用的記憶體,在釋放之前,會呼叫它及其他處於可復活狀態的物件的 finalize() 方法,這些 finalize() 方法有可能使該物件重新轉到可觸及狀態。

不可觸及狀態:當 Java 虛擬機器執行完所有可復活物件的 finalize() 方法後,如果這些方法都沒有使該物件轉到可觸及狀態,垃圾回收器才會真正回收它佔用的記憶體。

構造方法

構造方法是類的一種特殊方法,用來初始化類的一個新的物件。Java 中的每個類都有一個預設的構造方法,它必須具有和類名相同的名稱,而且沒有返回型別。構造方法的預設返回型別就是物件型別本身,並且構造方法不能被 static、final、synchronized、abstract 和 native 修飾

class class_name
{
    public class_name(){}    //預設無參構造方法
    public ciass_name([paramList]){}    //定義構造方法
    …
    //類主體
}

public class MyClass
{
    private int m;    //定義私有變數
    MyClass()
    {
        //定義無參的構造方法
        m=0;
    }
    MyCiass(int m)
    {
        //定義有參的構造方法
        this.m=m;
    }
}

類的構造方法不是要求必須定義的。如果在類中沒有定義任何一個構造方法,則 Java 會自動為該類生成一個預設的構造方法。預設的構造方法不包含任何引數,並且方法體為空。如果類中顯式地定義了一個或多個構造方法,則 Java 不再提供預設構造方法。

析構方法

析構方法與構造方法相反,當物件脫離其作用域時(例如物件所在的方法已呼叫完畢),系統自動執行析構方法。析構方法往往用來做清理垃圾碎片的工作,例如在建立物件時用 new 開闢了一片記憶體空間,應退出前在析構方法中將其釋放。在 Java 的 Object 類中還提供了一個 protected 型別的 finalize() 方法,因此任何 Java 類都可以覆蓋這個方法,在這個方法中進行釋放物件所佔有的相關資源的操作
物件的 finalize() 方法具有如下特點:
垃圾回收器是否會執行該方法以及何時執行該方法,都是不確定的。
finalize() 方法有可能使用物件復活,使物件恢復到可觸及狀態。
垃圾回收器在執行 finalize() 方法時,如果出現異常,垃圾回收器不會報告異常,程式繼續正常執行。

protected void finalize()
{
    //物件的清理工作
}

public class Counter
{
    private static int count=0;    //計數器變數
    public Counter()//構造方法
    {
        this.count++;    //建立例項時增加值
    }
    public int getCount()        //獲取計數器的值
    {
        return this.count;
    }
    protected void finalize()//析構方法
    {
        this.count--;    //例項銷燬時減少值
        System.out.println("物件銷燬");
    }
}

包(package)

在編寫 Java 程式時,隨著程式架構越來越大,類的個數也越來越多,這時就會發現管理程式中維護類名稱也是一件很麻煩的事,尤其是一些同名問題的發生。有時,開發人員還可能需要將處理同一方面的問題的類放在同一個目錄下,以便於管理。Java 為了解決上述問題,提供了包機制

系統包

包允許將類組合成較小的單元(類似資料夾),它基本上隱藏了類,並避免了名稱上的衝突。包允許在更廣泛的範圍內保護類、資料和方法,可以在包內定義類,而在包外的程式碼不能訪問該類,常用系統包:

Java.lang   Java 的核心類庫,包含執行 Java 程式必不可少的系統類,如基本資料型別、基本數學函式、
字串處理、異常處理和執行緒類等,系統預設載入這個包
java.io Java 語言的標準輸入/輸出類庫,如基本輸入/輸出流、檔案輸入/輸出、過濾輸入/輸出流等
java.util   包含如處理時間的 Date 類,處理動態陣列的 Vector 類,以及 Stack 和 HashTable 類
java.awt    構建圖形使用者介面(GUI)的類庫,低階繪圖操作 Graphics 類、圖形介面元件和佈局管理
(如 Checkbox 類、Container 類、LayoutManger 介面等),以及用 戶介面互動控制和事
件響應(如 Event 類)
java.awt.image  處理和操縱來自網上的圖片的 java 工具類庫
java.wat.peer   很少在程式中直接用到,使得同一個 Java 程式在不同的軟硬體平臺上執行
java.net    實現網路功能的類庫有 Socket 類、ServerSocket 類
java.lang.reflect   提供用於反射物件的工具
java.util.zip   實現檔案壓縮功能
java.awt.datatransfer   處理資料傳輸的工具類,包括剪貼簿、字串傳送器等
java.sql    實現 JDBC 的類庫
java.rmi    提供遠端連線與載入的支援
java. security  提供安全性方面的有關支援

自定義包

Java 的系統包無須定義可以直接呼叫,也可以自定義包

宣告

package 包名;

使用

在要引用的類名前帶上包名作為修飾符,bookexample 是包名,Test 是包中的類名,test 是類的物件

bookexample.Test test = new bookexampie.Test();

在檔案開頭使用 import 引用包中的類

import bookexample.Test;

相關文章