java 面向對象必懂概述

(這是大體框架,以后部分知識細寫)

?

1? ? 抽象過程

所有編程語言都提供抽象機制。可以認為,人們能解決的問題的復雜性直接取決于抽象的類型質量。

類型:指的是所抽象的是什么。

匯編語言是對底層機器語言的輕微抽象;

c、BASIC等命令式語言是對匯編語言的抽象;

這些語言雖然有很大的改進,但是他們做的主要抽象仍要求在解決問題時基于計算機的結構而不是問題的結構。這就要求程序員必須建立起機器模型(計算機)和實際問題的模型(一項業務)之間的關聯。這是非常費力的,使得程序難編寫,維護代價高昂。

另一種建模方式是針對特定問題進行建模,對于要解決的特定類型的問題來說,他們是非常不錯的,但是一旦超出了特定領域,就顯得力不從心了。

面向對象的方式通過向程序員提供表示問題空間中的元素的工具而更進一步。我們把問題空間(計算機)中的元素和在解空間中的表示成為“對象”

Alan Kay總結了第一個成功的面向對象語言的五個特性:

1)萬物皆對象(理論上講,可以抽取問題的任何概念化構件,比如貓,建筑、服務)

2)程序是對象的集合,他們通過發送消息來告知彼此要做的。

3)每個對象都有自己的由其他對象所構成的存儲(換句話說,可以通過創建包含現有對象的包來創建新類型對象)

4)每個對象都擁有自己的類型(每個對象都是某個類的實例,例如旺財是狗的實例)

5)某一特定類型的所有對象都可以接收同樣的信息

簡潔來說,對象具有狀態、行為和標識。


2? ?類和對象

?

:類是一個模板,它描述一類對象的行為和狀態。(比如貓類狗類動物類)

對象:對象是類的一個實例,有狀態和行為。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。

現在讓我們深入了解什么是對象。看看周圍真實的世界,會發現身邊有很多對象,車,狗,人等等。所有這些對象都有自己的狀態和行為。拿一條狗來舉例,它的狀態有:名字、品種、顏色,行為有:叫、搖尾巴和跑。

對比現實對象和軟件對象,它們之間十分相似。軟件對象也有狀態和行為。軟件對象的狀態就是屬性,行為通過方法體現。在軟件開發中,方法操作對象內部狀態的改變,對象的相互調用也是通過方法來完成。

每種編程語言都有自己的操作內存中元素的對象,在java中,萬物都是對象。注意,我們操作的是對象的引用:可以想象成電視機和遙控器,我們操作的是遙控器。

String s;

創建了一個引用,也就是遙控,但是他現在不能操作電視。

存儲的地方有:

1)寄存器: 最快的存儲區,它位于處理器內部,人們不能直接控制,也不能在程序中感覺到寄存器的存在。

2)堆棧:位于RAM,通過堆棧指針可以從處理器獲得直接支持,靠指針移動來分配或釋放內存,這是快速有效的方法。創建程序時,java系統必須知道存儲在堆棧內的所有項的生命周期。(引用存儲在堆棧

3)堆:一種通用的內存池,存放所有的java對象。不需要知道存儲的數據的生命周期。但是用堆進行分配和清理會比用堆棧需要更多時間。

4)常量存儲:直接放在程序法代碼內部,這樣做是安全的,因為它們永遠也不會改變,存放在ROM。

5)非RAM存儲:如果數據完全活在程序之外,它可以不受任何程序的控制。比如流對象和持久化對象

有的對象比較小、簡單,所以存儲在堆里往往不是很好,我們把他們存在堆里就可以了,這種對象我們把他們叫做基本類型。

boolean\char\byte\short\int\long\float\double\void


3? ?提供部分服務

?

當正在開發或者試圖理解一個程序設計時,最好的方法之一就是將對象想象為一個服務的提供者。

因為程序本身一定會向用戶提供服務,它將調用其他對象的服務來實現這一目的,我們的目標就是去創建能夠提供理想的服務來解決問題的一系列對象。遇到需求請問一下自己:“如果我將問題從表象中抽取出來,什么樣的對象可以解決我的問題?”他們看起來是什么樣子?他們能夠提供哪些服務?他們需要哪些對象才能履行他們的義務?如此持續的這樣做,我們會發現“這個對象好像挺簡單”。

