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++的數組動态記憶體配置設定的時候接觸過,是以了解起來還是比較容易的。不過要做到像李老師說的那樣立馬在腦中構成一個棧--堆關系圖,對于稍微複雜的關系的時候,就有點困難,這個還需要多多練習。
可能受到以前一直熟悉的面向過程的程式設計思路的影響,很多時候,很難立馬轉向面向對象的考慮。應該注意培養這方面的習慣。這個問題,僅僅靠學習一些面向對象的概念和知識點是不夠的,需要多做練習,來鍛煉思路,從思想上轉變過來。