- 相等則往下一位字元比較,反之則得出結果
- 有值的比沒值的大
A的編碼是0041
B的編碼是0042
alert(‘A’ > ‘AB’); // false,因為最高位(最左邊)字元相等,而AB比較長 alert(‘B’ > ‘AB’); // true,最高位字元B比A大
再來看 ‘8’,‘1’,‘0’
0的編碼為0030
1的編碼為0031
8的編碼為0038
alert(‘8’ > ‘10’); // true由於最高位’8’比’1’來的大,所以結果為true
alert(‘A’ > ‘AB’); // false,因為最高位(最左邊)字元相等,而AB比較長 alert(‘B’ > ‘AB’); // true,最高位字元B比A大
alert(‘8’ > ‘10’); // true由於最高位’8’比’1’來的大,所以結果為true
/*
* Automatic determination of the ClassLoader to be used to load
* resources on behalf of the client. N.B. The client is getLoader's
* caller's caller.
*/
private static ClassLoader getLoader() {
Class[] stack = getClassContext();
/* Magic number 2 identifies our caller's caller */
Class c = stack[2];
ClassLoader cl = (c == null) ? null : c.getClassLoader();
if (cl == null) {
// When the caller's loader is the boot class loader, cl is null
// here. In that case, ClassLoader.getSystemClassLoader() may
// return the same class loader that the application is
// using. We therefore use a wrapper ClassLoader to create a
// separate scope for bundles loaded on behalf of the Java
// runtime so that these bundles cannot be returned from the
// cache to the application (5048280).
cl = RBClassLoader.INSTANCE;
}
return cl;
}
/*
* 獨一無二的貓王(Elvis),這世上就只有一個貓王
* Singleton with public final field
*/
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { //忽略細節 }
public void leaveTheBuilding() { //忽略細節 }
}
當需要取得貓王實例時,簡單的存取 Elvis.INSTANCE 即可。不過 private constructor 依然有一個問題,用 reflection 機制的 AccessibleObject.setAccessible 可以破解 private 的限制,如果要防範此一漏洞,還是得在 constructor 內做些手腳。/*
* 獨一無二的貓王(Elvis),這世上就只有一個貓王
* Singleton with static factory
*/
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { //忽略細節 }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { //忽略細節 }
}
雖然有同上的問題(private constructor 部分),但是此作法相較起來更有彈性,如果你改變了想法,不想用 singleton 的方式實作此 Class,可以在不變動 API 的情況下修改 getInstance() 達成。// readResolve method to preserve singleton property
private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE;
}
如果有定義此方法,則它會自動在 deserialize 時被呼叫,並回傳我們指定的物件。// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
這種做法接近 public final field 而且public class ClassThisTest {
public static void main(String[] args) {
OuterClass outerInst1 =
new OuterClass("Outer class no.1");
OuterClass.InnerClass innerInst1 =
outerInst1.new InnerClass();
System.out.println(innerInst1.toString());
//Inner class
System.out.println(innerInst1.outerToString());
//Outer class no.1
OuterClass outerInst2 =
new OuterClass("Outer class no.2");
OuterClass.InnerClass innerInst2 =
outerInst2.new InnerClass();
System.out.println(innerInst2.outerToString());
//Outer class no.2
}
}
class OuterClass {
private String outerMsg;
public OuterClass(String msg) {
this.outerMsg = msg;
}
public String toString() {
return outerMsg;
}
public class InnerClass {
private final String innerMsg = "Inner class";
public String toString() {
return innerMsg;
}
public String outerToString() {
//Class.this
return OuterClass.this.toString();
}
}
}
簡單說就是 Inner Class 用來參照相依的 Outer Class 實體用的。