將對象想象為一個服務的提供者,有助于提高內聚性。

人們設計對象面臨的一個問題是:將過多的功能放到了一個對象中。在良好的面向對象設計中,每個對象都可以良好的完成一個任務,但是它并不試圖做更多的事。


4? ?隱藏

將開發人員分為類創建者和客戶端程序員是非常科學的。客戶端程序員的目標是收集各種用來實現快速應用開發的類。而類的創建者的目標是構建類,這種類只向客戶端程序員暴露必須的部分,隱藏其他的部分。被隱藏的部分通常是對象內部比較脆弱的部分,他們很容易被粗心或不知內情的客戶端程序員毀壞,所以被隱藏(保護)起來。

java用三個關鍵字設定邊界:

public 對任何人可用。

private除了創建者和對象內部方法,其他任何人都不能訪問,這就像是和客戶端程序員的一堵墻,或者說是程序的保護傘。

protected和private類似,區別是繼承的類可以訪問。

無關鍵字為包權限,可以訪問同一個包的其他類成員。


5? ?復用

一旦類被創建并測試完,他就應該被視為有用的代碼單元。代碼復用是面向對象程序設計語言所提供的最了不起的優點之一。

兩種復用方法:

1)組合:把已知類放入新的類中,新的類可以由任意數量、類型的其它類組成。就像拿零件組裝汽車。

?

注意:組合帶來了極大的靈活性。由于繼承在面向對象中如此重要,所以經常被高度強調,很多程序員因此忽視了組合,處處都繼承,有時候,這樣是不科學的,不符合常理的,會導致過分復雜的設計。在建立新類時,應優先考慮組合。

?

2)繼承:我們以現有的類為基礎,添加和修改副本來創建新類。就是繼承。經典例子就是圖形:每一個圖形都有尺寸、顏色、位置等,都可以被繪制、擦出、移動、著色等。在此基礎上,可以有圓形、正方形、三角形等。他們每一個圖形都具有圖形類的特點,并有屬于自己的特點。

?

注意:繼承是否應該只繼承基類的屬性方法,而不添加新的屬性和方法呢?

如果這樣做,就意味著新類和基類是完全相同的數據類型,因為它們具有完全相同的接口。這可以被視作純粹替代,這是一種處理繼承的理想方式。這種關系為is a的關系,比如“圓形是一個(is a)形狀”。

有時必須添加新的接口元素。這樣其實并不完美,因為基類無法訪問新的方法。這種情況是is like a(像是),比如空調,房子具備了讓你控制冷氣的接口和制冷空調,后來你用了能制冷制熱的新設備替換了空調,但是房子的設計就是只涉及==設計了制冷接口,所以盡管新對象接口擴展了,但是現有系統對新街口一無所知。


6? ?多態

?

多態:同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果。

比如你是一個酒神,對酒情有獨鐘。某日回家發現桌上有幾個杯子里面都裝了白酒,從外面看我們是不可能知道這是些什么酒,只有喝了之后才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒….在這里我們可以描述成如下:

????? 酒 a = 劍南春

????? 酒 b = 五糧液

????? 酒 c = 酒鬼酒

????? …

????? 這里所表現的的就是多態。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這一個父類就能夠引用不同的子類,這就是多態——我們只有在運行的時候才會知道引用變量所指向的具體實例對象。

?

注意:我們或許都寫過這樣的方法:它接收一個基類參數,比如酒,然后不管這個酒是哪種酒,都能執行對應的方法。

這些代碼不是:“如果是劍南春,就這樣做,是五糧液,就那樣做。。。。。。”

而是:“你是酒,我知道你是酒,我知道你可以做一些事,那么,就去做吧”


7? ?單根繼承

?

在面向對象編程中,有一個很矚目的問題:是否所有類最終都繼承自單一的類。

在java中,答案是:是的。

而c++則不是。

具體利弊以后會解釋


8? ?容器

如果不知道在解決問題時需要多少對象,或者存活多久,那就不可能知道怎么存儲他們了。

容器(也稱為集合)在任何需要的時候都可以擴充自己以容納所有的東西。

