/*此總結的主要內容是我在學習JAVA過程中,認爲需要記憶的知識點。並結合之前自己學習C++及javascript的相關知識,註明JAVA在一些情況下與這兩門語言的相同及不同之處。*/
(1)方法重載
JAVA區分重載方法的方式有:(1)參數個數。(2)參數類型。(3)參數順序。(注意:返回值並不能作爲函數重載的區分方式)
在重載過程中,基本類型能從一個較小類型自動提升到一個較大的類型。整型常數值會被當作int值處理,所以會調用接受int型參數的重載方法。char型如果無法找到恰好接受char參數的方法,就會直接提升至int型。對於其它類型的參數,如果存在多個類型大於該參數類型的重載函數,會爲其匹配提升類型最小的重載函數。比如一個short型參數,有三個重載函數分別接受int型,float型,double型參數,會爲其匹配接受int型的重載函數,而不是直接提升到float和double型。
public class initialize {
boolean Boolean;//默認初始化爲false
static int a;
static int b;
static{//在第一次創立對象或者第一次調用靜態成員時初始化一次
a=0;
b=1;
System.out.print("a and b initialized.a="+a+",b="+b+"\n");
}
int c;
int d;
int e=4;
{
System.out.print("Boolean initialized"+Boolean+"\n");
System.out.print("c and d not initialized.c="+c+",d="+d+"\n");
System.out.print("e initialized e="+e+"\n");
c=2;
d=3;
System.out.print("c and d initialized.c="+c+",d="+d+"\n");
}
initialize(){
e=5;
System.out.print(" constructor e initialized e="+e+"\n");
}
static public void printfF(){
System.out.print("static f is initialized?f="+f+"\n");
}
static int f;//靜態數據成員在靜態方法調用前先一步被初始化,與其定義位置無關。
public static void main(String[] args){
initialize.printfF();
new initialize();
}
}
輸出爲:
a and b initialized.a=0,b=1
static f is initialized?f=0
Boolean initializedfalse
c and d not initialized.c=0,d=0
e initialized e=4
c and d initialized.c=2,d=3
constructor e initialized e=5
(2)對象構造器及初始化
當一個對象沒有定義構造器時,編譯器會創建一個默認構造器,。如果對象已經定義了構造器時,編譯器不會再自動創建默認構造器,在創建對象時,一定要調用其定義的構造器,否則編譯器報錯。
對象中沒有被初始化的數據成員會進行自動的初始化,數值型的參數賦值爲0,布爾型參數賦值爲false,對象的引用賦值爲null
如果不想java對數據成員默認初始化,又不使用自定義的構造器初始化,可以有定義類成員變量的地方爲其賦值進行初始化。甚至調用方法來提供初值,該方法可以帶參數,但參數必須是已經被初始化的(使用這種方法須注意參數初始化順序,使用未初始化的參數程序報錯)
使用自定義的構造器進行初使化並不能阻止自動初始化的進行,自動初始化在構造器調用之前發生。
靜態初始化只有在必要時刻纔會進行——第一個該類對象創建或者第一次訪問靜態數據的時候纔會被初始化,之後靜態對象不會再次被初始化。還可以通過static靜態塊對多個 靜態數據同時初始化。
初始化的順序是先靜態對象(只有當該對象中的靜態數據還未被初始化時纔會發生),而後是非靜態對象。
java中也有被稱爲實例初始化的類似語法,用來初始化每一個對象的非靜態變量。它與static靜態塊很類似,除了沒有static 關鍵字。實例初始化子句是在構造器之前執行,這樣可以保證無論調用 了哪個顯式構造器,某些操作都會發生。
數組初始化由一對花括號{ }括起來的值組成。(JS使用[ ]來完成)。
(3)this關鍵字
this關鍵字在方法內部使用並指用該方法本身。
只有需要明確指出對當前對象的引用時,才需要ths關鍵字。如(1)返回當前對象的引用,即以return this作爲返回值。(實現對方法的鏈式調用需要用到這種方式)(JQuery中鏈式調用也是通過返回對象本身來實現的)(2)將當前對象作爲參數傳遞給其它函數。(3)解決對象中的方法使用的參數與對象中的數據成員同名的問題。(4)使用this在構造函數中調用其它構造函數。該構造器調用必需置於最起始處,否則編譯器報錯。示例如下:
public class Flower {
int petalcount=0;
String s="initial value";
Flower(String s,int petalcount){
this(petalcount);
this.s=s;
System.out.print("Second constructor String s:"+s+"\n");
}
Flower(int petalcount){
this.petalcount=petalcount;
System.out.print("Constructor only patalCount:"+petalcount+"\n");
}
Flower(String s){
this.s=s;
System.out.print("Constructor only String s:"+s+"\n");
}
Flower(){
this("hi",520);
System.out.print("default constructor (no args)\n");
}
public static void main(String[] args){
Flower x=new Flower();
}
}
輸出爲Constructor w/ int arg only ,petalCount47
String & int args
default constructor (no args)
petalCount =47 s=hi
(4)static的含義與用法
(5)清理:終結處理和垃圾回收
(6)可變參數列表
public class Newvarargs{
static void printArray(Object... args){
System.out.print(args.getClass());
System.out.print(args.length);
for(Object obj:args) System.out.print(obj+"");
}
}
(7)枚舉類型
enum Spiciness{
NOT,MILD,MEDIUM,HOT,FLAMING
}
public class enumstudy {
public static void main(String[] args){
Spiciness howHot=Spiciness.MILD;
System.out.print(howHot+"\n");
for(Spiciness s:Spiciness.values()){
System.out.println(s+",ordinal"+s.ordinal());
}
}
}
輸出值
NOT,ordinal0
MILD,ordinal1
MEDIUM,ordinal2
HOT,ordinal3
FLAMING,ordinal4