首頁  >  文章  >  Java  >  簡單聊聊java物件導向

簡單聊聊java物件導向

WBOY
WBOY轉載
2022-03-10 17:52:422187瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了java物件導向的相關問題,包括了物件導向的基本特性、物件間的關係等等相關內容,希望對大家有幫助。

簡單聊聊java物件導向

推薦學習:《java教學

一、Java特效

1、簡單性

人們希望建構一個無須深奧的專業訓練就可以進行程式設計的系統,並且要符合當今的標準慣例。因此,儘管人們發現C 不太適用,但在設計Java的時候還是盡可能地接近C ,以便系統更易於理解,Java剔除了C 中許多很少使用、難以理解、易混淆的特性。在目前看來,這些特性帶來的麻煩遠遠多於其帶來的好處。

的確,Java語法是C 語法的一個「純淨」版本。這裡沒有頭檔、指標運算(甚至指標語法)、結構、聯合、運算子重載、虛基底類別等。然而,設計者並沒有試圖清除C 中所有不適當的特性。例如,switch語句的語法在Java中就沒有改變。如果你了解C 就會發現可以輕易地轉換到Java語法。

Java發佈時,實際上C 並不是最常使用的程式設計語言。很多開發人員都在使用VisualBasic和它的拖放式程式設計環境。這些開發人員並不覺得Java簡單。很多年之後Java開發環境才迎頭趕上。如今,Java開發環境已經遠遠超出大多數其他程式語言的開發環境。

簡單的另一個面向是小。 Java的目標之一是支援開發能夠在小型機器上獨立運行的軟體。基本的解釋器以及類別支援大約只有40KB;再加上基礎的標準類別庫和對線程的支援(基本上是一個自包含的微內核)大約需要增加175KB。

在當時,這是一個了不起的成就。當然,由於不斷的擴展,類庫已經相當龐大了。現在有一個獨立的具有較小類別庫的Java微型版(JavaMicroEdition),這個版本適用於嵌人式裝置。

2、物件導向

物件導向是一種新興的程式設計方法,或是一種新的程式設計規範,其基本想法是使用物件、類別、繼承、封裝、多型等基本概念來進行程式設計。從現實世界中客觀存在的事物(即物件)出發來建構軟體系統,並且在系統構造中盡可能運用人類的自然思維方式。

3、分散式

分散式系統對使用者而言,他們面對的就是一個伺服器,提供使用者所需的服務而已,而實際上這些服務是透過背後的眾多伺服器組成的分散式系統,因此分散式系統看起來像是超級電腦一樣。

4、健壯性

Web的多平台環境對程式有特別的要求,因為程式必須在各種系統中可靠地執行。因此,在設計Java時,使其具備創建健壯程序的能力被提到了高優先級的地位。為了獲得可靠性,Java在一些關鍵領域進行了限制,從而迫使程式設計師在程式開發中及早地發現錯誤。同時,使程式設計師不必再擔心會引起程式設計錯誤的許多最常見的問題。因為Java是強類型化的語言,它在編譯時會檢查程式碼。當然不管怎樣,在運行時也會檢查程式碼。許多難以追蹤的bug,在執行時通 常常難以再現,這種情況在Java中幾乎不可能產生。因為讓編寫好的程式在不同的運作條件下,以可預見的方式運作是Java的關鍵特性之一。為了更好地理解Java是多麼健壯,分析程式失敗的兩個主要原因:記憶體管理錯誤和未處理的異常(即運行時錯誤)。在傳統的程式設計環境中,記憶體管理是一件困難、乏味的工作。例如,在C/C 中,程式設計師必須手動分配和釋放所有動態記憶體。有時這會導致問題,因為程式設計師可能會忘記釋放先前分配的內存,或者更糟的是,試圖釋放程式其他部分仍然在使用的內存。 Java透過為您管理記憶體的分配和釋放,可以從根本上消除這些問題(事實上,釋放記憶體完全是自動的,因為Java為不再使用的物件提供了垃圾回收功能)。傳統環境中的異常情況通常是由「除0」或「沒有找到文件」這類錯誤引起的,並且必須使用既笨拙又難以理解的結構對它們進行管理。 Java透過提供物件導向的異常處理功能在這個領域提供幫助。在編寫良好的Java程式中,所有執行時間錯誤都能夠並且應由程式管理。

5、安全性

Java取消了強大但又危險的指針,而代之以引用。由於指針可進行移動運算,指針可隨便指向一個內存區域,而不管這個區域是否可用,這樣做是危險的,因為原來這個內存地址可能存儲著重要數據或者是其他程序運行所佔用的,並且使用指針也容易數組越界。

垃圾回收機制:不需要程式設計師直接控制記憶體回收,由垃圾回收器在後台自動回收不再使用的記憶體。避免程序忘記及時回收,導致記憶體外洩。避免程式錯誤回收程式核心類別庫的內存,導致系統崩潰。

異常處理機制:Java異常機制主要依賴try、catch、finally、throw、throws五個關鍵字。

強制型別轉換:只有在滿足強制轉換規則的情況下才能強轉成功。