好的OOP語言都有屬于自己的容器,比如c++的STL,Object Pascal的VCL,java也一樣有大量容器,有list、set、map等。

?

9? ?生命期

?

10? ?錯誤

?

11? ?并發

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++基礎學習(12)--(多線程、Web編程)

文章目錄目錄1.多線程2.web編程目錄 1.多線程 #include <iostream> // 必須的頭文件 #include <pthread.h>using namespace std;#define NUM_THREADS 5// 線程的運行函數 void* say_hello(void* args) {cout << "Hello Runoob&#xff01;" <&…

《Head First設計模式》第九章(1)迭代器模式

迭代器模式 因為這一章涉及到兩個模式&#xff0c;內容有點多&#xff0c;還有一個組合模式留到下一篇寫吧。 有許多種方法可以把對象堆起來成為一個集合&#xff08;collection&#xff09;。你可以把它們放進數組、堆棧、列表或者是散列表&#xff08;Hashtable&#xff09…

Java內存模型常見問題

1.什么是內存模型&#xff1f; 在多核系統中&#xff0c;處理器一般有一層或者多層的緩存&#xff0c;這些的緩存通過加速數據訪問&#xff08;因為數據距離處理器更近&#xff09;和降低共享內存在總線上的通訊&#xff08;因為本地緩存能夠滿足許多內存操作&#xff09;來提高…

數據結構和算法(03)---棧和隊列(c++)

文章目錄目錄一.棧1.棧的基本操作2.使用C模板類實現棧二.隊列1.隊列的基本操作2.循環隊列**循環隊列順序存儲****循環隊列鏈式存儲**3.雙端隊列目錄 數據結構&#xff1a; 邏輯結構&#xff1a;數組&#xff0c;棧&#xff0c;隊列&#xff0c;字符串&#xff0c;樹&#xff0c…

索尼XB950N1 震撼人心的重低音

雖然題目是震撼人心的重低音&#xff0c;但是低音可以通過app調節&#xff0c;所以我們可以用這個耳機聽各種類型的歌曲。 索尼XB950N1與XB950B1非常相似&#xff0c;但索尼XB950N1提供了主動降噪&#xff0c;續航稍長一些。從藍牙3.0升級到了藍牙4.1&#xff0c;改善了傳輸范…

數據結構和算法(04)---數組,動態內存,vector(c++)

文章目錄目錄數組1.數組的申明2.數組的初始化3.二維數組4.指向數組的指針5.傳遞數組給函數動態內存1.new &#xff0c;delete運算符2.數組的動態內存分配vector1.vector基本操作2.vector使用3.vector動態二維數組 初始化和賦值目錄 數據結構&#xff1a; 邏輯結構&#xff1a;數…

數據結構和算法(05)---鏈表(c++)

文章目錄目錄鏈表的基本概念1.數組和鏈表鏈表的使用1.鏈表的簡單使用2.鏈表的進階使用3.鏈表的高階使用4.鏈表的其他操作鏈表容器list1.list介紹2. list使用3. list與vector之間的區別4.list例子代碼目錄 數據結構&#xff1a; 邏輯結構&#xff1a;數組&#xff0c;棧&#xf…

論文閱讀 狀態壓縮

狀態壓縮 Abstract 信息學發展勢頭迅猛&#xff0c;信息學奧賽的題目來源遍及各行各業&#xff0c;經常有一些在實際應用中很有價值的問題被引入信息學并得到有效解決。然而有一些問題卻被認為很可能不存在有效的(多項式級的)算法&#xff0c;本文以對幾個例題的剖析&#xf…

數據結構和算法(06)---二叉樹(c++)

文章目錄目錄二叉樹1.二叉樹的基本概念2.二叉樹的應用和時間復雜度3.二叉樹的插入4.二叉樹的查找5. 二叉樹的遍歷6.二叉樹的刪除二叉樹的基本操作1.二叉樹的基礎操作2.代碼實現創建二叉樹和三種遍歷二叉樹的方法目錄 數據結構&#xff1a; 邏輯結構&#xff1a;數組&#xff0c…

如何轉載CSDN博客

前言 對于喜歡逛CSDN的人來說&#xff0c;看別人的博客確實能夠對自己有不小的提高&#xff0c;有時候看到特別好的博客想轉載下載&#xff0c;但是不能一個字一個字的敲了&#xff0c;這時候我們就想快速轉載別人的博客&#xff0c;把別人的博客移到自己的空間里面&#xff0c…

