目錄
1.撲克牌Demo
2.方法的定義
3.參數(shù)的值傳遞
4.可變參數(shù)
5.方法重載和構(gòu)造方法
1.撲克牌Demo
一個(gè)小程序讓大家了解方法的定義和使用
生成一副撲克牌:
1.首先要?jiǎng)?chuàng)建一張牌(包括點(diǎn)數(shù)和花色),需要在Poker類定義點(diǎn)數(shù)和花色(此處只展示了主程序,Poker類的定義很簡單俱恶,只需定義一個(gè)Poker類蝙叛,在下面定義dot(點(diǎn)數(shù))和pic(花色)屬性就好了)间景,便于在MyClass程序中直接使用Poker的兩種屬性兄春;
2.生成保存點(diǎn)數(shù)和花色的數(shù)組主胧;
3.生成保存所有撲克牌的數(shù)組晦譬,并用for循環(huán)用同一種方法創(chuàng)建整副撲克牌疤苹;
4.用增強(qiáng)for循環(huán)輸出所有的撲克牌(視自己的需求而定,增強(qiáng)for循環(huán)對數(shù)組順序沒有要求敛腌。
另外卧土,我們還需要有一些基礎(chǔ)的了解
println 自動(dòng)換行
print 不換行
數(shù)組一旦創(chuàng)建惫皱,內(nèi)存空間確定,無法變化
在撲克牌的生成中尤莺,需要對數(shù)組進(jìn)行訪問旅敷,需要使用遍歷數(shù)組的方法,把數(shù)組中所有元素全部體現(xiàn)出來
如何遍歷一個(gè)數(shù)組
//1.for循環(huán)對數(shù)組進(jìn)行操作
for (int i = 0; i < titles.length; i++) {
System.out.println(titles[i]);
}
//2.增強(qiáng)for循環(huán)(只關(guān)心你得到的颤霎,不關(guān)心是第幾個(gè))
for (String temp : titles){
System.out.println(temp);
有了以上基礎(chǔ)后媳谁,我們一起來看看整個(gè)撲克牌Demo的實(shí)例吧:
public class MyClass {
public static void main(String[] args) {
{
//生成一副牌
//準(zhǔn)備一個(gè)數(shù)組保存所有的點(diǎn)數(shù)
String[] dots = new String[]{
"2","3","4","5","6",
"7","8","9","10","J",
"Q","K","A"
};
//保存所有的花色
String[] pics = new String[]{"?","?","?","?"};
//保存所有的撲克牌
Poker[] pokers = new Poker[52];
int index = 0;//記錄存到第幾張撲克牌
for(String dot : dots){
for (String pic : pics){
//創(chuàng)建一張撲克牌
Poker poker = new Poker();
poker.dot = dot;
poker.pic = pic;
pokers[index] = poker;
index++;
}
}
//輸出一副牌
for (Poker poker : pokers){
System.out.print(poker.dot + poker.pic + " ");
}
}
}
}
2.方法的定義
首先我們應(yīng)該了解各種名詞的性質(zhì)
屬性:類所具有的能引用的東西
方法:類的行為,類能做的事或具有的狀態(tài)
類 -> 內(nèi)部類:在類的內(nèi)部友酱,還可以定義這個(gè)類所具有的其他類晴音,方便歸類的區(qū)分
靜態(tài)代碼塊:特點(diǎn)是在類加載的時(shí)候就執(zhí)行
類方法=靜態(tài)方法
對象方法=實(shí)例方法
- Java是面向?qū)ο蟮恼Z言,一切皆對象 類缔杉,Java里面方法是不能獨(dú)立存在的锤躁,只能在類里面聲明
a.沒有參數(shù)的實(shí)例方法:
public class Person {
//定義一個(gè)沒有參數(shù)的實(shí)例方法
public void eat(){
}
但以下定義方法是錯(cuò)誤的
public void eat(){
}
public class Person {
}
由此可知,方法必須定義在類里面壮吩,也就是說:方法是歸類管轄的进苍,不能越界。
b.有具體參數(shù)的實(shí)例方法:
public class Person {
public void work(String tool, String dest){
}
}
c.靜態(tài)方法
和非靜態(tài)方法的區(qū)別:
- 定義的區(qū)別:靜態(tài)方法 使用static修飾
- 意義的區(qū)別:
1.靜態(tài)方法依附于這個(gè)類本身鸭叙,比實(shí)例方法優(yōu)先被加載;
2.當(dāng)這個(gè)類被加載到內(nèi)存中觉啊,這個(gè)類就被加載了,而此時(shí)對象還不存在;
3.所以只能用這個(gè)類來調(diào)用靜態(tài)方法;
4.對象方法依附于對象沈贝,必須創(chuàng)建這個(gè)類的一個(gè)對象杠人,用對象來調(diào)用
static可以修飾以下內(nèi)容
-變量 靜態(tài)變量
-方法 靜態(tài)方法
-類(內(nèi)部類)靜態(tài)內(nèi)部類
下面是靜態(tài)方法和實(shí)例(對象)方法的空間關(guān)系的運(yùn)行先后順序示意圖
d.有返回值的方法
public String test(){
//做一定的操作
return "result";
}
下面演示四種方法的調(diào)用方法:
public class MyClass {
public static void main(String[] args) {
Person p = new Person();
p.eat();// 沒有參數(shù)的實(shí)例方法
p.work(tool: "榔頭",dest: "工地");//有參數(shù)的實(shí)例方法
String result = p.test();//想要返回值
p.test();//不想要返回值
Person.test2();//靜態(tài)方法調(diào)用
}
}
3.參數(shù)的值傳遞
Java參數(shù)傳遞機(jī)制:值傳遞(傳遞過去的是當(dāng)前變量的一份拷貝)
1.如果傳遞的是一個(gè)參數(shù),則對方法無影響宋下;
- 右邊的函數(shù)將左邊a的值拷貝過來嗡善,但是右邊的操作不影響左邊a的值。所以傳遞的是拷貝不是指針
public void eat(int a){
a++;
}
程序定義參數(shù)并賦值学歧,然后將參數(shù)傳遞給eat()方法
{
int a = 10;
Person p = new Person();
p.eat(a);
System.out.println("a = " + a);
}
程序打印結(jié)果為:a = 10
2.如果傳遞的是一個(gè)對象罩引,則方法會(huì)隨對象賦值變化而變化(傳遞了對象的地址)。
首先枝笨,我們創(chuàng)建一個(gè)Car類袁铐,定義一個(gè)Car屬性:WheelCount
public class Car {
public int wheelCount;
}
然后在Person類里面定義一個(gè)test3()方法,并把Car類定義的對象car傳遞過來横浑,聲明WheelCount = 4
public void test3(Car car){
car.wheelCount = 4;
}
我們在主程序里面給Car類定義一個(gè)對象bz剔桨,并聲明Car bz的屬性WheelCount = 8,然后將對象bz傳遞給Person類的test3()方法徙融,讓bz的屬性WheelCount在test3()方法中運(yùn)算后洒缀,賦值給對象bz,最后打印WheelCount的值
{
Car bz = new Car();
bz.wheelCount = 8;
Person p = new Person();
p.test3(bz);
System.out.println("wheel count is " + bz.wheelCount);
}
打印結(jié)果:
wheel count is 4
我們可以看到,雖然我們聲明屬性WheelCount時(shí)树绩,數(shù)值為8萨脑,但是將對象bz傳遞給test3()方法計(jì)算過后,屬性WheelCount的值最終變?yōu)?葱峡。由此可見砚哗,當(dāng)傳遞對象時(shí)龙助,方法會(huì)隨著對象賦值變化而變化砰奕,也就是說,我們將這個(gè)對象進(jìn)行了二次計(jì)算提鸟,最后賦值給這個(gè)對象军援。
我們來看看對象值傳遞的過程示意圖吧
4.可變參數(shù)
首先在Person類里面創(chuàng)建一個(gè)有參數(shù)的test4()方法,但是不知道有多少參數(shù)称勋,于是使用可變參數(shù)示意
}
//可變參數(shù) 參數(shù)的個(gè)數(shù)不一定
//使用數(shù)組來接收
//String ... agrs 等價(jià)于 String[] args;
public void test4(String ... args){
for (int i = 0; i < args.length; i++){
System.out.println(args[i]);
}
}
在主程序中調(diào)用test4()方法胸哥,并給參數(shù)賦值
{
Person p = new Person();
p.test4( ...args : "jack","rose","marry");
}
5.方法重載和構(gòu)造方法
方法的重載:同一個(gè)類里面 方法名相同 參數(shù)一定不同
方法的重載和返回值、修飾符沒有關(guān)系
例如以下兩個(gè)方法赡鲜,參數(shù)不同空厌,方法名相同,就算方法的重載
public class Person {
public void eat(int a){
a++;
}
public void eat(float b){
}
}
構(gòu)造方法:如何去創(chuàng)建一個(gè)對象
系統(tǒng)默認(rèn)提供一個(gè)無參數(shù)的構(gòu)造方法
特點(diǎn):
- 方法名和類名相同银酬;
- 沒有返回值嘲更;
方法重載能解決兩個(gè)問題
1.讓代碼更簡潔;
例如以下兩個(gè)方法調(diào)用的區(qū)別:
a.定義兩個(gè)方法揩瞪,第二個(gè)方法是第一個(gè)方法的重載
public Car(){
}
public Car(int count, int cEngine, int cSeat){
wheelCount = count;
engine = cEngine;
seat = cSeat;
}
b.在主函數(shù)調(diào)用兩個(gè)方法
{
//調(diào)用第一個(gè)方法
Car c1 = new Car();
c1.wheelCount = 4;
c1.engine = 2;
c1.seat = 7;
//調(diào)用第二個(gè)方法
Car c2 = new Car( count : 4, cEngine : 2, cSeat : 7);
}
2.在數(shù)據(jù)使用時(shí)能保證有數(shù)據(jù)赋朦;
a.如果使用第一種方法,可能出現(xiàn)數(shù)據(jù)的丟失:
先調(diào)用test()方法再引用屬性engine時(shí):
{
Car c1 = new Car();
c1.test();
c1.engine = 3;
}
運(yùn)行方法test()結(jié)果為:
engine count:0
先引用屬性engine再調(diào)用test()方法時(shí):
{
Car c1 = new Car();
c1.engine = 3;
c1.test();
}
運(yùn)行方法test()結(jié)果為:
engine count:3
b.如果使用第二種方法李破,在創(chuàng)建方法時(shí)就進(jìn)行了賦值操作宠哄,數(shù)據(jù)是不會(huì)丟失的
{
Car c2 = new Car( count : 3, cEngine : 2, cSeat : 7);
c2.test();
}
運(yùn)行方法test()結(jié)果為:
engine count:2
總結(jié)
1.方法的創(chuàng)建和調(diào)用是編程中經(jīng)常使用到的內(nèi)容,必須要靈活掌握方法的使用嗤攻;
2.方法的重載能在編程中讓代碼更簡潔易懂毛嫉,并且減少bug的產(chǎn)生;
3.在進(jìn)行參數(shù)傳遞的操作中妇菱,一定要注意是僅對參數(shù)本身進(jìn)行傳遞還是對對象進(jìn)行了傳遞承粤,對對象進(jìn)行了傳遞就是地址的拷貝,會(huì)更改原有數(shù)據(jù)恶耽。