天天看點

魔樂科技,第二天,java學習,進入正題

A

當編譯完成之後,運作java 類名指令的時候,報錯找不到指定的類

解決方法:

set classpath=.

修改classpath值到目前路徑。

3月25日,Java開始第二天了,也是老師說的正題,記得3月24日,李興華老師講解的真是太辛苦了,幫助我們大家一起複習到了8點多,不得不佩服老師的敬業精神。

今天開始講解面向對象部分了,開始學習了。

今天所講的知識點

A 面向對象的特性

B 類與對象的關系及其定義格式(屬性、構造方法、setter方法、getter方法、其他普通方法)

C 匿名對象

D String類及其相關的方法

E 引用傳遞問題

F this關鍵字

G 接收本類的引用

我對知識點的了解

A 面向對象中有三大特征:

• 封裝性:除了通過特定的方法之外,不可以直接通路其中的屬性

• 繼承性:将其他的功能繼承下來繼續發展

• 多态性:對父類不同的繼承就是多态

B 一、類與對象的關系

1、類是一個共性的産物,是一個抽象的定義,而對象,是一個個性的産物,是一個具體的個體。

2、類必須通過對象才可以使用,而對象的所有特征和操作都必須在類中定義。

3、類由屬性和方法組成:

• 屬性:描述的是靜态特征

• 方法:描述的是動态特征,是某類對象具有的行為或者功能。例如:說話、吃飯、唱歌、睡覺

二、類的定義格式

class ClassName

{

//在開發中必須對屬性進行封裝

//采用private關鍵字,那麼屬性值就隻能通過setter及getter方法設定和取得

private DataType1 PropertiesName1;

......

//一個類中至少要有一個構造方法

//構造方法的名字必須和類名一緻,并且不可以有傳回值類型,而且必須是public權限

//無參構造方法,如果沒有其他的構造方法,此方法可以省略定義,JAVA會自動生成

//如果有其他的構造方法,那麼無參構造方法需要自己寫,JAVA不會自動生成

//一般類定義中都要有一個無參無操作的構造方法,友善對象的聲明

public ClassName(){}

//可以定義其他的構造方法,即重載構造方法,這樣友善實作各種執行個體化對象

public ClassName(參數清單)

{

//可以調用本類中的this.setter方法進行屬性設定

//因為在本類中,是以也可以直接對屬性進行指派

設定屬性的語句;

}

//通過setter方法對屬性進行設定

//在設定屬性值的時候,最好考慮是否需要檢查屬性值的合理性和合法性

public void setPropertiesName1(DataType1 p)

{

PropertiesName1=p;

}

....

//通過getter方法擷取屬性值

public DataType1 getPropertiesName1()

{

return PropertiesName1;

}

....

//其他方法的定義

//注意,在類的定義中,不要使用System.out.println()語句,如果需要輸出,把值傳回給調用方再輸出

}

三、對象的聲明和執行個體化

提示:類的使用必須依靠執行個體化的對象;

1、聲明的同時執行個體化

類名稱 對象名稱 = new 類名稱() ;

2、先聲明一個對象,之後再執行個體化對象

|- 類名稱 對象名稱=null; //聲明一個對象,但是此對象無法使用,因為無具體指向的堆空間

|- 對象名稱=new 類名稱(參數清單); //執行個體化該對象

3、提示:不管任何情況下,隻要是調用了關鍵字new,則表示開辟新的堆記憶體空間

4、在類的操作中,所有的對象名稱放在了棧空間中,而對象的具體屬性内容放在了堆空間中,而所有的方法代碼則放在了全局代碼區;

C 沒有名字的對象;

隻使用一次的對象可以通過匿名對象的方式完成,一次使用完之後即成為垃圾,等待被G•C回收

例如:new Person("張三",30)

D 一、String類的特殊之處

String類的對象執行個體化很特殊,可以不調用其構造方法,而采用直接指派的方式。

這樣做的優點最重要的是友善編寫使用,也節省記憶體空間。

二、兩個String對象進行比較

兩個String對象進行比較不能使用比較運算符“==”,而必須采用String的equals()方法

public boolean equals(String anObject);

三、一個字元串常量就是一個匿名的對象

四、String的對象的内容不可改變,要改變的也隻是其記憶體的重新指向;

五、String類常用的重要方法

1、關于字元和字元串的方法

No. 方法名稱 類型 描述

1 public char charAt(int index) 普通 根據下标找到指定的字元

2 public char[] toCharArray() 普通 以字元數組的形式傳回全部的字元串内容

3 public String(char[] value) 構造 将全部的字元數組變為字元串

4 public String(char[] value,int offset,int count) 構造 将指定範圍的字元數組變為字元串

2、關于位元組與字元串的方法

No. 方法名稱 類型 描述

1 public byte[] getBytes() 普通 将字元串變為位元組數組

2 public String(byte[] bytes) 構造 将位元組數組變為字元串

3 public String(byte[] bytes,int offset,int length) 構造 将指定範圍的位元組數組變為字元串

