java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
?
***對(duì)象作為參數(shù)傳遞***
class passparam
{ int x;
? public static void main(String[] args)
? { passparam obj = new passparam();
??? obj.x=5;
??? change(obj);
??? System.out.println(obj.x);
??? //如果change方法不是靜態(tài)的,想調(diào)用它就得寫成? new passparam().change(obj);
? }
? public static void change(passparam obj) //如果這個(gè)函數(shù)前面沒加static編譯出錯(cuò),因?yàn)榉庆o態(tài)方法,不能被靜態(tài)方法直接調(diào)用,main
是一個(gè)靜態(tài)方法。
? { obj.x=3;}
}
結(jié)果:? 3
***數(shù)組作為參數(shù)傳遞***
class passparam
{ int x;
? public static void main(String[] args)
? { passparam obj = new passparam();
??? int []x=new int[1];
??? x[0]=5;
??? change(x);
??? System.out.println(x[0]);
? }
? public static void change(int[] x)
? { x[0]=3; }
}???
結(jié)果:? 3
***靜態(tài)變量、靜態(tài)方法的使用***
靜態(tài)變量相當(dāng)于全局變量
class Chinese
{ static string country="中國(guó)";? //如果改為private static string country="中國(guó)" 下面的兩處調(diào)用,就會(huì)出錯(cuò)
? String name;
? int age;
? static void sing()
?{ System.out.println("啊~~")
? void singOurCountry()
?{ System.out.println(country);
?? sing();
?}
}
class TestChinese
{ public static void main(String[] args)
? { System.out.println(Chinaese.country); //static 靜態(tài)變量可以直接引用
??? Chinese ch1=new Chinese();
??? ch1.singOurCountry();
??? System.out.println(ch1.country);
??? Chinese.sing();? //靜態(tài)方法的引用
??? new.Chinese.sing(); // 用對(duì)象引用方法?
? }
}
--------------------------------
class Chinese
{ private static int count=0; //定義一個(gè)靜態(tài)整形變量
? static?????? //靜態(tài)代碼塊?? 類在第一次使用時(shí),初使化
? { count=2;?? //這個(gè)類在第一次使用時(shí),count被初使化
??? System.out.println("static code")
? }
? String name;
? int age;
? public Chinese()
? { System.out.println(++count); }
?}
class TestChinese
{ public static void main(String[] age){
? System.out.println("static begin")
? new Chinese();
? System.out.println("end")?
? new Chinese();
? new Chinese();
?}
}
輸出結(jié)果為
static begin
static code
? 3
end
?? 4
?? 5
------------------------------------
**靜態(tài)方法? 注意:
? 1、在靜態(tài)方法里只能直接調(diào)用同類中其它的靜態(tài)成員(包括變量和方法)。這是因?yàn)?#xff0c;對(duì)于非靜態(tài)方法和變量,需要先創(chuàng)建類的實(shí)例對(duì)象后
才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。
? 2、靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字。與上面的的道理一樣,因?yàn)殪o態(tài)方法在使用前不用創(chuàng)建任何實(shí)例對(duì)象,當(dāng)靜態(tài)方法被
調(diào)用時(shí),this所引用的對(duì)象根本就沒有產(chǎn)生。
? 3、main()方法是靜態(tài)的,因此JVM在執(zhí)行main方法時(shí)不創(chuàng)建main方法所在類的實(shí)例對(duì)象,因而在main()方法中,我們不能直接訪問(wèn)該類中的
非靜態(tài)成員,必須創(chuàng)建該類的一個(gè)實(shí)例對(duì)象后,才能通過(guò)這個(gè)對(duì)象去訪問(wèn)類中的非靜態(tài)成員。
class B{
?public void b(){ System.out.print("000");}
?public static void e(){}
?public void c(){b();
???????????????? e();
??????????????? }? //類中的非靜態(tài)方法可以調(diào)用該類中的其它非靜態(tài)方法,和靜態(tài)方法
}
class A{
?public static void main(String[] args){
? new B().c();
?
?}
}
----------------------------------------
**靜態(tài)代碼塊
?1、一個(gè)類中可以使用不包含在任何方法中的靜態(tài)代碼塊(static block),當(dāng)類被載入時(shí),靜態(tài)代碼塊被執(zhí)行,且只被執(zhí)行一次,靜態(tài)塊經(jīng)常
來(lái)進(jìn)行類屬性的初始化。
?2、類中的靜態(tài)代碼塊被自動(dòng)執(zhí)行,盡管我們產(chǎn)生了類的多個(gè)實(shí)例對(duì)象,但其中的靜態(tài)代碼塊只被執(zhí)行了一次。當(dāng)一個(gè)程序中用到了其他的類
,類是在第一次被使用的時(shí)候才被裝載,而不是在程序啟動(dòng)時(shí)就裝載程序中所有可能要用到的類。?
---------------------------
***單態(tài)設(shè)計(jì)模式***? 使類在內(nèi)存中只創(chuàng)建一個(gè)實(shí)例對(duì)象
class Chinese
{
private static Chinese objRef = new Chinese();? //這里必須用static,由于1、下面是用靜態(tài)方法調(diào)用? 2、如果不用static就會(huì)陷入死
循環(huán)中,因?yàn)槊縿?chuàng)建一個(gè)objRef對(duì)象,就會(huì)重新載入Chinese類,然后又調(diào)用objRef類。
? private static int count=0;
? public static Chinese getInstance()????? //Chinese 為這個(gè)方法的返回類型,??? 這個(gè)方法是用靜態(tài)方法來(lái)調(diào)用靜態(tài)變量
?{ return objRef; }
? private Chinese() //單態(tài)設(shè)計(jì)模式要把構(gòu)造函數(shù)設(shè)為私有的
?{ System.out.println(++count); }
?
?}
class TestChinese
{ public static void main(String[] age){
? Chinese obj1 = chinese.getInstance();
? Chinese obj2 = chinese.getInstance();
? System.out.println(obj1==obj2);?? //返回結(jié)果為true
? new Chinese(); //此處出錯(cuò),因?yàn)闃?gòu)造函數(shù)已經(jīng)是私有的了,所以不能再這樣定義對(duì)象了。
? }
}
注意:1,構(gòu)造函數(shù)必須設(shè)為private
????? 2, 類里面定義的對(duì)象必須是private,static,也可以加上final
????? 3, 類里面要有一個(gè)調(diào)用對(duì)象的類,這個(gè)類必須是public,static,和類形是這個(gè)類的名 ,類中的其它要調(diào)用的方法還用public
--------------
單態(tài)設(shè)計(jì)模式 :? 所謂類的單態(tài)設(shè)計(jì)模式,就是采取一定的方法保證在整個(gè)的軟件系統(tǒng)中,對(duì)某個(gè)類只能存在一個(gè)對(duì)象實(shí)例,并且該類只提供
一個(gè)取得其對(duì)象實(shí)例的方法,如果我們要讓類在一個(gè)虛擬機(jī)中只能產(chǎn)生一個(gè)對(duì)象,我們首先必須將類的構(gòu)造方法的訪問(wèn)權(quán)限設(shè)置為private,這
樣,就不能用new操作符在類的外部開始產(chǎn)類的對(duì)象了,但在類內(nèi)部仍可以產(chǎn)生該類的對(duì)象。因?yàn)樵陬惖耐獠块_始還無(wú)法得到類的對(duì)象,只能調(diào)
用該類的某個(gè)靜態(tài)方法以返回類內(nèi)部創(chuàng)建的對(duì)象,靜態(tài)方法只能訪問(wèn)類中的靜態(tài)成員變量,所以,指向類內(nèi)部產(chǎn)生的該類對(duì)象的變量也必須定
義成靜態(tài)的。
--------------------------------------------------------
***嵌套類***
1.嵌套類可以直接訪問(wèn)嵌套它的類成員,包括private成員,但是,嵌套類的成員卻不能被嵌套它的類直接訪問(wèn)。
2.在類中直接定義的嵌套類的使用范圍,僅限于這個(gè)類的內(nèi)部,也就是說(shuō),A類里定義了一個(gè)B類,那么B為A所知,卻不被A的外面所知。內(nèi)部類
的定義和普通類的定義沒什么區(qū)別,它可以直接訪問(wèn)和引用它的外部類的所有變量和方法,就像外部類中的其他非static成員的功能一樣,和
外部類不同的是,內(nèi)部類可以聲明為private或protected.
3.內(nèi)部類可以用static來(lái)修飾,這樣相當(dāng)于是一個(gè)外部定義的類,它的用法就和外部類一樣了,所以static的內(nèi)部類中可聲明static成員,
static的內(nèi)部類不能再使用外層封裝類的非static的成員變量,staic嵌套類很少使用.
class Outer
{ int outer_i=100;
? void test()
? { Inner in=new Inner();
??? in.display();
? }
? class Inner
? { void display()
??? { System.out.println("display: outer_i="+outer_i); }
? }
}
class? InnerClassDemo
{? public static void main(String[] args)
?? { Outer outer=new Outer();
???? outer.test();
?? }
}
輸出結(jié)果:display: outer_i=100
------------------------------------------------------------------
經(jīng)驗(yàn): 當(dāng)一個(gè)類中的程序代碼要用到另外一個(gè)類的實(shí)例對(duì)象,而另外一個(gè)類中的程序代碼又要訪問(wèn)第一個(gè)類中的成員,將另外一個(gè)類做成第一
個(gè)類的內(nèi)部類,程序代碼就要容易編寫得多,這樣的情況在實(shí)際應(yīng)用中非常之多!
---------------------------------------------------------------------
***如果函數(shù)的局部變量(函數(shù)的形參也是局部變量),內(nèi)部類的成員變量,外部類的成員變量重名,我們應(yīng)該按下面的程序代碼所使用的方式來(lái)
明確指定我們真正要訪問(wèn)的變量。
pulic class Outer
{ private int size;
? public class Inner
? { private int size;
??? public void doStuff(int size)
??? { size++;? //引用的是doStuff函數(shù)的形參
????? this.size++; //引用的是Inner類中的成員變量
????? Outer.this.size++; //引用的Outer類中的成員變量
??? }
?? }
}
?
----------------------------------------------
****內(nèi)部類如何被外部引用****
內(nèi)部類也可以通過(guò)創(chuàng)建對(duì)象從外部類之外被調(diào)用,只要將內(nèi)部類聲明為Public即可。
class Outer
{ private int size=10;
? public class Inner? //被外部引用,必須聲明為public
? { public void doStuff()
??? { System.out.println(++size); }
? }
}
public class TestInner
{ public static void main(String[] args)
? { Outer a =new Outer();
??? Outer.Inner b=a.new Inner();
??? b.doStuff();
? }
}?
--------------------------------------------------
****方法中定義的內(nèi)部類****
class Outer
{ int outer_i=100;
? void test()
? { for (int i=0;i<5;i++)
??? {? class Inner? //方法中定義的內(nèi)部類
?????? {? void display()
????????? { System.out.println("display: outer_i="+outer_i);}
?????? }????
????????? Inner inner=new Inner();
????????? inner.display();
???? }
? }
}
class InnerClassDemo
{ public static void main(String args[]){
? Outer outer=new Outer();
? outer.test();
?}
}
結(jié)果:??
display: outer_i=100
display: outer_i=100
display: outer_i=100
display: outer_i=100
display: outer_i=100
*在方法中定義的內(nèi)部類只能訪問(wèn)方法中的final類型的局部變量,因?yàn)橛胒inal定義的局部變量相當(dāng)于是一個(gè)常量,它的生命周期超出方法運(yùn)行
的生命周期。
class InOut
{ String str=new String("Between");
? public void amethod(final int iArgs)
? { int it315;
??? class Bicycle
??? {? public void sayHello()
?????? {? System.out.println(str);
????????? System.out.println(iArgs);
?????? }
??? }
? }
}
在內(nèi)部類中的sayHello方法中,我們可以訪問(wèn)變量iArgs和str,但不能訪問(wèn)it315??
------------------------------------------------------------
*****使用文檔注釋******
對(duì)于類的說(shuō)明應(yīng)在類定義之前,對(duì)于方法的說(shuō)明應(yīng)在方法定義之前。
import java.io.*;
/**
?* Title: engineero類<br>
?* Description: 通過(guò)engineer類來(lái)說(shuō)明java中的文檔注釋<br>
?* Copyright: (C) 2003 www.it315.org<br>
?* Company: IT人資訊交流網(wǎng)<br>
?* @author 張孝祥
?* @version 1.00
*/
?public class engineer
?{
?? public String Engineer_name;
? /**
?? * 這是engineer對(duì)象的構(gòu)造函數(shù)
?? * @param name engineer的名子
? */
?public engineer(String name)
?{
?}
/**
?* 這是repairing方法的說(shuō)明
?* @param sum 需要修理的機(jī)器總數(shù)
?* @param alltime需要修理的總時(shí)間
?* @return Repairing的數(shù)量
*/
?public int repairing (int sum, int alltime)
?{
? }
}
-----------------------------------------------------------------
<br> 在html中換行,而帶有@標(biāo)志的屬性會(huì)自動(dòng)換行,結(jié)尾就省略了<br>
@author <作者姓名>? 用于類的說(shuō)明,表示這個(gè)java程序的作者
@version<版本信息>? 用于類的說(shuō)明,表示這個(gè)java程序的開發(fā)版本。
@param<參數(shù)名稱><參數(shù)說(shuō)明> 用于方法的說(shuō)明,表示方法所引入的參數(shù),及其參數(shù)對(duì)應(yīng)的說(shuō)明
@return<返回值說(shuō)明> 用于方法的說(shuō)明,表示此方法的返回值表示的意義。
----------------------------------------------------------------
在dos下 存放文件的目錄下輸入
javadoc -d engineer -version -author engineer.java
javadoc 就會(huì)生成這個(gè)類的說(shuō)明文件
-d 用來(lái)制定說(shuō)明文件存放的目錄
engineer 為說(shuō)明文件所存放的目錄名;
-version 代表要求javadoc程序在說(shuō)明文件中加入版本信息
-author 表示要求javadoc程序在說(shuō)明文件中加入作者信息
總結(jié)
以上是生活随笔為你收集整理的java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java学习笔记(三)----成员权限,
- 下一篇: java学习笔记(五)----super