目錄
1.Setter、Getter和toString方法
2.面向?qū)ο髮?shí)現(xiàn)發(fā)牌項(xiàng)目
1.Setter、Getter和toString方法
a.Setter、Getter方法的作用:間接訪問private修飾的成員變量;
b.Setter、Getter方法什么時(shí)候使用:當(dāng)外部需要使用這個(gè)屬性,并且該屬性是私有的時(shí)候;
例如我們先在Person類里面定義不同修飾符的屬性,其中name和addr屬于私有屬性,money屬于公共類,然后在主程序中運(yùn)行。
public class Person {
private String name;
private String addr;
public int money;
}
public class MyClass {
public static void main(String[] args) {
Person p = new Person();
//直接訪問
p.money = 200;
//間接訪問
p.setName("jack");
System.out.println("I have " + p.money + " money");
System.out.println("My name is " + p.getName());
}
}
- 我們很明顯能知道:name和addr是不能直接使用的,但是我們在主程序中使用name屬性時(shí)使用了:p.setName,然后后面打印的時(shí)候使用到:p.getName。這就是我們的Setter和Getter方法。
- 那么我們怎么使用Setter、Getter方法呢,下面就來展示一下吧
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
這里出現(xiàn)了一個(gè)我們沒有見過的方法:this.name。先講講“this.”的使用方法和什么時(shí)候使用吧
- 當(dāng)出現(xiàn)歧義的時(shí)候,我們就要使用this方法來調(diào)用,例如上面已經(jīng)出現(xiàn)name,但是在使用Setter方法時(shí)又出現(xiàn)了name,就算是出現(xiàn)了歧義,這時(shí)就要使用this來調(diào)用上面的name。
- this方法可以調(diào)用屬性和方法
于是便出現(xiàn)一個(gè)問題:總是手動輸入Setter和Getter方法特別麻煩,那么有沒有什么快捷方法能為我們快速添加Setter和Getter方法呢,下面就開看看吧
1.MacOS:Ctrl + enter 打開快捷欄,里面有Getter and Setter(選擇要生成Getter和Setter的字段)/Constructor(快速提供構(gòu)造方法)等快捷方式,也有單獨(dú)的添加某一個(gè)Setter或Getter方法的快捷方式;
2.Windows:在導(dǎo)航欄的"Help"->"Find Action"中直接搜索你想要的快捷方式



