面向對象編程概念
如果你以前從未使用過面向對象的編程語言,那么在開始編寫任何代碼之前,你需要學習一些基本概念,本課將向你介紹對象、類、繼承、接口和包,每個討論都關注這些概念如何與現實世界相關,同時介紹Java編程語言的語法。
什么是對象?對象是理解面向對象技術的關鍵,環顧四周,你會發現許多現實世界中的東西:你的狗,你的桌子,你的電視機,你的自行車。
真實世界的對象有兩個特征:它們都有狀態和行為,狗有狀態(名字,顏色,品種,饑餓)和行為(吠叫,挑逗,搖尾巴),自行車也有狀態(當前齒輪,當前踏板節奏,當前速度)和行為(換檔,改變踏板節奏,踩剎車),識別真實對象的狀態和行為是開始考慮面向對象編程的好方法。
現在花一分鐘觀察你周圍的真實世界,對于你看到的每一個物體,問自己兩個問題:“這個對象可能處于什么狀態?”和“這個對象可能執行什么行為?”,一定要寫下你的觀察結果,正如你所做的,你會注意到現實世界中的對象在復雜性上是不同的;你的臺燈可能只有兩個可能的狀態(打開和關閉)和兩個可能的行為(打開和關閉),但是你的桌面收音機可能有其他狀態(打開、關閉、當前音量、當前站)和行為(打開、關閉、增加音量、減少音量、查找、掃描和調優)。你可能還注意到,一些對象反過來也將包含其他對象,這些實際的觀察結果都轉化為面向對象編程的世界。
軟件對象在概念上與真實世界的對象相似:它們也包括狀態和相關的行為,對象將其狀態存儲在字段中(某些編程語言中的變量),并通過方法(某些編程語言中的函數)公開其行為,方法對對象的內部狀態進行操作,并作為對象到對象通信的主要機制,隱藏內部狀態并要求通過對象的方法執行所有交互稱為數據封裝 — 面向對象編程的基本原則。
以自行車為例:
通過歸因于狀態(當前速度,當前踏板節奏和當前檔位)并提供改變該狀態的方法,該對象仍然控制外部世界如何被允許使用它,例如,如果自行車僅具有6個檔位,則換檔的方法可以拒絕小于1或大于6的任何值。
將代碼打包到多帶帶的軟件對象中可以帶來很多好處,包括:
模塊化:對象的源代碼可以獨立于其他對象的源代碼編寫和維護,一旦創建,對象可以很容易地在系統內部傳遞。
信息隱藏:通過只與對象的方法交互,其內部實現的細節仍然隱藏在外部世界之外。
代碼重用:如果一個對象已經存在(可能由另一個軟件開發人員編寫),你可以在程序中使用該對象,這允許專門實現/測試/調試復雜的、特定于任務的對象,然后你可以信任這些對象在你自己的代碼中運行。
可插入性和調試方便:如果某個特定對象出現問題,你可以簡單地從應用程序中刪除它,并將另一個對象插入替換,這類似于在現實世界中解決機械問題,如果螺栓斷裂,你要更換它,而不是整個機器。
什么是類?在現實世界中,你經常會發現許多多帶帶的物體都是一樣的,可能還有成千上萬的其他自行車存在,所有的制造和模型都是一樣的,每一輛自行車都是用同樣一套藍圖建造的,因此包含了同樣的部件,在面向對象的術語中,我們說你的自行車是稱為自行車的對象類的實例,類是創建單個對象的藍圖。
下面的Bicycle類是自行車的一種可能實現:
class Bicycle { int cadence = 0; int speed = 0; int gear = 1; void changeCadence(int newValue) { cadence = newValue; } void changeGear(int newValue) { gear = newValue; } void speedUp(int increment) { speed = speed + increment; } void applyBrakes(int decrement) { speed = speed - decrement; } void printStates() { System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear); } }
Java編程語言的語法對你來說是全新的,但是這個類的設計是基于之前對自行車對象的討論,字段cadence、speed以及gear表示對象的狀態,方法(changeCadence、changeGear、speedUp等)定義了它與外部世界的交互。
你可能已經注意到,Bicycle類不包含main方法,那是因為它不是一個完整的應用程序;這只是在應用程序中使用的自行車的藍圖,創建和使用新的Bicycle對象的職責屬于應用程序中的其他類。
這里有一個BicycleDemo類,它創建兩個獨立的Bicycle對象并調用它們的方法:
class BicycleDemo { public static void main(String[] args) { // Create two different // Bicycle objects Bicycle bike1 = new Bicycle(); Bicycle bike2 = new Bicycle(); // Invoke methods on // those objects bike1.changeCadence(50); bike1.speedUp(10); bike1.changeGear(2); bike1.printStates(); bike2.changeCadence(50); bike2.speedUp(10); bike2.changeGear(2); bike2.changeCadence(40); bike2.speedUp(10); bike2.changeGear(3); bike2.printStates(); } }
此測試的輸出打印兩輛自行車的cadence,speed和gear:
cadence:50 speed:10 gear:2 cadence:40 speed:20 gear:3什么是繼承?
不同種類的物體之間往往有一定的共同之處,例如山地自行車、公路自行車和雙人自行車,都有自行車的特點(目前的速度,目前的踏板節奏,目前的檔位),然而,每個還定義了使它們不同的其他功能:雙人自行車有兩個座位和兩套車把;公路自行車有彎車把;一些山地自行車有一個額外的鏈環,使它們的齒輪比更低。
面向對象編程允許類從其他類繼承共同的狀態和行為,在這個例子中,Bicycle現在成為了MountainBike、RoadBike和TandemBike的超類,在Java編程語言中,每個類都允許有一個直接的超類,每個超類都可能有無限數量的子類:
創建子類的語法很簡單,在類聲明的開頭,使用extend關鍵字,后跟要繼承的類的名稱:
class MountainBike extends Bicycle { // new fields and methods defining // a mountain bike would go here }
這使MountainBike擁有與Bicycle相同的字段和方法,但它的代碼卻只關注使它獨一無二的特性,這使得子類的代碼易于閱讀,但是,莫必須注意正確記錄每個超類定義的狀態和行為,因為該代碼不會出現在每個子類的源文件中。
什么是接口?正如你已經了解的,對象通過它們公開的方法定義它們與外部世界的交互,方法形成對象與外界的接口;例如,電視機前的按鈕是你和塑料外殼另一面的電線之間的接口,你按下“電源”按鈕,打開和關閉電視。
在最常見的形式中,接口是一組具有空體的相關方法,自行車的行為(如果指定為接口)可能如下所示:
interface Bicycle { // wheel revolutions per minute void changeCadence(int newValue); void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); }
要實現這個接口,你的類的名稱將會改變(例如,對特定品牌的自行車,例如ACMEBicycle),并且你將在類聲明中使用implements關鍵字:
class ACMEBicycle implements Bicycle { int cadence = 0; int speed = 0; int gear = 1; // The compiler will now require that methods // changeCadence, changeGear, speedUp, and applyBrakes // all be implemented. Compilation will fail if those // methods are missing from this class. void changeCadence(int newValue) { cadence = newValue; } void changeGear(int newValue) { gear = newValue; } void speedUp(int increment) { speed = speed + increment; } void applyBrakes(int decrement) { speed = speed - decrement; } void printStates() { System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear); } }
實現接口允許類對其承諾提供的行為變得更加正式,接口在類和外部世界之間形成契約,并且該契約在構建時由編譯器強制執行,如果你的類聲稱實現了一個接口,那么在該類成功編譯之前,該接口定義的所有方法必須出現在其源代碼中。
要實際編譯ACMEBicycle類,你需要將public關鍵字添加到已實現的接口方法的開頭,稍后你將在有關類和對象以及接口和繼承的課程中了解相關原因。什么是包?
包是組織一組相關類和接口的命名空間,從概念上來說,你可以將包看作類似于計算機上的不同文件夾,你可以將HTML頁面保存在一個文件夾中,將圖像保存在另一個文件夾中,將腳本或應用程序保存在另一個文件夾中。因為用Java編程語言編寫的軟件可以由數百或數千個多帶帶的類組成,所以通過將相關的類和接口放置到包中來組織事情是有意義的。
Java平臺提供了一個龐大的類庫(一組包),可以在你自己的應用程序中使用,這個庫被稱為“應用程序編程接口”,簡稱為“API”,它的包代表了最常用于通用編程的工作。例如,String對象包含字符串的狀態和行為;File對象允許程序員輕松地在文件系統上創建、刪除、檢查、比較或修改文件;Socket對象允許創建和使用網絡sockets;各種GUI對象控制按鈕和復選框以及與圖形用戶界面相關的任何其他內容。實際上有成千上萬個類可供選擇,這允許程序員關注特定應用程序的設計,而不是使其工作所需的基礎設施。
Java平臺API規范包含Java SE平臺提供的所有包、接口、類、字段和方法的完整清單,在瀏覽器中加載該頁面并將其添加到書簽,作為程序員,它將成為你最重要的參考文檔。
上一篇:常見問題(及其解決方案) 下一篇:變量文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76445.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續版本中引入的改進。 Java教程是希望使用Java編程語言創建應用程序的程序員的實用指南,其中包括數百個完整的工作示例和數十個課程,相關課程組被組織成教程。 覆蓋基礎知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術和安裝Java開發軟件并使用...
摘要:我們目前正處于一個新興的區塊鏈開發行業中。,一種在以太坊開發人員中流行的新的簡單編程語言,因為它是用于開發以太坊智能合約的語言。它是全球至少萬開發人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 我們目前正處于一個新興的區塊鏈開發行業中。區塊鏈技術處于初期階段,然而這種顛覆性技術已經成功地風靡全球,并且最近經歷了一場與眾不同的繁榮。由于許多...
摘要:是領域最具代表性的問答網站之一。在,開發者能夠為各種相關的開源代碼貢獻自己的力量,也可以發布軟件開發項目。該網站發布各技術領域的高技術含量內容,例如大數據,云計算,,物聯網,開發等。是一個大型的資源類網站,主要涉及源代碼和代碼示例。 Java是一種面向對象的編程語言,由Sun Microsystems公司在1995年的時候正式發布。直到今天,Java都一直是最受歡迎的編程語言之一。如今...
摘要:而面向搜索引擎,就是我們要及時的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網絡尋找答案,你的坑大部分別人都已經走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們為什么要學習Java語言呢...
閱讀 2493·2021-11-15 18:14
閱讀 1718·2021-10-14 09:42
閱讀 3751·2021-10-11 10:58
閱讀 3953·2021-10-09 09:44
閱讀 2418·2021-09-26 09:55
閱讀 2440·2021-09-24 10:38
閱讀 2029·2021-09-04 16:48
閱讀 3273·2021-09-02 15:21