Java在字節碼的傳輸過程中使用了公開金鑰加密機制(PKC)。

在運作環境提供了四級安全性保障機制:字節碼校驗器 -類別裝載器 -運行時記憶體佈局 -檔案存取限制。

6、體系結構中立

#編譯器產生一個體系結構中立的目標檔案格式,這是一種編譯過的程式碼,只要有Java執行時間系統,就可以在許多處理器上運作。 Java編譯器透過產生與特定的電腦體系結構無關的字節碼指令來實現此特性。精心設計的字節碼不僅可以輕鬆地在任何機器上解釋執行,而且還可以迅速地翻譯成本地機器的程式碼。
字節碼實現了結構中立,與電腦結構無關。

7、可移植性

Java語言之中最大的特點在於其可移植性的支持,所謂的可移植性指的是同一個程式可以在不同的作業系統之間任意的進行部署,這樣就減少了開發的難度,在Java裡面如果要想實現可移植性的控制,那麼主要依靠的是JVM(Java 虛擬機)。 Java虛擬機是一個由軟體和硬體模擬出來的計算機,所有的程式只要有Java虛擬機的支持,那麼就可以實現程式的執行,並且不同的作業系統上會有不同版本的JVM存在,這樣就可以實現移植性。
著作權歸作者所有。商業轉載請聯絡作者授權,非商業轉載請註明出處。

8、解釋性

有人說Java是編譯型的。因為所有的Java程式碼都是要編譯的,.java不經過編譯就無法執行。也有人說Java是解釋型的。因為java程式碼編譯後不能直接執行,它是解釋運行在JVM上的,所以它是解釋型的。

9、高效能

即時編譯器可以監控經常執行哪些程式碼並最佳化這些程式碼以提高速度。更複雜的最佳化是消除函數呼叫(即內聯)。即時編譯器知道哪些類別已經載入。基於目前載入的類別集,如果特定的函數不會被覆蓋,就可以使用內聯。必要時,也可以撤銷優化。

10、多執行緒

指的是這個程式(一個行程)運行時產生了不只一個執行緒。

11、動態性

Java本質為靜態語言,而不是動態語言。動態語言顯著的特徵是在程式執行時,可以改變程式結構或變數類型,典型的動態語言有Python、ruby、javascript等。 Java不是動態語言,但Java具有一定的動態性,表現在以下幾個方面:

  1. 反射機制;
  2. 動態字節碼操作;
  3. #動態編譯;
  4. 執行其他腳本程式碼;

二、物件

物件是系統中用來描述客觀事物的實體,它是構成系統的一個基本單位。一個物件由一組屬性和對這組屬性進行操作的一組服務組成。

類別的實例化可產生對象,一個物件的生命週期包含三個階段:產生、使用、消除。

當不存在對一個物件的參考時,該物件成為一個無用物件。 Java的垃圾收集器會自動掃描物件的動態記憶體區,把沒有引用的物件當作垃圾收集起來並釋放。當系統記憶體用盡或呼叫System.gc( )要求垃圾回收時,垃圾回收執行緒與系統同步運作。

三、類別

類別是具有相同屬性和方法的一組物件的集合,它為屬於該類別的所有物件提供了統一的抽象描述,其內部包括屬性和方法兩個主要部分。在物件導向的程式語言中,類別是一個獨立的程式單位,它應該有一個類別名稱並包括屬性和方法兩個主要部分。

Java中的類別實作包括兩個部分:類別宣告和類別體。

1、類別宣告

[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]{……}

其中,修飾符public,abstract,final 說明了類別的屬性,className為類別名,superclassName為類別的父類別的名字,interfaceNameList為類別所實作的介面清單。

2、類別體

class className{
    [public | protected | private ] [static] [final] [transient] [volatile] type variableName;//成员变量
    [public | protected | private ] [static] [final | abstract] [native] [synchronized] returnType methodName([paramList]) [throws exceptionList]{
        statements
    }//成员方法
}

成員變數限定詞的意思:

  • static: 靜態變數(類別變數)
  • final: 常數;transient: 暫時性變量,用於物件存檔,用於物件的序列化
  • volatile: 貢獻變量,用於並發執行緒的共用

方法的實作也包括兩部分內容:方法宣告和方法體。

  • static: 類別方法,可透過類別名稱直接呼叫
  • abstract: 抽象方法,沒有方法體
  • final: 方法不能被重寫
  • #native: 整合其它語言的程式碼
  • synchronized: 控制多個並發執行緒的存取

方法宣告包括方法名稱、傳回類型和外部參數。其中參數的型別可以是簡單資料型別,也可以是複合資料型別(又稱引用資料型別)。
對於簡單資料型別來說,java實作的是值傳遞,方法接收參數的值,但不能改變這些參數的值。如果要改變參數的值,則用引用資料類型,因為引用資料型別傳遞給方法的是資料在記憶體中的位址,方法中對資料的操作可以改變資料的值。

3、方法體

