(5)this和static關鍵字及對象初始化過程

1.成員變量與局部變量(方法中或for語句中)區別:
作用域:成員變量在類中有效,局部變量只在方法中有效。
內存特點:成員變量存在於堆內存中,局部變量存在於棧內存中。
2.匿名對象操作屬性沒有意義,匿名對象調用方法只能使用一次,用後就成垃圾對象.當對象要操作多個屬性或方法時就要給他起名。
匿名對象用在:只調用一次方法;作爲實際參數傳入方法,簡化代碼。
3.構造函數特點:
(1)函數名與類名相同
(2)不能定義返回值類型
(3)不能寫return語句,系統也不會自動加上return語句。
4.this關鍵字
this代表它所在方法所屬對象的引用,當類中的方法調用本類的對象的成員時就用this
在一個類中,this一般出現在類成員之間的調用。包括方法中對成員變量的調用,或方法中對另一個方法的調用,因爲成員變量和方法是封裝在對象中的,所以成員之間的調用隱含的是調用某一個對象的那個成員,對象沒有實例化之前,用this表示當前對象,即哪個對象調用這個方法,裏面的this就表示這個對象,同一個類中,this可以常常省略。
(1)方法中形式參數接收的是基本類型的變量
對於方法中的局部變量與成員變量同名的情況下,成員變量被隱藏,如果要調用成員變量,就要用this.變量名顯示錶示。
(2)方法中形式參數接收的是本類的對象
方法中對兩個或多個對象的成員進行操作的時候,這時就要用this顯示錶示調用該方法的對象來加以區分。
(3)構造函數中
構造函數間的調用用this(參數列表),注意沒有"." ,並且構造this(參數列表)要放在第一行。
5.static的理解
(1)內存:靜態成員存在於內存的方法區(也叫共享區、數據區),
                   實例變量存在於堆內存中,實例方法在方法區。
(2)生命週期:靜態成員隨類的加載而加載,隨類的消亡而消亡。
                          實例成員隨對象的創建而產生,隨對象的消失而消失。
(3)靜態方法中不能出現this,super關鍵字,這時對象還沒有產生。
(4)靜態是對象的共性,可以實現數據共享,從而節約內存。
(5)侷限性:靜態方法只能訪問靜態成員,不能訪問非靜態成員。
(6)弊端:生命週期過長。
(7)static修飾的成員可以被類直接調用:類名.靜態成員;
class Person{
String name;                     //成員變量  , 實例變量
static String country="CN";   //靜態變量  , 類變量
}
6什麼時候用靜態?
當類的成員被該類的對象共享時,可以考慮用static修飾成員爲靜態的。
7.當多個對象都要使用一些共同的功能時,就可以考慮對這些功能進行抽取,封裝在一個工具類中,並且其他對象並沒有訪問這個工具類中的特有數據,換句話說其他對象都是共享工具類中的功能。,這時可以將工具類中的方法設爲靜態的,方便其他對象調用,也節約空間。
8.特殊情況:
(1)private修飾構造函數
構造函數可以私有化,這樣該類就不能實例化,可以用於工具類中全是靜態方法的情況,當其他類調用工具類中的方法時直接用類名調用,如果通過實例化對象訪問工具類中的方法就多次一舉,浪費內存空間,可以將工具類的構造函數私有化,更加嚴謹,防止其他人通過實例化對象訪問工具類中的方法。
(2)private一般情況下修飾成員,可以修飾類嗎?
特殊情況,內部類作爲外部類的成員,可以被私有化,這時內部類只能在外部類中被訪問,在其他類中是完全被隱藏的。
9.幫助文檔的製作     javadoc -d 目錄名  類名
10.
構造代碼塊
{
     System.out.println("cry");
}
構造代碼塊用於類的不同構造方法所構造對象的共同初始化值,並且構造代碼塊的優先級高於構造方法,而構造方法只能用於一個構造方法的初始化。
例子:有的孩子出生沒名字,有的孩子一出生就有名字了,他們的構造方法不同,但出生時都會哭  這時就可以用構造代碼塊初始化哭的行爲
構造代碼塊(是對對象初始化的)
{
    System.out.ptrintln("hello,nihao");
}
靜態代碼塊(是對類初始化的,沒有名字,優先於main方法,隨類的加載而執行,類加載完,他也執行完,且只執行一次,然後加載main方法)
static  {
    System.out.println("aaaaaa");
}

11.類什麼時候加載?
在main方法中,只有使用到其他類的成員時才加載其他類。如創建對象,用到了構造方法;或類調用其靜態成員。而下面情況並不會加載類:Person p=null; 
12.分析以下對象創建過程都做些什麼?(對象初始化過程)
Person p=new Person("張三",20);
(1)在main方法中執行到了這裏,發現了Person類並用到了person類中的構造方法,jvm會找到Person.class文件加載。
(2)加載Persion.class 時,如果person類中有靜態代碼塊,會先執行靜態代碼塊。
(3)new關鍵字會在堆內存中開闢空間,並分配內存地址。
(4)這時堆中的實體name,age就開始默認初始化。
(5)如果person類中屬性name或age有顯示初始化,這時就進行顯示初始化。
(6)再看person類中是否有構造代碼塊,如果有進行構造代碼塊初始化。
(7)這時,進行new對應的構造函數初始化。
(8)把堆中實體的內存地址賦值給棧內存中的p變量。
13.javac.exe 程序啓動編譯器,進行語法檢查,所以像下標越界的錯誤不會再編譯時出現,因爲這時對象還沒有創建。
     java.exe 程序啓動虛擬機,加載類,解釋執行。static成員隨類的加載而加載,所以執行java命令時 加載類,同時加載main方法。雖然main不是關鍵字,但可以作爲程序的入口而被虛擬機識別。main方法既然是方法就可以重載,但虛擬機識別的入口main方法必須是固定的格式,參數列表是String類型的數組。
14.主函數傳參:編譯後在命令行輸入:java 類名  參數1  參數2 ……

public class Test
{
public static void main(String []args)
{
System.out.println(args);
System.out.println(args.length);      
for(int x=0;x<args.length;x++)
{
System.out.println(args[x]);
}
}
}


 
15.java中的內存劃分爲5塊:棧、堆、方法區、本地方法區、寄存區。
棧:存放局部變量或引用
堆:存放實體對象
方法區:存放方法的代碼和靜態變量,分爲靜態區(存放靜態成員)和非靜態區(存放非靜態方法);
本地方法區:系統底層的內容
寄存器:cpu用的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章