目錄
1、參數的值傳遞
2、垃圾回收機制
3、Java 中的 this 關鍵字
4、對類和成員的訪問控制
5、static 關鍵字
6、靜態初始化塊和普通的實例代碼塊
基本類型的參數,如 int 或 double,都是按值傳遞給方法的。這意味著對參數值的任何更改都只存在于該方法的范圍內。當方法返回時,參數就消失了,對它們的任何更改也都丟失了。這里有一個例子:// Java 中都是值傳遞
public class PassPrimitiveByValue {
public static void main(String[] args) {
int x = 3;
// invoke passMethod() with x as argument
passMethod(x);
// print x to see if its value has changed
System.out.println("After invoking passMethod, x = " + x);
}
// change parameter in passMethod()
public static void passMethod(int p) {
p = 10;
}
}
當你運行這個程序時,輸出是:
After invoking passMethod, x = 3
2、垃圾回收機制Java 運行時環境當確定對象不再被使用時,會刪除對象。這個過程稱為垃圾收集。
當不再有對該對象的引用時,該對象才有資格進入到垃圾收集過程。通過將變量設置為特殊值 null,可以顯式地刪除該對象的引用。一個程序可以對同一個對象有多個引用;在對象符合垃圾收集條件之前,必須刪除對對象的所有引用。
Java 運行時環境有一個垃圾收集器,它會定期釋放不再引用的對象所使用的內存。垃圾收集器在確定時間合適時候會自動執行其工作。
3、Java 中的 this 關鍵字在實例方法或構造函數中,this 是對當前對象的引用。可以使用 this 從實例方法或構造函數中引用當前對象的任何成員。
this 和字段一起使用
使用 this 關鍵字最常見原因是,方法或構造函數參數遮蔽了字段。例如,Point 類是這樣編寫的:
public class Point {
public int x = 0;
public int y = 0;
//constructor
public Point(int a, int b) {
x = a;
y = b;
}
}
但也可以寫成這樣:
public class Point {
public int x = 0;
public int y = 0;
//constructor
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
構造函數的每個參數都遮蔽了對象的一個字段——在構造函數內部,x是構造函數第一個參數。要引用 Point 字段 x,構造函數必須使用 this.x。
this 與構造函數一起使用
在構造函數內部,還可以使用 this 關鍵字調用同一類中的另一個構造函數。這種做法稱為顯式構造函數調用。
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
4、對類和成員的訪問控制訪問級別的修飾符可以決定其他類是否可以使用類中特定的字段或調用特定的方法。Java 有兩個級別的訪問控制:
? 類:如果一個類用修飾符 public 聲明,在這種情況下,該類對任何地方的所有類都是可見的。如果一個類沒有修飾符(默認的,也稱為 package-private),那么它只在它自己的包中可見。
? 成員:跟類聲明一樣,你可以使用 public 修飾符或不使用修飾符(package-private),這些修飾符與修飾類時一樣,都具有相同的含義。但是對于成員,還有兩個額外的訪問修飾符:private 和 protected。private 修飾符指定該成員只能在其自己的類中進行訪問。protected 修飾符指定該成員只能在其自己的包中進行訪問(與package-private一樣),此外,還可以被其類在另一個包中的子類進行訪問。
下表顯示了每個修飾符允許對成員的訪問權限:
Modifier | Class | Package | Subclass | World |
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
no modifier | Y | Y | N | N |
private | Y | N | N | N |
static 修飾變量? ??
如果希望定義對所有對象都通用的變量,可以使用 static 修飾符進行修飾。聲明中帶有 static 修飾符的字段稱為靜態字段或類變量。它們與類進行關聯,而不是與對象進行關聯。類的每個實例共享一個類變量,該變量位于內存中的一個固定位置。任何對象都可以改變類變量的值,但是也可以在不創建類對象的情況下操作類變量。
例如,你想要創建一些 Bicycle 對象,并為每個對象分配一個序列號,第一個對象從1開始。這個 ID 號對于每個對象都是唯一的,因此這是一個實例變量。與此同時,還需要有一個字段用來跟蹤已經創建了多少個 Bicycle 對象,以便知道將什么 ID 分配給下一個對象。這樣的字段與任何單獨的對象都無關,而是與整個類相關。因此,定義了一個類變量 numberOfBicycles,如下所示:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
// add an instance variable for the object ID
private int id;
// add a class variable for the number of Bicycle objects instantiated
private static int numberOfBicycles = 0;
...
}
類變量由類名本身引用,如:
Bicycle.numberOfBicycles // 推薦引用方式
// 雖然也可以通過類的實例進行引用,但并不鼓勵,因為這樣做并沒有明確表示它們是類變量。
myBike.numberOfBicycles // 不推薦引用方式
你可以在?Bicycle 構造函數中設置實例變量 id,并增加 numberOfBicycles 類變量的值:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence, int startSpeed, int startGear){
gear = startGear;
cadence = startCadence;
speed = startSpeed;
// increment number of Bicycles and assign ID number
id = ++numberOfBicycles;
}
// new method to return the ID instance variable
public int getID() {
return id;
}
...
}
static 修飾方法
Java 支持靜態方法和靜態變量。靜態方法,在其聲明中用關鍵字?static 修飾,應該用類名調用,而不需要創建類的實例,如:
// 雖然也可以通過類的實例進行調用,但并不鼓勵,因為這樣做并沒有明確表示它們是類方法。
ClassName.methodName(args)
類方法不能直接訪問類中的實例變量或實例方法——它們必須使用對象引用。而且,類方法不能使用 this 關鍵字,因為沒有 this 的實例可以引用。
static 定義常量
static?修飾符與 final 修飾符一起用于定義常量。final 修飾符表示該字段的值不能更改。例如,下面的變量聲明定義了一個名為 PI 的常量,其值是 PI 的近似值(圓的周長與直徑的比值):
static final double PI = 3.141592653589793;
以這種方式定義的常量不能再重新賦值,如果有程序這樣做,則會出現編譯時錯誤。按照慣例,常量值的名稱用大寫字母拼寫。如果名稱由一個以上的單詞組成,單詞之間用下劃線進行分隔。
6、靜態初始化塊和普通的實例代碼塊靜態初始化塊
你通常可以在聲明中為字段提供一個初始值:
public class BedAndBreakfast {
// initialize to 10
public static int capacity = 10;
// initialize to false
private boolean full = false;
}
當初始化值可用并且初始化可以放在一行上進行時,這種方法可以工作得很好。但是,這種初始化形式由于簡單而具有局限性。如果初始化時需要一些額外的邏輯(例如,錯誤處理或填充復雜數組的 for 循環),那么,上述簡單的賦值是不夠的。實例變量可以在構造函數中初始化,在構造函數中可以使用錯誤處理或其他邏輯。為了給類變量提供相同的功能,Java 提供了靜態初始化塊。// 一項技術出現的原因,總是因為解決了對應的問題
靜態初始化塊是用大括號 {} 括起來的普通代碼塊,前面有static關鍵字。這里有一個例子:
static {
// whatever code is needed for initialization goes here
}
一個類可以有任意數量的靜態初始化塊,它們可以出現在類中的任何地方。運行時系統會保證靜態初始化塊會按照它們在源代碼中出現的順序被調用。// 一個靜態初始化塊只會被調用一次
有一個替代靜態塊的方法——你可以寫一個私有靜態方法:
class Whatever {
public static varType myVar = initializeClassVariable();
private static varType initializeClassVariable() {
// initialization code goes here
}
}
使用私有靜態方法的優點是,如果需要重新初始化類變量,還可以重用它們。
普通的實例代碼塊
通常,會在構造函數中放入初始化實例變量的代碼。使用構造函數初始化實例變量有兩種選擇:初始化塊和 final 方法。實例變量的初始化塊看起來就像靜態初始化塊,但是沒有static關鍵字:
{
// whatever code is needed for initialization goes here
}
Java 編譯器會將初始化代碼塊復制到每一個構造函數中。因此,這種方法可用于在多個構造函數之間共享代碼塊。????????
final 方法不能在子類中重寫。下面是一個使用 final 方法初始化實例變量的例子:
class Whatever {
private varType myVar = initializeInstanceVariable();
protected final varType initializeInstanceVariable() {
// initialization code goes here
}
}
如果子類可能希望能重用初始化方法,上述代碼會尤其有用。該方法是 final 的,因為在實例初始化期間調用非 final 方法會導致問題。
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文名稱:JavaClasses和Objects中的一些基礎知識點-創新互聯
網頁鏈接:http://m.newbst.com/article8/dcedip.html
成都網站建設公司_創新互聯,為您提供網站導航、軟件開發、標簽優化、服務器托管、關鍵詞優化、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