《算法》1.2-數(shù)據(jù)抽象

1.數(shù)據(jù)抽象

  1. ** 數(shù)據(jù)類(lèi)型:**值+值上的操作
    Java編程的基礎(chǔ):主要是使用class關(guān)鍵字構(gòu)造被稱(chēng)為引用類(lèi)型的數(shù)據(jù)類(lèi)型。
    抽象數(shù)據(jù)類(lèi)型:能夠?qū)κ褂谜唠[藏?cái)?shù)據(jù)表示的數(shù)據(jù)類(lèi)型,關(guān)鍵字private限制,支持封裝。
  2. 抽象數(shù)據(jù)類(lèi)型VS靜態(tài)方法庫(kù)
    同:java類(lèi)實(shí)現(xiàn),接受參數(shù),可能返回指定類(lèi)型值。
    異:抽象數(shù)據(jù)類(lèi)型中可能含有多個(gè)和類(lèi)名相同的且沒(méi)有返回值的構(gòu)造函數(shù),實(shí)例方法不需要static關(guān)鍵字。

2.對(duì)象

  1. 對(duì)象:是能夠承載數(shù)據(jù)類(lèi)型的值的實(shí)體。
    狀態(tài)——實(shí)例屬性的值。
    標(biāo)識(shí)——能夠?qū)⒁粋€(gè)對(duì)象區(qū)別于另一個(gè)對(duì)象,可以認(rèn)為是它在內(nèi)存中的位置。
    行為——數(shù)據(jù)類(lèi)型的操作。
    引用是訪問(wèn)對(duì)象的一種方式,Java使用術(shù)語(yǔ)引用類(lèi)型以示和原始數(shù)據(jù)類(lèi)型(變量和值相關(guān)聯(lián))的區(qū)別??梢岳斫鉃橐镁褪莾?nèi)存中的地址。
  2. 創(chuàng)建對(duì)象
    創(chuàng)建對(duì)象:new 類(lèi)名(參數(shù))
    ①為新的對(duì)象分配內(nèi)存空間
    ②調(diào)用構(gòu)造函數(shù)初始化對(duì)象中的值
    ③等式左邊創(chuàng)建了Counter的引用變量
    ④“=”操作符使對(duì)象引用指向剛創(chuàng)建的對(duì)象。注意是指向,不是賦值。
    變量關(guān)聯(lián):指向?qū)ο蟮囊?,而非?shù)據(jù)類(lèi)型的值本身。
Counter heads=new Counter("heads");
Counter tails=new Counter("tails");
image.png
  1. 調(diào)用實(shí)例方法
    關(guān)鍵:方法每次觸發(fā)都和一個(gè)對(duì)象相關(guān)。
    靜態(tài)方法調(diào)用是通過(guò)類(lèi)名,而實(shí)例方法調(diào)用是通過(guò)對(duì)象名。靜態(tài)方法是實(shí)現(xiàn)某個(gè)函數(shù),實(shí)例方法是數(shù)據(jù)類(lèi)型的操作。
  2. 賦值語(yǔ)句
    使用引用類(lèi)型的賦值語(yǔ)句將會(huì)創(chuàng)建該引用的一個(gè)副本,而不是創(chuàng)建新的對(duì)象。
    別名:兩個(gè)變量指向同一個(gè)對(duì)象。
