java概述
1跳仿、java的三大特點(diǎn)
面向?qū)ο螅?/strong>
主要體現(xiàn)在兩個基本概念:類、對象
以及三大特性:封裝捐晶、繼承菲语、多態(tài)
健壯性:
吸收C/C++的優(yōu)點(diǎn),去掉了影響程序健壯性的部分(比如指針租悄、內(nèi)存申請以及釋放等等)
跨平臺性:
依賴于java虛擬機(jī)(JVM)谨究,可以在任何操作系統(tǒng)上運(yùn)行java程序
2、java的兩種核心機(jī)制
java虛擬機(jī)(即jvm)
對于不同的操作系統(tǒng)泣棋,有不同的虛擬機(jī)胶哲,只有提供了對應(yīng)操作系統(tǒng)的虛擬機(jī),才可以在此基礎(chǔ)上運(yùn)行java程序潭辈。
jvm有效的屏蔽了因不同操作系統(tǒng)所造成的底層平臺的差別鸯屿,使得編譯后的java程序可以在任意平臺上運(yùn)行。
垃圾收集機(jī)制:
在 C 語言中把敢,由于它是一門底層的編程語言寄摆,沒有自動的垃圾回收機(jī)制,需要開發(fā)者手動進(jìn)行內(nèi)存管理修赞。這也使得 C 語言程序更加高效婶恼,但同時也更容易出現(xiàn)內(nèi)存泄漏桑阶、使用已經(jīng)被釋放的內(nèi)存等問題。
java取消了開發(fā)者回收無用空間內(nèi)存的責(zé)任:它提供一種系統(tǒng)級線程跟蹤存儲空間的分配情況勾邦。并在JVM空閑時蚣录,檢查并釋放那些可被釋放的存儲空間。
垃圾回收在Java程序運(yùn)行過程中自動進(jìn)行眷篇,程序員無法精確控制和干預(yù)萎河。
【注:即便是這樣,某些java程序依然存在著內(nèi)存泄漏和內(nèi)存溢出的問題蕉饼∨氨】
3、java環(huán)境搭建
明確jdk昧港、jre擎椰、jvm之間的關(guān)系
java開發(fā)工具包(jdk):提供給開發(fā)人員使用的java開發(fā)工具,該開發(fā)工具自帶jre部分慨飘,同時也包含了編譯工具(javac.exe)确憨、打包工具(jar.exe)等其它工具;
java運(yùn)行環(huán)境(jre):包含了jvm和java程序運(yùn)行所需要的核心庫等等瓤的,如果只是想運(yùn)行java程序休弃,只需要安裝jre即可;
java虛擬機(jī)(jvm)
以下是它們之間的包含關(guān)系:
4圈膏、java語言中的注釋
單行注釋:
System.out.println("Hello World塔猾!") ; // 單行注釋
多行注釋:
System.out.println("Hello World!") ;
/*
多行注釋
*/
文檔注釋:
/**
@author 指定java程序作者
@version 指定java程序版本
*/
該注釋內(nèi)容可以被JDK提供的工具javadoc所解析稽坤,生成一套以網(wǎng)頁文件形式體現(xiàn)的該程序的說明文檔丈甸。
變量
1、標(biāo)識符與變量
標(biāo)識符:
Java 對各種變量尿褪、方法和類等要素命名時使用的字符序列稱為標(biāo)識符(凡是需要自己起名字的地方都叫標(biāo)識符)
語法規(guī)則:
- 由26個英文字母大小寫睦擂,0-9 ,_或$ 組成
- 數(shù)字不可以開頭杖玲。
- 不可以使用關(guān)鍵字和保留字顿仇,但能包含關(guān)鍵字和保留字。
- Java中嚴(yán)格區(qū)分大小寫摆马,長度無限制臼闻。
- 標(biāo)識符不能包含空格辞做。
變量的聲明與賦值:
int a; // 聲明變量蛉幸,只有聲明后才能使用芽突;
a = 10; //給變量賦值迅栅;
int b = 20; // 聲明、賦值同時進(jìn)行示姿;
成員變量與局部變量:
在方法體外商源,類體內(nèi)聲明的變量稱為成員變量萨驶。
在方法體內(nèi)部聲明的變量稱為局部變量。
2缤谎、基本數(shù)據(jù)類型
整型:byte抒倚、short褐着、int坷澡、long
java中整型常量默認(rèn)為int型,如需聲明long型常量含蓉,應(yīng)該在后面加上‘l’或‘L’频敛;
java程序中變量通常聲明為int型,除非不足以表示較大的數(shù)馅扣,才使用long斟赚。
浮點(diǎn)型:float、double
java中的浮點(diǎn)型默認(rèn)為double型差油,其精度為float的兩倍拗军,如需要聲明float類型,需要在后面加上‘f’或‘F’蓄喇。
字符型:char
char型用來表示通常意義上的字符发侵,占用2個字節(jié);
java中的所有字符都是用Unicode編碼妆偏,因此char類型是可以進(jìn)行運(yùn)算的:
char c1 = ' a ';
char c2 = ' 中 ';
char c3 = ' 9 ';
System.out.println(10 + c2); // 20023
此外刃鳄,char類型還可用于轉(zhuǎn)義字符:
char c = ' \n ' ; // ' \n ' 表示換行符
其它常見的轉(zhuǎn)義字符如下:
Unicode編碼與UTF-8:
Unicode編碼能夠?qū)⑹澜缟系乃蟹柖技{入其中,并且對每一個符號都給予一個獨(dú)一無二的編碼钱骂,使用Unicode編碼不會造成亂碼問題叔锐;
但是Unicode編碼只是規(guī)定了一個符號的二進(jìn)制編碼,沒有規(guī)定這個符號該如何進(jìn)行存儲见秽。比如ASCII(用一個字節(jié)進(jìn)行存儲的編碼方式)與Unicode無法進(jìn)行區(qū)分愉烙,因?yàn)橛?jì)算機(jī)不知道三個字節(jié)究竟是表示一個字符還是三個字符;再者解取,英文字母一般情況下僅用一個字節(jié)表示都足夠了步责,如果強(qiáng)行規(guī)定用Unicode進(jìn)行編碼,每個字符都會占用3-4個字節(jié)肮蛹,那么剩下的字節(jié)都是0勺择,這對存儲空間來說是巨大的浪費(fèi);
為了解決這個問題伦忠,UTF-8是互聯(lián)網(wǎng)上最廣泛使用的一種Unicode的實(shí)現(xiàn)方式省核,它是一種變長的編碼方式,可以使用1-6個字節(jié)表示一個符號昆码,并且通過其獨(dú)特的編碼規(guī)則气忠,根據(jù)不同的符號而變化字節(jié)的長度邻储。
布爾型:boolean
boolean類型只有兩個值:true或者false,沒有null這個值旧噪;
【注:不可以使用0或非 0 的整數(shù)替代false和true吨娜,這點(diǎn)和C語言不同】
【但是Java虛擬機(jī)中沒有任何供boolean值專用的字節(jié)碼指令,Java語言表達(dá)所操作的boolean值淘钟,在編譯之后都使用java虛擬機(jī)中的int數(shù)據(jù)類型來代替:true用1表示宦赠,false用0表示∶啄福】
3勾扭、基本數(shù)據(jù)類型轉(zhuǎn)換
自動類型轉(zhuǎn)換:容量小的類型會自動轉(zhuǎn)換為容量大的類型;
強(qiáng)制類型轉(zhuǎn)換:將容量大的數(shù)據(jù)類型轉(zhuǎn)換為容量小的數(shù)據(jù)類型铁瞒。使用時要加上強(qiáng)制轉(zhuǎn)換符:()妙色,但可能造成精度降低或溢出,格外要注意;
int number1 = 10;
short num = (short)number1;
System.out.println("num = " + num); // num = 10
- byte慧耍、short身辨、char之間不會相互計(jì)算,他們在進(jìn)行計(jì)算時會統(tǒng)一轉(zhuǎn)換為int型芍碧;
- boolean類型不參與其它數(shù)據(jù)類型之間的運(yùn)算煌珊。
4、引用數(shù)據(jù)類型
5师枣、字符串
String類不是基本數(shù)據(jù)類型怪瓶,而是屬于引用數(shù)據(jù)類型;
一個字符串可以串接另一個字符串践美,也可以直接串接其他類型的數(shù)據(jù)洗贰。
int no = 10;
String str = "abcdef";
String str1 = str + "xyz" + no; // string1 = "abcdefxyz10"
str1 = str1 + "123"; // string1 = "abcdefxyz10123"
char c = 'A';
double pi = 3.1416;
str1 = str1 + pi; // string1 = "abcdefxyz101233.1416"
boolean b = false;
str1 = str1 + b; // string1 = "abcdefxyz101233.1416false"
str1 = str1 + c; // string1 = "abcdefxyz101233.1416falseA"
運(yùn)算符
1、二進(jìn)制
二進(jìn)制整數(shù)的三種形式:
原碼:直接將一個數(shù)值換成二進(jìn)制數(shù)陨倡。最高位是符號位敛滋;
負(fù)數(shù)的反碼:是對原碼按位取反,只是最高位(符號位)確定為1兴革;
負(fù)數(shù)的補(bǔ)碼:其反碼加1绎晃;
計(jì)算機(jī)底層是以二進(jìn)制補(bǔ)碼的形式保存所有的整數(shù),且正數(shù)的原碼杂曲、反碼庶艾、補(bǔ)碼都相同,通過帶入符號位進(jìn)行計(jì)算擎勘,計(jì)算機(jī)只有加法而沒有減法:
2咱揍、算數(shù)運(yùn)算符
注意事項(xiàng):
如果對負(fù)數(shù)取模,可以把模數(shù)負(fù)號忽略不記棚饵,如:5%-2=1煤裙。 但被模數(shù)是負(fù)數(shù)則不可忽略掩完。此外,取模運(yùn)算的結(jié)果不一定總是整數(shù)硼砰。
對于除號“/”且蓬,它的整數(shù)除和小數(shù)除是有區(qū)別的:整數(shù)之間做除法時,只保留整數(shù)部分而舍棄小數(shù)部分题翰。
int x = 3510;
x = x / 1000 * 1000; // x = 3000;
System.out.println(x);
System.out.println("5 + 5 =" + 5 + 5);
a++與++a的區(qū)別主要在于:前者的自加運(yùn)算發(fā)生在使用a值之后恶阴,后者的自加運(yùn)算發(fā)生在使用a值之前;
int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.print("i="+i); // i=10
System.out.println("i1="+i1); // i1=11
i = ++i1;
System.out.print("i="+i); // i=12
System.out.println("i1="+i1); // i1=12
i = i2--;
System.out.print("i="+i); // i=20
System.out.println("i2="+i2); // i2=19
i = --i2;
System.out.print("i="+i); // i=18
System.out.println("i2="+i2); // i2=18
3遍愿、擴(kuò)展賦值運(yùn)算符
+=存淫,-=,*=沼填,/=,%= 這些符號自帶強(qiáng)轉(zhuǎn)的功能括授;
short s = 3;
s = (short)(s+2);
System.out.println(s); // 5
int i = 1;
i *= 0.1; // 等價于 (int)i = i * 0.1;
System.out.println(i); // 0
i++;
System.out.println(i); // 1
int m = 2;
int n = 3;
n *= m++; // 等價于(int) n = n * m++;
System.out.println("m=" + m); // m = 3
System.out.println("n=" + n); // n = 6
int j = 10;
j += (j++) + (++j); // 等價于 (int)j = j + (j++) + (++j);
System.out.println(j); // 32
4坞笙、比較運(yùn)算符
比較運(yùn)算符的結(jié)果都是boolean類型,要么是true荚虚,要么是false
5薛夜、邏輯運(yùn)算符
短路與&&和短路或||
&&:如果左邊為真,那么右邊參與運(yùn)算版述;如果左邊為假梯澜,那么右邊不參與運(yùn)算;
||:如果左邊為假渴析,那么右邊參與運(yùn)算晚伙;如果左邊為真,那么右邊不參與運(yùn)算俭茧;
int x = 1;
int y = 1;
if(x++==1 || ++y==1){ // 左邊條件為真咆疗,右邊不參與運(yùn)算;
x =7;
}
System.out.println("x="+x+",y="+y); //x=7 ;y=1
boolean x=true;
boolean y=false;
short z=42;
if((z++==42)&&(y=true))z++; // 左邊為真母债,右邊參與運(yùn)算
if((x=false) || (++z==45)) z++; // 左邊為假午磁,右邊參與運(yùn)算
System.out.println("z="+z); // z = 46
6、三元運(yùn)算符
利用三元運(yùn)算符獲取三個數(shù)之中最大數(shù):
int x = 8;
int y = 13;
int z = 5;
int temp = (x>y)?x:y;
int res = (temp>z)?temp:z;
System.out.println("res="+res);