Java入門教程八(面向對象)

對象概念

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

三大特性

封裝

封裝是將代碼及其處理的數據綁定在一起的一種編程機制,該機制保證了程序和數據都不受外部干擾且不被誤用。
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;
posted @ 2019-06-06 21:37 韭菜Java 閱讀(...) 評論(...) 編輯 收藏