十大遺珠之憾
10 位操作
byte有8位圆恤,short有16位脚曾,int有32位
按位非運(yùn)算符:~
0變1,1變0
int x = 10;//位組合00001010
x = ~x;//位組合11110101按位與運(yùn)算符:&
兩個(gè)位都為1园细,結(jié)果才為1
int x = 10;//位組合00001010
int y = 6;//位組合00000110
int a = x & y;//位組合00000010按位或運(yùn)算符:|
兩個(gè)位都為0各吨,結(jié)果才為0
int x = 10;//位組合00001010
int y = 6;//位組合00000110
int a = x | y;//位組合00001110按位異或運(yùn)算符:^
兩個(gè)位相同為0叛甫,不相同為1
int x = 10;//位組合00001010
int y = 6;//位組合00000110
int a = x ^ y;//位組合00001100負(fù)數(shù)的二進(jìn)制:
負(fù)數(shù)的二進(jìn)制位組合等于正數(shù)的二進(jìn)制位組合非運(yùn)算后加1
int x = 11;//位組合00001011
int y = -11;//位組合11110101左移運(yùn)算符:
各二進(jìn)位全部左移若干位肛真,高位丟棄谐丢,低位補(bǔ)0,正負(fù)號(hào)可能改變
int x = -11;//位組合11110101
int y = x << 2;//位組合11010100算術(shù)右移運(yùn)算符:
各二進(jìn)位全部右移若干位蚓让,對(duì)無(wú)符號(hào)數(shù)乾忱,高位補(bǔ)0,有符號(hào)數(shù)補(bǔ)符號(hào)位历极,正負(fù)號(hào)不變
int x = -11;//位組合11110101
int y = x >> 2;//位組合11111101邏輯右移運(yùn)算符(無(wú)符號(hào)右移運(yùn)算符):
各二進(jìn)位全部右移若干位窄瘟,對(duì)無(wú)符號(hào)數(shù),高位補(bǔ)0趟卸,有符號(hào)數(shù)蹄葱,高位也補(bǔ)0
int x = -11;//位組合11110101
int y = x >>> 2;//位組合00111101
9 不變性
- String和包裝類(lèi)有具有不變性,對(duì)象創(chuàng)建后就無(wú)法改變?cè)搶?duì)象的值
8 斷言
- 斷言用來(lái)幫助你在開(kāi)發(fā)過(guò)程中除錯(cuò)锄列,使用方式和println()差不多
assert (height > 0);
// if true, program continues normally
// if false, throw an AssertionError
也可以利用斷言加上一點(diǎn)信息:
assert (height > 0) : “height = “ + height + “ weight = “ + weight;
帶有斷言的編譯(沒(méi)有什么不一樣):
javac TestDriveGame.java
帶有斷言的執(zhí)行:
java -ea TestDriveGame
7 塊區(qū)域
- 局部變量的生命周期范圍只限于聲明它的方法還呆在棧上的期間內(nèi)新蟆,但有一種變量比局部變量生命周期更短,那就是在塊區(qū)域{}內(nèi)的塊變量右蕊,例如for琼稻,while,if里的變量饶囚,使用塊變量比使用局部變量更方便除錯(cuò)帕翻,且擴(kuò)充性更好
6 鏈接的調(diào)用
StringBuffer sb = new StringBuffer(“spring”);
sb = sb.delete(3,6).insert(2,”umme”).deleteCharAt(1);
System.out.println(“sb = “ + sb);
// result is sb = summer
等同于:
sb = sb.delete(3,6);
sb = sb.insert(2,”umme”);
sb = sb.deleteCharAt(1);
5 Anonymous和Static Nested Classes
嵌套類(lèi)(nested classes)和內(nèi)部類(lèi)(inner classes)的區(qū)別:任何一個(gè)被定義在另一個(gè)類(lèi)范圍內(nèi)的類(lèi)都稱為嵌套類(lèi),不管它是匿名萝风、靜態(tài)嘀掸、正常或其他類(lèi)型规惰。但非靜態(tài)的嵌套類(lèi)我們一般稱之為內(nèi)部類(lèi)睬塌。所以基本上所有內(nèi)部類(lèi)都是嵌套類(lèi),但不是所有嵌套類(lèi)都是內(nèi)部類(lèi)
靜態(tài)嵌套類(lèi)
靜態(tài)嵌套很像一般非嵌套,他們沒(méi)有與外層對(duì)象產(chǎn)生任何特殊關(guān)聯(lián)揩晴。但因?yàn)檫€被認(rèn)為是外層的一個(gè)成員勋陪,所以能夠存取任何外層的私用成員,當(dāng)然只限于是靜態(tài)的硫兰,這是因?yàn)殪o態(tài)沒(méi)有實(shí)例
public class FooOuter {
static class BarInner {
void sayIt() {
System.out.println(“method of a static inner class”);
}
}
}
class Test {
public static void main(String[] args) {
FooOuter.BarInner foo = new FooOuter.BarInner();
foo.sayIt();
}
}
- 匿名內(nèi)部類(lèi)
import java.awt.event.*;
import javax.swing.*;
public class TestAnon {
public static void main(String[] args) {
JFrame frame = new JFrame();
JButton button = new JButton(“click”);
frame.getContentPane().add(button);
// button.addActionListener(quitListener);
//此處的ActionListener其實(shí)是一個(gè)接口诅愚,而我們不能創(chuàng)建接口的實(shí)例!但這種情況的語(yǔ)法就是這樣
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.exit(0);
}
})
}
}
4 存取權(quán)限和存取修飾符(誰(shuí)可以看到什么)
- public 代表任何代碼都可以存取劫映。一般用來(lái)修飾類(lèi)违孝、常量(static final variables)、對(duì)外方法(getter泳赋,setter)雌桑、大部分構(gòu)造函數(shù)
- private 代表只有同一類(lèi)中的代碼才能存取,它是對(duì)類(lèi)而不是對(duì)對(duì)象設(shè)限祖今。一般用來(lái)修飾大部分實(shí)例變量筹燕,以及不想被外部調(diào)用的方法
- default 只有同一包中的默認(rèn)事物才能存取。如果被default修飾(就是不修飾)就代表只有同一個(gè)包內(nèi)的代碼才能存取被修飾的事物衅鹿,不能存取意味著你連用都不能用到相關(guān)的代碼撒踪。如果一個(gè)類(lèi)被default修飾,那么類(lèi)中的方法即使是被public修飾大渤,它也不能被包外的代碼使用
- protected 基本等同于default制妄,只有一個(gè)地方不一樣,被default修飾的事物允許包外的子類(lèi)通過(guò)繼承來(lái)獲得它的功能泵三。例如包外有一個(gè)子類(lèi)有對(duì)父類(lèi)的引用耕捞,父類(lèi)里面有一個(gè)被protected修飾的方法,那子類(lèi)是不能直接用父類(lèi)的引用調(diào)用這個(gè)方法的烫幕,唯一的方法就是繼承父類(lèi)從而得到方法
3 String和StringBuilder的方法
常用的類(lèi)是String和StringBuilder(因?yàn)镾tring有不變性俺抽,使用StringBuilder操作String會(huì)更有效率,更省空間)
String和StringBuilder都有的方法:
char charAt(int index);//獲取指定位置的字符
int length();
String substring(int start,int end);//取出指定片段的字符串
String toString();連接字符串方法:
String concat(String str);//String的方法
String append(String str);//Stringbuilder的方法String的方法:
String replace(char old,char new);//替換所有old字符為new字符
char[] toCharArray();
String toLowerCase();//全部小寫(xiě)
String toUpperCase();
String trim();//去除首尾空格
static String valueOf(char[] data);//轉(zhuǎn)化為字符串
static String valueOf(int i);StringBuilder的方法:
StringBuilder delete(int start,int end);
StringBuilder insert(int offset,String str);
StringBuilder replace(int start, int end, String str);
StringBuilder reverse();
void setCharAt (int index,char ch);
2 多維數(shù)組
在Java中如果你創(chuàng)建了一個(gè)4*2的數(shù)組较曼,這個(gè)數(shù)組實(shí)際上由5個(gè)數(shù)組組成磷斧,例如
int[][] a =new int[][]{{1,2},{3,4},{5,6},{7,8}};操作多維數(shù)組
存取第三個(gè)數(shù)組的第二個(gè)元素:int x = a[2][1];
對(duì)某個(gè)子數(shù)組創(chuàng)建引用:int[] copy = a[1];
初始化2*3數(shù)組:int[][] x = {{2,3,4},{5,6,7}};
創(chuàng)建非常規(guī)數(shù)組:int[][]y = new int[2][];
y[0] = new int[3];
y[1] = new int[5];
1 枚舉(又稱為枚舉類(lèi)型或Enum)
- 枚舉是一種特殊的類(lèi),Enum的構(gòu)造函數(shù)會(huì)對(duì)每個(gè)被聲明的Enum值執(zhí)行一次捷犹,每個(gè)Enum都有內(nèi)置的values()方法弛饭,通常會(huì)用在for循環(huán)里
public class HfjEnum {
enum Names {
JERRY(“l(fā)ead guitar”) {
public String sings() {
return“plaintively”;
}
},
BOBBY(“rhythm guitar”) {
public String sings() {
return“hoarsely”;
}
},
PHIL(“bass”);
private String instrument;
Names(String instrument) {
this.instrument = instrument;
}
public String getInstrument() {
return this.instrument;
}
public String sings() {
return“occasionally”;
}
}
public static void main(String[] args) {
for (Names n : Names.values()) {
System.out.print(n);
System.out.print(“, instrument:“+n.getInstrument());
System.out.println(“, sings:“+n.sings());
}
}
}