程序員歌曲推薦

更多的時候&#xff0c;不光是電腦和鍵盤陪著我們度過一天&#xff0c;耳機和音樂也成了IT人生活中必不可少的一部分 上班和下班的路上&#xff0c;心情失落時&#xff0c;失眠時&#xff0c;甚至是工作時都可能會聽音樂&#xff0c;讓音樂為我們療傷&#xff0c;讓精神得以放…

如何在博客內添加音樂

<center> <iframe border"0" width"480" height"640" src"//music.163.com/outchain/player?type0&amp;id448977181;auto1&amp;height430"> </iframe> </center> 將代碼復制到markdown編輯器里&am…

CSDN寫博客(字體顏色、大小)

markdown里面的標記語言可以使用標簽對來實現對文本文字顏色大小信息的控制。下面給出幾個實例&#xff1a; 黑體字示例 微軟雅黑示例 華文彩云示例 color#00ffff size可以根據實際大小進行設置&#xff0c;一般不超過7。 紅色字體CSDN 紅色字體CSDN 使用十六進制顏色值 …

bose qc30 安靜的城市是什么樣子

使用感受 網友1&#xff08;20歲&#xff09;&#xff1a; 當你帶著這個耳機聽音樂的時候&#xff0c;有一種感覺&#xff0c;感覺這個世界都是你歌曲里的MV&#xff0c;這個枯燥乏味的世界都被賦予了你心中的那份情感&#xff0c;這種感覺&#xff0c;真的很棒 網友2&#…

DeepLearning.ai 提煉筆記(5-1)-- 循環神經網絡

參考博客 Class 5: 序列模型Sequence Models Week 1: 循環神經網絡RNN (Recurrent) 文章目錄Class 5: 序列模型Sequence ModelsWeek 1: 循環神經網絡RNN (Recurrent)目錄序列模型-循環神經網絡1.序列模型的應用2.數學符號3.循環神經網絡模型傳統標準的神經網絡循環神經網絡的…

常見人工智能比賽平臺總結

目錄1.kaggle比賽1.1 kaggle比賽是什么&#xff1f;1.2 為什么舉辦kaggle比賽&#xff1f;1.3 kaggle比賽形式是什么&#xff1f;1.4 kaggle比賽的獎勵制度是什么&#xff1f;2.阿里天池比賽2.1 阿里天池比賽是什么&#xff1f;2.2 為什么舉辦阿里天池比賽&#xff1f;2.3 阿里…

機器學習模型評分總結(sklearn)

文章目錄目錄模型評估評價指標1.分類評價指標acc、recall、F1、混淆矩陣、分類綜合報告1.準確率方式一&#xff1a;accuracy_score方式二&#xff1a;metrics2.召回率3.F1分數4.混淆矩陣5.分類報告6.kappa scoreROC1.ROC計算2.ROC曲線3.具體實例2.回歸評價指標3.聚類評價指標1.…

kaggle (02) - 房價預測案例(進階版)

房價預測案例&#xff08;進階版&#xff09; 這是進階版的notebook。主要是為了比較幾種模型框架。所以前面的特征工程部分內容&#xff0c;我也并沒有做任何改動&#xff0c;重點都在后面的模型建造section Step 1: 檢視源數據集 import numpy as np import pandas as pd讀…

《Head First設計模式》第二章筆記 觀察者模式

背景 客戶有一個WeatherData對象&#xff0c;負責追蹤溫度、濕度和氣壓等數據。現在客戶給我們提了個需求&#xff0c;讓我們利用WeatherData對象取得數據&#xff0c;并更新三個布告板&#xff1a;目前狀況、氣象統計和天氣預報。 WeatherData對象提供了4個接口&#xff1a; …

libsvm總結

1. 訓練 格式&#xff1a;model libsvmtrain(training_label_vector, training_instance_matrix [, libsvm_options]); 這個函數有三個參數&#xff0c;其中 -training_label_vector:訓練樣本的類標&#xff0c;如果有m個樣本&#xff0c;就是m x 1的矩陣&#xff08;類型必須…