方法體是方法的實現,它包含局部變數的宣告以及所有合法的Java指令。方法體中宣告的局部變數的作用域在該方法內部。若局部變數與類別的成員變數同名,則類別的成員變數被隱藏。

為了區別參數和類別的成員變量,我們必須使用this。 this用在一個方法中引用當前對象,它的值是呼叫該方法的對象。傳回值須與傳回類型一致,或完全相同,或其子類別。當傳回類型是介面時,回傳值必須實作該介面。

4、建構方法

  • 建構方法是一個特殊的方法。 Java 中的每個類別都有建構方法,用來初始化該類別的一個物件。
  • 建構方法具有和類別名稱相同的名稱,而且不傳回任何資料類型。
  • 重載常用於建構方法。
  • 建構方法只能由new運算子呼叫

5、註解

Java中的註解就是解釋說明你的程式碼的,Java註釋不會被執行,因此可以隨意添加註釋。

  • 當行註解//
  • 多行註解/**/

#6、隱含參數與明確參數

(1)明確參數就是方法名稱括號中間的參數。

(2)隱式參數是在類別的方法中呼叫了類別的實例域。這個被呼叫的實例域就是隱式參數。

(3)程式碼實例

package com.nezha.javase;

public class Test1107 {
    private int score;

    /**
     * x为显式参数
     * score为隐式参数
     * @param x
     */
    public void addScore(int x){
        int temp = this.score + x;
        score += temp;
    }
}
  • x為明確參數
  • score為隱式參數

如果在隱式參數的前面加上this,隱式參數就更清楚。

建議在隱式參數的前面加上this操作符,this操作符代表的是本類。

7、參數可變的方法

在jdk5之前,每個java方法都有固定數量的參數,然而,現在的版本提供了可以用可變參數的方式。
以大家最長用到的sout為例。

System.out.println("获奖编号:"+i);

println內部呼叫的都是

public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}

Object…參數型別和Object[]完全一樣,也就是說可以採用…這種宣告方式去接收同類型數組,只是沒有固定數組的大小,因為這是可變參。
這裡的省略號...是Java程式碼的一部分,它表示這個方法可以接收任意數量的物件。
實際上printf方法接收兩個參數,一個時格式字串,一個時Object[]數組,其中保存著所有的參數(如果參數是基本類型,自動裝箱會將其轉換為物件)。
編譯器需要對printf的每次呼叫進行轉換,以便將參數綁定到陣列上,並在必要的時候進行自動裝箱。

四、物件導向的基本特性

1、封裝

封裝性就是盡可能的隱藏物件內部細節,對外形成一道邊界,只保留有限的介面和方法與外界互動。封裝的原則是使物件以外的部分不能隨意的存取和操作物件的內部屬性,從而避免了外界對物件內部屬性的破壞。

(1)可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

  • private:类中限定为private的成员,只能被这个类本身访问。
  • default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
  • protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
  • public:类中限定为public的成员,可以被所有的类访问。

(2)封装的优点

  1. 良好的封装能够减少耦合
  2. 类内部的结构可以自由修改
  3. 可以对成员变量进行更精确的控制
  4. 隐藏信息,实现细节

(3)代码实例

  1. 将 id、name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
  2. 提供set方法进行赋值,提供get方法进行取值。
  3. 赋值方法set中的this的作用是解决显式参数与局部变量同名的问题。
package com.nezha.javase;

public class Student {
    //将 id、name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2、继承

子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。

  • Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
  • 继承实现了代码的复用。
  • Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
  • 子类不能继承父类中访问权限为private的成员变量和方法。
  • 子类可以重写父类的方法,即命名与父类同名的成员变量。

Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。super 的使用有三种情况:

  • 访问父类被隐藏的成员变量
  • 调用父类中被重写的方法
  • 调用父类的构造函数

3、多态

对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。

Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。

  • 编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
  • 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。

4、重载

  • 方法重载是让类以统一的方式处理不同数据类型的手段。
  • 一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
  • 返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。

5、重写

  • 子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写 (Overriding)。
  • 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  • 子类函数的访问修饰权限不能低于父类的。

五、对象间的四种关系

1、依赖

依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。 

2、关联

关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。

3、聚合

聚合(Aggregation) 關係是關聯關係的一種,是強的關聯關係。聚合是整體和個體之間的關係。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關係便整體和個體的關係。與關聯關係一樣,聚合關係也是透過實例變數實現的。但是關聯關係所涉及的兩個類別是處在同一層次上的,而在聚合關係中,兩個類別是處在不平等層次上的,一個代表整體,另一個代表部分。 

4、組合

組合(Composition) 關係是關聯關係的一種,是比聚合關係強的關係。它要求普通的聚合關係中代表整體的物件負責代表部分物件的生命週期,組合關係是不能共享的。代表整體的對象需要負責維持部分對象和存活,在某些情況下將負責代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另一個對象,由後者負責此對象的生命週期。換言之,代表部分的物件在每一個時刻只能與一個物件發生組合關係,由後者排他地負責生命週期。部分和整體的生命週期一樣。 

推薦學習:《java學習教學

以上是簡單聊聊java物件導向的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除