3、關于判斷是否以指定内容開頭或者結果

No. 方法名稱 類型 描述

1 public boolean startsWith(String prefix) 普通 從第一個位置開始判斷是否以指定的内容開頭

2 public boolean startsWith(String prefix,int toffset) 普通 從指定的位置開始判斷是否以指定的内容開頭

3 public boolean endsWith(String suffix) 普通 判斷是否以指定的内容結尾

4、關于字元串替換操作的方法

No. 方法名稱 類型 描述

1 public String replace(char oldChar,char newChar) 普通 替換指定字元

2 public String replaceAll(String regex,String replacement) 普通 替換指定的字元串

3 public String replaceFirst(String regex,String replacement) 普通 替換第一個滿足條件的字元串

5、關于對字元串進行截取操作的相關方法

No. 方法名稱 類型 描述

1 public String substring(int beginIndex) 普通 從指定位置開始一直截取到末尾

2 public String substring(int beginIndex,int endIndex) 普通 截取指定範圍的字元串

6、關于講字元串進行拆分的方法

No. 方法名稱 類型 描述

1 public String[] split(String regex) 普通 按照指定的字元串拆分

2 public String[] split(String regex,int limit) 普通 拆分字元串,并指定拆分的個數

7、關于在字元串中實作查找的方法

No. 方法名稱 類型 描述

1 public boolean contains(String s) 普通 傳回一個字元串是否存在

2 public int indexOf(int ch) 普通 從頭向尾查找指定的字元是否存在,char  int,如果存在則傳回位置,如果不存在則傳回“-1”。

3 public int indexOf(int ch,int fromIndex) 普通 從指定位置向後查找指定的字元是否存在,char  int,如果存在則傳回位置,如果不存在則傳回“-1”。

4 public int indexOf(String str) 普通 從頭向尾查找指定的字元串是否存在,如果存在則傳回位置,如果不存在則傳回“-1”。

5 public int indexOf(String str,int fromIndex) 普通 從指定位置向後查找字元串是否存在,如果存在則傳回位置,如果不存在則傳回“-1”。

6 public int lastIndexOf(int ch) 普通 從字元串的最後向前查找,指定的字元是否存在,如果存在則傳回位置,如果不存在則傳回“-1”。

7 public int lastIndexOf(int ch,int fromIndex) 普通 從字元串的指定的位置向前查找,指定的字元是否存在,如果存在則傳回位置,如果不存在則傳回“-1”。

8 public int lastIndexOf(String str) 普通 從字元串的最後向前查找,指定的字元串是否存在,如果存在則傳回位置,如果不存在則傳回“-1”。

9 public int lastIndexOf(String str,int fromIndex) 普通 從字元串的指定的位置向前查找,指定的字元串是否存在,如果存在則傳回位置,如果不存在則傳回“-1”。

8、關于字元串的其他操作

No. 方法名稱 類型 描述

1 public boolean isEmpty() 普通 判斷字元串是否為空,指的是内容為空“""”

2 public int length() 普通 取得字元串的長度

3 public String toLowerCase() 普通 把字元串中的字母轉小寫

4 public String toUpperCase() 普通 把字元串中的字母轉大寫

5 public String trim() 普通 去掉字元串中開頭和結尾的空格,中間的空格不去

6 public String concat(String str) 普通 實作字元串連接配接操作

E 1、類對象是按引用傳遞的,對形參對象屬性的修改,會間接影響實參對象的屬性值;

2、String對象作為參數傳遞時,形參的修改不會影響實參,因為對于String對象的字元串内容不可以改變,改變的隻是其記憶體指向,是以形參對象的重新指向不會影響實參對象的指向。

3、但是如果一個引用對象作為參數,而對形參的字元串類型的屬性進行修改,那是會影響實參的該字元串類型的屬性的。

F 1、調用類中的屬性

如果在類中需要明确指出操作的是本類中的屬性,那麼就需要通過this.屬性名的方式,否則會發生使用錯誤

2、調用本類中的普通方法

加與不加this效果是一樣的

3、調用本類中的構造方法

使用this(【參數】)的形式

使用以上的文法有兩點注意:

(1)使用this調用構造方法的語句隻能出現在構造方法的首行

(2)使用this調用其他構造方法的時候隻少保證有一個構造方法沒有使用this()調用,作為調用的出口

總之一句話:this表示目前的對象

G 接收本類對象的引用,隻用于對本類對象的比較才用。

這樣做的目的是直接可以通路本類的私有屬性,友善代碼的編寫。

H

I

J

K

備注:

A 現在要求設計一個表示學生的類,裡面有學生的三項成績:計算機成績、數學成績、英語成績

要求可以求總分、平均分、最高、最低分,并且可以輸出一個學生的完整資訊。

個人收獲:

1.一個java程式必須包含一個主類(即包含主方法的類,這是程式運作的入口點)

2.在非主類的定義中不要包含System.out.println()語句,如果需要輸出,把值傳回給調用方再輸出

