1美浦、自動遞增和遞減
{
int i=1;
int j=1;
System.out.println("i++="+(i++));
System.out.println("++j="+(++j));
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("i--="+(i--));
System.out.println("--j="+(--j));
}
觀察一下,這些計算的答案為多少:
i++=1
++j=2
i=2
j=2
i--=2
--j=1
前綴表達式项栏,先執(zhí)行計算再返回值浦辨,即返回的值為已經(jīng)計算過的值;
而后綴表達式先返回值沼沈,在進行計算流酬,返回的是計算前的值;
2列另、字符串操作符+和+=
{
String s="hello";
System.out.println(s+" "+1+2+3);
System.out.println(s+" "+(1+2+3));
s+=1+2+3;
System.out.println(s);
s+=123;
System.out.println(s);
}
字符串后跟+
或者+=
默認執(zhí)行字符串轉(zhuǎn)換的方式(隱式地調(diào)用了toString()
方法)
3康吵、邏輯運算符短路
先看一個例子:
static boolean test1(int val){
System.out.println("test1("+val+")");
System.out.println("result:"+(val<1));
return val<1;
}
static boolean test2(int val){
System.out.println("test2("+val+")");
System.out.println("result:"+(val<2));
return val<2;
}
static boolean test3(int val){
System.out.println("test3("+val+")");
System.out.println("result:"+(val<2));
return val<2;
}
public static void main(String args[])
{
boolean b=test1(0)&&test2(2)&&test3(3);
System.out.println(b);
}
以上運算的輸出為多少?
test1(0)
result:true
test2(2)
result:false
false
從結(jié)果可看到访递,test3()
沒有執(zhí)行晦嵌,這是因為&&
與操作符,一旦有一個為false
值拷姿,其后面的操作不會再進行執(zhí)行惭载;
而如果將表達式改為:
boolean b=test1(0)&test2(2)&test3(3);
輸出結(jié)果會變成:
test1(0)
result:true
test2(2)
result:false
test3(3)
result:false
false
4、What goto?
java中保留著goto
响巢,但是在語言中并沒有使用它描滔;java,可以通過break
和continue
關(guān)鍵字實現(xiàn)一些類似與跳轉(zhuǎn)的功能踪古;
比如:
public class tesk {
static boolean test1(int val){
System.out.println("test1("+val+")");
System.out.println("result:"+(val<1));
return val<1;
}
static boolean test2(int val){
System.out.println("test2("+val+")");
System.out.println("result:"+(val<2));
return val<2;
}
static boolean test3(int val){
System.out.println("test3("+val+")");
System.out.println("result:"+(val<2));
return val<2;
}
public static void main(String args[])
{
int i=0;
outer:
while (true){
System.out.println("outer while loop");
while (true){
i++;
System.out.println("i="+i);
if(i==1){
System.out.println("continue");
continue ;
}
if(i==3){
System.out.println("continue outer");
continue outer;
}
if(i==5){
System.out.println("break");
break ;
}
if(i==7){
System.out.println("break outer");
break outer;
}
}
}
}
}
----
outer while loop
i=1
continue
i=2
i=3
continue outer
outer while loop
i=4
i=5
break
outer while loop
i=6
i=7
break outer
從結(jié)果可看出:
continue
回會退到最內(nèi)層循環(huán)的開頭含长;
continue
帶標簽券腔,回會退到標簽所在的位置,并重新進入循環(huán)拘泞;
break
會中斷并跳出當前循環(huán)
break
帶標簽纷纫,會中斷,并跳到標簽所指的循環(huán)陪腌;
標簽慎用辱魁,因為會造成程序難以分析,不好進行調(diào)試诗鸭;
5染簇、初始化
初始化和清理是涉及到安全的兩個重要因素;
java引入了構(gòu)造器的概念進行類成員變量的初始化强岸;
其主要解決了兩個問題:
1锻弓、保證每個成員變量都被初始化;
2蝌箍、解決了命名問題弥咪,它與它的類名相同;
不接受任何參數(shù)的構(gòu)造器被稱為默認構(gòu)造器十绑,又被稱為無參構(gòu)造器聚至;
當類中未定義任何構(gòu)造器時,它默認的調(diào)用了無參構(gòu)造器本橙,并采用默認賦值為每個成員變量賦值扳躬;同時,一旦存在有參構(gòu)造器甚亭,則此默認無參構(gòu)造器不起作用贷币;
方法的重載:
類的方法允許進行重載,即永遠相同的方法名稱亏狰,但是默認參數(shù)不同役纹;
例如:
public class couse {
private int id;
public couse(){} //無參構(gòu)造方法
public couse(int id){ //有參構(gòu)造方法,構(gòu)造方法的重載
this.id=id;
}
public int getId() { //成員方法
return id;
}
public int getId(int index){ //成員方法的重載
return id+index;
}
}
區(qū)分重載的方法:采用參數(shù)類型進行區(qū)分
為什么不采用返回值作為區(qū)分呢暇唾?
看下面一個例子:
public int getId() { //成員方法
return id;
}
public void getId(){
return id;
}
如果我們調(diào)用方法:
getId()
怎末判定調(diào)用的是哪一個促脉,因為有時候,返回值是不需要用到的策州,不知道返回值的類型瘸味,所以會造成jvm的無法解析;
關(guān)于無參構(gòu)造方法的默認值够挂,參照http://www.reibang.com/p/20a644b8e8c8
this關(guān)鍵字
this
在構(gòu)造器中的使用旁仿,如果在構(gòu)造器中調(diào)用構(gòu)造器,例如:
public class couse {
private int id;
private int nums;
public couse(){
this(0,0);
// this.id=12; //調(diào)用兩次回報出錯誤
} //無參構(gòu)造方法
public couse(int id){ //有參構(gòu)造方法孽糖,構(gòu)造方法的重載
this(id,0);
}
public couse(int id, int nums) {
this.id = id; //this 指明id為哪個id
this.nums = nums;
}
}
6枯冈、清理:終結(jié)處理和垃圾回收
java的垃圾回收器毅贮,負責回收無用對象占據(jù)的內(nèi)存資源,但是尘奏,如果有一塊特殊的內(nèi)存(非new創(chuàng)建分配的)滩褥,垃圾回收期無法處理它;
因此罪既,java中定義了一個finalize()
方法,
內(nèi)存被清理的條件:
public class Book {
boolean checkout=false;
Book(boolean checkout){
this.checkout=checkout;
}
public void checkin(){
checkout=false;
}
@Override
protected void finalize() throws Throwable {
if(checkout){
System.out.println("error,has book not be checked");
}
//super.finalize();
}
public static void main(String args[]){
Book book=new Book(true);
book.checkin();;
new Book(true);
System.gc();//強制終結(jié)狀態(tài)
}
}
---
error,has book not be checked
7铡恕、垃圾回收器
常見的垃圾回收機制:
引用計數(shù)法
顧名思義琢感,將每個對象添加一個引用計數(shù)器,當對象的增加一個引用時探熔,其計數(shù)器加1驹针,當其引用離開作用域或者變?yōu)閚ull時,其計數(shù)器減少1诀艰,當計數(shù)器為0時其垄,該對象被清除臂外;
此種方法簡單但是效率低下橘霎,而且當存在循環(huán)引用時瓦盛,起計數(shù)器不會清零,但是此類對象需要被回收扮念;
自適應(yīng)的垃圾回收機制
主要機理為:對任何存活的對象,一定可以追溯到其靜態(tài)存儲區(qū)或者堆棧迁匠;因此從靜態(tài)存儲區(qū)或者堆棧開始進行遍歷延曙,找到所有存活的對象蚊惯,將其復(fù)制到另一個堆上,沒有被復(fù)制的全部都是垃圾赊舶,這些對象可以被自動回收了笼平;
但是,這種方法效率會降低舔痪,因為要保有兩個堆寓调,這樣內(nèi)存多出一倍,而且若垃圾較少的時候進行復(fù)制的話锄码,造成巨大浪費夺英,因此此種停止-復(fù)制
的方法,在垃圾較少的時候切換到了另一種工作方式滋捶;
標記-清掃
痛悯,標記清掃的方式速度很慢,但是當垃圾很少的時候重窟,起執(zhí)行速度就會很快载萌;
標記-清掃
采用類似的方法,從靜態(tài)存儲區(qū)和堆棧出發(fā),遇到存活的對象扭仁,就會給對象一個標記垮衷,這個過程不會進行垃圾回收動作;當全部對象標記完畢后乖坠,開始進行清理搀突,但是清理過后,其堆空間不是連續(xù)的熊泵;
8仰迁、成員初始化
public class couse {
private int id;
public couse(){
System.out.println(id);
id=7;
System.out.println(id);
}
public static void main(String args[]){
couse c=new couse();
}
}
0
7
看上述代碼,其輸出結(jié)果為:
說明編譯器會給每個成員變量一個初始值顽分,即使它已經(jīng)被顯示初始化了徐许;
靜態(tài)數(shù)據(jù)的初始化
無論創(chuàng)建多少對象,靜態(tài)數(shù)據(jù)始終都只占據(jù)一份存儲區(qū)域怯邪,