- 其他方法同理,直接搜索使用就好了
1.建議setter/getter方法放在最后面(方便代碼閱讀)
2. 構(gòu)造方法寫在屬性下面
c.toString方法
例如我們輸出一個(gè)之前創(chuàng)建的對象p
System.out.println(p);
打印結(jié)果為:com.example.java.Day3.Person@42a57993
這是java的自動toString方法,如果你沒有創(chuàng)建toString方法的話,系統(tǒng)會默認(rèn)把你的輸出的東西轉(zhuǎn)化為字符串,這里顯示的是p的地址
當(dāng)你輸入toString時(shí),系統(tǒng)會進(jìn)行提示并自動添加這一段toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", addr='" + addr + '\'' +
", money=" + money +
'}';
當(dāng)我們添加完這段代碼之后,再次打印p的時(shí)候會是什么樣子呢
打印結(jié)果為:Person{name='jack', addr='null', money=200}
toString方法的實(shí)現(xiàn)方式和作用
1.當(dāng)使用print輸出一個(gè)對象時(shí) 就會去這個(gè)對象內(nèi)部查找toStrong方法
2.如果沒有實(shí)現(xiàn)name 那么會從父類Object里面去查找toString的實(shí)現(xiàn)
3.Object里面默認(rèn)使用 類名@hashCode
4.重寫toString方法是為了在調(diào)試的時(shí)候快速獲取這個(gè)對象的信息
2.面向?qū)ο髮?shí)現(xiàn)發(fā)牌項(xiàng)目
1.分析功能、抽取類:PokerManager和Poker
2.開始實(shí)現(xiàn)功能
a.Poker類,管理一張牌的信息(點(diǎn)數(shù)和花色/設(shè)置為私有屬性)并提供構(gòu)造方法、set和get方法(外部使用)和重寫toString方法(便于調(diào)試)
public class Poker {
private String dot; //記錄點(diǎn)數(shù)
private String pic; //記錄花色
//提供構(gòu)造方法
public Poker(String dot, String pic) {
this.dot = dot;
this.pic = pic;
}
//set和get方法(外部使用)
public String getDot() {
return dot;
}
public void setDot(String dot) {
this.dot = dot;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
//重寫toString方法(便于調(diào)試)
@Override
public String toString() {
return dot + pic;
}
}
b.Constants類,管理所有不變的東西(點(diǎn)數(shù)和花色)
public class Constants {
//保存所有點(diǎn)數(shù)
public static final String[] POKRE_DOTS = new String[]{
"2","3","4","5","6",
"7","8","9","10","J",
"Q","K","A"
};
//保存所有的花色
public static final String[] POKER_PICS = new String[]{"","","",""};
}
這里使用static的目的時(shí)在程序開始運(yùn)行的時(shí)候就把這些已知的東西運(yùn)行好,便于使用
final:修飾成員變量,表示這是一個(gè)常量,不能被更改,被修飾屬性通常使用大寫字母
c.PokerManager類,管理一副牌的所有操作(生成 洗牌 顯示)
Step1.先給這副撲克牌定一個(gè)框架(即一個(gè)保存撲克牌的數(shù)組),并實(shí)現(xiàn)構(gòu)造方法和初始化數(shù)組
//保存一副牌
private ArrayList<Poker> pokers;
//實(shí)現(xiàn)構(gòu)造方法
public PokerManager(){
//初始化數(shù)組
pokers = new ArrayList<>();
}
這里使用的不是一般的數(shù)組,而是List類型的數(shù)組,使用這個(gè)數(shù)組是為了后面shuffle類(洗牌)直接引用數(shù)組
Step2.生成一副牌:這次我們使用的遍歷數(shù)組方法是需要考慮順序的(上次的撲克牌Demo直接用增強(qiáng)for循環(huán)沒有考慮順序),我們直接用兩個(gè)for循環(huán)吧點(diǎn)數(shù)和花色組合起來依次取出,然后創(chuàng)建一張組合好的撲克牌并保存,依次保存整副撲克牌
//生成一副牌(撲克牌 麻將)
public void generateOnePackOfCard(){
for (int i = 0; i < Constants.POKRE_DOTS.length; i++) {
//取出i對應(yīng)的點(diǎn)數(shù)
String dot = Constants.POKRE_DOTS[i];
//為這個(gè)點(diǎn)數(shù)創(chuàng)建4種花色
for (int j = 0; j < Constants.POKER_PICS.length; j++) {
//取出j對應(yīng)的花色
String pic = Constants.POKER_PICS[j];
//創(chuàng)建一張牌
Poker poker = new Poker(dot,pic);
//保存這張牌
pokers.add(poker);
}
}
}
Step3.洗牌操作:這沒什么說的,系統(tǒng)直接提供的方法可以使用,方法對數(shù)組的要求是List類型
//洗牌
public void shuffle(){
// 1 2 3 4 5
Collections.shuffle(pokers);
}
Step4.顯示一副牌:這里不用考慮順序的話,直接使用增強(qiáng)for循環(huán)進(jìn)行遍歷,逐個(gè)輸出一副牌
//顯示一副牌
public void show(){
int index = 0;
for (Poker poker : pokers){
//使用print不自動換行
System.out.print(poker);
//使顯示的時(shí)候每8張牌換一行
if ((index + 1) % 8 == 0){
System.out.println(" ");
}
index++;
}
}
d.MyClass類,主程序,直接調(diào)用其他類定義好的方法
public class MyClass {
public static void main(String[] args) {
//創(chuàng)建管理器manager
PokerManager manager = new PokerManager();
//生成一副牌
manager.generateOnePackOfCard();
//洗牌
manager.shuffle();
//顯示
manager.show();
}
}
某次洗牌后的一副牌:
7810691053
582AQ846
8394952J
JQK1063QK
344KQ96A
AK2J7A72
J1057
總結(jié)
1.在定義屬性和方法的時(shí)候權(quán)限盡量小一點(diǎn),不要直接上來就public,如果外部有需要,設(shè)置一個(gè)“Getter and Setter”方法對屬性或者方法進(jìn)行調(diào)用就好了,或者實(shí)在有需要,可將修飾符改為其他比較適合的修飾符;
2.toString方法方便調(diào)試,return后面可以自由設(shè)定返回值,很方便,也可直接使用系統(tǒng)提供的返回值;
3.在寫一個(gè)程序時(shí),東西盡量分開寫,不要擠在一起顯得很凌亂沒有頭緒。