3.在編寫構造方法的時候注意保留無參無操作語句的構造方法

4.所有的屬性必須封裝

5.在具體方案的設計之前,最好給出類圖

類圖的定義結構如下:

類名稱

屬性名稱

方法名稱

其中類名稱就直接寫:如Student

屬性名稱,要按照一個标準格式編寫:修飾符 屬性名稱 : 屬性類型。

|- private的修飾符使用“-”表示:

|- public的修飾符使用“+”表示:

例如:private String name:-name:String

方法名稱,也要按照一個标準的格式編寫:修飾符方法名稱(參數名稱:參數類型):傳回值類型。

例如:public void setName(String s):+setName(s:String):void

可以使用Sysbase的PowerDesigner工具,根據向導進行類圖的手工設計;

如果編寫代碼比較熟悉,也可以直接編寫代碼,儲存成*.java檔案,然後通過PowerDesigner工具檔案菜單下的指令選擇Java語言,并添加該*.java檔案轉換成類圖;

案例名稱:

B 判斷一個給定的email位址是否正确,現在隻判斷是否存在“@”和“.”

個人收獲:

1.不要在主方法中直接寫代碼,具有某個特定功能的代碼可以組裝成一個方法

2.要考慮一些問題的隐含條件,例如@應該在 . 之前

3.在定義判斷某些現象的方法時,把結果傳回給調用方處理,不要直接輸出

案例名稱:

C 給出一個字元串:

• TOM:89|JERRY:79|TONY:99

• 将其轉換成如下的形式輸出:

|- TOM  89

|- JERRY  79

|- TONY  99

個人收獲:

我的答案:

public class Test2{

public static void main(String args[])

{

String str="TOM:89|JERRY:79|TONY:99";

String str1=(str.replaceAll(":","-->")).replace('|','\n');

String str2[]=str1.split("\n");

for(int i=0;i<str2.length;i++)

{

System.out.println("|- "+str2[i]);

}

}

}

老師的答案:

public class ExecDemo02{

public static void main(String args[]){

String str = "TOM:89|JERRY:79|TONY:99" ;

String s1[] = str.split("\\|") ;

for(int i=0;i<s1.length;i++){

String s2[] = s1[i].split(":") ;

System.out.println(s2[0] + " --> " + s2[1]) ;

}

}

}

采用了轉義字元,因為“|”是個邏輯運算符

案例名稱:

D 設計類實作:一個人有一本書,一本書屬于一個人

個人收獲:

1、可以從Oracle資料庫設計表的思路中獲得靈感

2、先設計實體類,再考慮之間的關系表示

3、一對一的關系,隻要在兩個類中分别加上對方類型的資料成員即可。

class Person{

private String name ;

private int age ;

private Book book ; // 一個人有一本書

public Person(){}

public Person(String n,int a){

this.setName(n) ;

this.setAge(a) ;

}

public void setBook(Book b){

book = b ;

}

public Book getBook(){

return book ;

}

public void setName(String n){

name = n ;

}

public void setAge(int a){

age = a ;

}

public String getName(){

return name ;

}

public int getAge(){

return age ;

}

};

class Book{

private String title ;

private Person person ; // 一本屬于一個人

public Book(){}

public Book(String t){

this.setTitle(t) ;

}

public void setPerson(Person p){

person = p ;

}

public Person getPerson(){

return person ;

}

public void setTitle(String t){

title = t ;

}

public String getTitle(){

return title ;

}

};

案例名稱:

E 進一步延伸:一個人有一本書,一本書屬于一個人,一個人還會有一個孩子,一個孩子也會有一本書。

個人收獲:

還是先找實體類,并且能準确找對實體類,比如此處,實體類隻有人和書

注意:孩子首先是屬于人這一類,然後人這個類會具有孩子這個屬性,是以在原來類中再增加一個Person類的child成員即可。

class Person{

private String name ;

private int age ;

private Book book ; // 一個人有一本書

private Person child ;

};

今天的問題;

A 當編譯完成之後,運作java 類名指令的時候,報錯找不到指定的類

解決方法:

set classpath=.

修改classpath值到目前路徑。

今天下午上課的時候,有一段時間很困,幾次差點趴下,不過還好,堅持過來了,從明天開始中午還是需要午休一會兒,來保證下午的上課效率。

今天學的内容很多,很雜,需要記住的東西比較多,這還需要多花時間去鞏固。

對于記憶體配置設定問題,之前在學習c++的數組動态記憶體配置設定的時候接觸過,是以了解起來還是比較容易的。不過要做到像李老師說的那樣立馬在腦中構成一個棧--堆關系圖,對于稍微複雜的關系的時候,就有點困難,這個還需要多多練習。

可能受到以前一直熟悉的面向過程的程式設計思路的影響,很多時候,很難立馬轉向面向對象的考慮。應該注意培養這方面的習慣。這個問題,僅僅靠學習一些面向對象的概念和知識點是不夠的,需要多做練習,來鍛煉思路,從思想上轉變過來。

繼續閱讀