Counter c1 = new Counter("ones");
c1.increment();
Counter c2 = c1;
c2.increment();
StdOut.println(c1);
  1. 對(duì)象作為參數(shù)???
    《thinking in Java》:When you’re passing primitives into a method,you get a distinct copy of the primitive. When you’re passing a reference into a method, you get a copy of the reference.
    傳遞的是參數(shù)的副本: 基本類(lèi)型傳遞的是值的副本、對(duì)象傳遞的是引用的副本。 我們無(wú)法改變參數(shù)本身的值。
    if we pass a reference to an object of type Counter, the method cannot change the original reference (make it point to a different Counter), but it can change the value of the object.
    http://www.cnblogs.com/maying3010/p/5837227.html
  2. 將對(duì)象作為返回值???
  3. 數(shù)組也是對(duì)象
    在java中所有非原始數(shù)據(jù)類(lèi)型都是對(duì)象(int、double、boolean、char),也就是說(shuō)數(shù)組也是對(duì)象。和其他對(duì)象一樣,當(dāng)我們將數(shù)組傳遞給一個(gè)方法或講一個(gè)數(shù)組變量放在賦值語(yǔ)句的右側(cè)時(shí),我們都是在創(chuàng)建該數(shù)組引用的一個(gè)副本,而非數(shù)組的副本。
  4. 對(duì)象的數(shù)組
    ①調(diào)用數(shù)組的構(gòu)造函數(shù)創(chuàng)建數(shù)組
    ②為每個(gè)數(shù)組元素調(diào)用它的構(gòu)造函數(shù)創(chuàng)建相應(yīng)的對(duì)象。
    對(duì)象數(shù)組:由對(duì)象的引用組成的數(shù)組,而非對(duì)象本身。
  5. 字符串
    java中的String值是一串可以由索引訪問(wèn)的char值。
//i從0開(kāi)始索引
String()
int length()
int charAt(int i)
int indexOf(String p) //frst occurrence of p (-1 if none)
int indexOf(String p, int i) //frst occurrence of p afer i (-1 if none)
String concat(String t)
String substring(int i, int j) //[i,j)
String[] split(String delim)
int compareTo(String t)
boolean equals(String t)
int hashCode()

注意:String可以不使用構(gòu)造函數(shù)來(lái)創(chuàng)建并初始化:String s=“hello”

3.數(shù)據(jù)類(lèi)型的設(shè)計(jì)

  1. **抽象數(shù)據(jù)類(lèi)型的實(shí)現(xiàn) **



    ①實(shí)例變量:需要通過(guò)對(duì)象名訪問(wèn)。
    ②構(gòu)造函數(shù):沒(méi)有返回值,初始化實(shí)例變量,名稱(chēng)總是和類(lèi)名相同。
    ③實(shí)例方法:不需要static、可以訪問(wèn)實(shí)例變量。
    API:實(shí)現(xiàn)調(diào)用和實(shí)現(xiàn)的分離,以實(shí)現(xiàn)模塊化編程。

  2. 接口繼承
    接口繼承可以使我們的程序能夠調(diào)用接口中的方法操作接口的任意類(lèi)型的對(duì)象。
public interface Datable
{
int month();
int day();
int year();
}
//and then referred to the interface in our implementation code
public class Date implements Datable
{
// implementation code (same as before)
}
  1. 實(shí)現(xiàn)繼承
    subclassing:定義一個(gè)子類(lèi)繼承父類(lèi)的所有實(shí)例和方法。子類(lèi)繼承會(huì)破會(huì)封裝。
    ①父類(lèi)的任何改動(dòng)都會(huì)影響它的所有子類(lèi)
    ②子類(lèi)代碼可以訪問(wèn)所有實(shí)例變量,可能會(huì)扭曲父類(lèi)代碼的意圖。
  2. 等價(jià)性
    ①兩個(gè)引用變量a==b是判斷兩個(gè)引用是否指向同一個(gè)對(duì)象。
    ②通常是要判斷對(duì)象的值是否相同。
  3. 內(nèi)存管理

    通過(guò)記錄孤兒對(duì)象并將它們的內(nèi)存釋放,這種回收內(nèi)存的方式叫做垃圾回收。
  4. 不可變性
    對(duì)象創(chuàng)建后對(duì)象的實(shí)例值無(wú)法被改變,使用關(guān)鍵字final修飾。final只能用來(lái)保證原始數(shù)據(jù)類(lèi)型的實(shí)例變量的不可變性,無(wú)法用于引用類(lèi)型的變量。
public class Vector
{
private final double[] coords;
public Vector(double[] a)
{ coords = a; }
...
}
double[] a = { 3.0, 4.0 };
Vector vector = new Vector(a);
a[0] = 0.0; // Bypasses the public API.

實(shí)例變量coords[ ]是private final的,但是Vector是可變的,因?yàn)橛美龘碛兄赶驍?shù)據(jù)的一個(gè)引用,可以通過(guò)a[i]改變vector中的值。

  1. ** 棄用的方法**
    不再被支持但為了保持兼容性而留在API中的方法叫做棄用的方法。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容