Java標(biāo)識符
Java所有的組成部分都需要名字界阁。類名挠阁、變量名以及方法名都被稱為標(biāo)識符饱普。
規(guī)范:
所有的標(biāo)識符都應(yīng)該以字母(A-Z或者a-z),美元符($)、或者下劃線(_)開始
首字符之后可以是字母(A-Z或者a-z),美元符($)旗们、下劃線(_)或數(shù)字的任何字符組合
關(guān)鍵字不能用作標(biāo)識符
標(biāo)識符是大小寫敏感的
類名最好要大寫,用來區(qū)分他是一個類
java命名規(guī)范
(1)類名接口名:所有首字母大寫XxxYyyZzz
(2)變量名构灸,函數(shù)名:xxYyZz
(3)包名:xxyyzz
(4)常量名? XXX_YYY_ZZZ
格式問題
Java關(guān)鍵字
這些保留字不能用于常量上渴、變量、和任何標(biāo)識符的名稱喜颁。(不用記稠氮,以后會接觸)
Java注釋:一定要寫
(被注釋內(nèi)容不會被編譯,僅僅起到提示的作用半开,便于后期review代碼)
1.// 單行注釋
2./*
多行注釋
*/
3./**多行注釋隔披,可以生成文檔,又叫文檔注釋 ?命令行輸入javadoc? xxx.java
*/
1.單行注釋可以在單行注釋里面寂拆。
2.多行注釋不能嵌套在多行注釋里面奢米。
常量
常量表示不能被改變的數(shù)值
變量
變量指的是內(nèi)存中的一塊存儲區(qū)域抓韩,該區(qū)域有自己的名稱(變量名)和類型(數(shù)據(jù)類型),該區(qū)域的數(shù)據(jù)可以在同一類型范圍內(nèi)不斷變化鬓长,變量的作用范圍只在該“{}”中有效
int a谒拴; {? a=6; }? ? ? //? a等于6 ? ? ? ?{? int a =6;}? ? ? //定義在{}內(nèi)的變量,{}外不可以訪問
所以說如果你想要在{}之后訪問大括號里進行變化的變量涉波,此變量必須在{}外聲明
定義變量的格式
1.數(shù)據(jù)類型? 變量名 = 初始化值(聲明并初始化)
2.先聲明彪薛,再初始化
注意:(1)變量的定義格式是固定的,變量就如同數(shù)學(xué)中的未知數(shù)
? ? ? ? ? ? (2)變量被使用必須有初始值怠蹂,它其實就是內(nèi)存中的一小塊區(qū)域善延,用變量名訪問
? ? ? ? ? ? (3)變量只能被聲明一次
二進制(了解) ? 025表示八進制 ?0x256表示16進制
java二進制采用補碼形式表示,正負(fù)數(shù)區(qū)分的標(biāo)志:符號位(0正城侧,1負(fù))
正數(shù)補碼是其本身易遣,負(fù)數(shù)補碼取反+1
所以計算機二進制與十進制轉(zhuǎn)換,要先把二進制轉(zhuǎn)換為原碼作為過渡再進行轉(zhuǎn)換嫌佑。
1.十進制轉(zhuǎn)換為二進制:除2取余豆茫,除盡為止,余數(shù)從上向下看為二進制源碼結(jié)果屋摇,由于是正數(shù)所以原碼和補碼相同
2.二進制轉(zhuǎn)換為十進制:累加求和
3.負(fù)十進制轉(zhuǎn)換為負(fù)數(shù)二進制:取絕對值揩魂,轉(zhuǎn)換為二進制,取反加1
4.負(fù)二進制:取反加1炮温,轉(zhuǎn)換為十進制火脉,乘-1
拓展:為什么byte表示的是8個字節(jié),范圍卻是-128到127呢柒啤?
-128到127.共256個數(shù)倦挂。剛好可以用一個字節(jié)(8位)表示出來(2^8=256);
01111111表示的是127 担巩,按道理128表示的是10000000方援,可是因為第一位是一個符號位,所以byte正數(shù)最大值就為127涛癌,當(dāng)?shù)谝晃坏扔?的時候就是負(fù)數(shù)犯戏,把10000000看作是一個負(fù)數(shù)的補碼,轉(zhuǎn)換為十進制就是把10000000取反加1為10000000十進制就是128拳话,再乘-1為-128
127后面是-128先匪,最大的正數(shù)之后是最小的負(fù)數(shù)。這就跟鐘表一樣假颇,12點鐘后面是1點中鐘一樣胚鸯。
byte b=(byte)128,? ? 把128賦值給b,計算機語言 是通過二進制補碼表示的笨鸡,但因為正數(shù)原碼補碼相同姜钳,所以b的值變成了10000000坦冠,這時你要輸出b,計算機發(fā)現(xiàn)第一位的符號位是1哥桥,則把它看成是負(fù)數(shù)的補碼辙浑,輸出時再轉(zhuǎn)換為十進制則變成負(fù)128(賦值時,計算機接收的是二進制的補碼拟糕,輸出的時候把補碼轉(zhuǎn)換為原碼在轉(zhuǎn)換為十進制然后再輸出)
基本數(shù)據(jù)類型:四型八種(可以想象是一種容器判呕,承裝事物)
整型 (整數(shù)):byte(1個字節(jié)8位? -128-127)、short(2個字節(jié))送滞、int(4個字節(jié))侠草、long(8個字節(jié))
浮點型(小數(shù)):float(4個字節(jié),2的-149次方—2的127次方)犁嗅、double(8個字節(jié)边涕,非常大)
布爾型(表示真假):boolean(1字節(jié))
字符型:char(2字節(jié))用單引號括起來,只能是兩個字母褂微,一個漢字等于兩個字符(0-65535)
ascii掌握? ? a-z(97-122)功蜓,A-Z(65-90),1-9(48-57)宠蚂,每個ascii都對應(yīng)一個字符
Java中默認(rèn)的整數(shù)類型是int式撼,如果要定義為long ,則要在數(shù)值后加上L或者l
默認(rèn)的浮點型是雙精度浮點求厕,如果要定義float著隆,則要在數(shù)值后面加上f或者F
一個字節(jié)等于8位,1個字節(jié)等于256個數(shù)甘改。2^8
一個英文字母或者阿拉伯?dāng)?shù)字占一個字節(jié)
一個漢字占2個字節(jié)
可為數(shù)字加下劃線旅东,讓人更易閱讀,編譯器自動去除
轉(zhuǎn)義字符:具有特殊含義的字符
System.out.prinltn(‘\’’);
\’算是一個整體標(biāo)識一個單引號
\v豎向跳格? ? ? ? ? \b退格? ? ? ?
? \r回車(表示的是回到本行行首)? ?
System.out.println('h');
System.out.println('\r');
System.out.println('a');? //最后輸出的是 a因為\r回到了行首十艾,a覆蓋了h
? \\反斜線符"\"? ? ? ? ? \n新行
\t跳向下一個tab位置(橫向跳到下一制表位置)? 縮進的時候都要寫
數(shù)據(jù)類型轉(zhuǎn)換
1.自動類型轉(zhuǎn)換
小類型可自動轉(zhuǎn)換為大類型
byte a=12;? int b=a? byte自動轉(zhuǎn)換為int
特例:char和int型可以互相自動轉(zhuǎn)換腾节,例如char c='1' ? ?c不僅等于‘1’還等于49(因為在計算機內(nèi)部是通過二進制進行交互的忘嫉,char型在計算機中先轉(zhuǎn)為int再轉(zhuǎn)為二進制)
2.強制類型轉(zhuǎn)換
(比如把裝滿水的大杯子往小杯子里倒水,多余的會溢出案腺,而小向大倒沒有問題庆冕。)
大類型轉(zhuǎn)換為小類型,可能損失精度
int a=3劈榨;
byte b=(byte)a访递;
short s = 3; s = s+2; s+=2,有什么區(qū)別,為什么同辣?
s=s+2不正確拷姿,因為運算的時候轉(zhuǎn)為int型惭载,不能把int型賦給short型,
s+=2會自動強轉(zhuǎn)為short進行運算
字符串類型(引用類型)
String str = ""; // 這個跟"abc"响巢、"中國"描滔,本質(zhì)上這都一樣,只是空串踪古,長度為0罷了
""是空字符串含长,但是也是字符串,沒有什么東西伏穆。? //字符串初始化用“”拘泞,不用null
而null是空的意思,什么都沒有枕扫,沒有地址田弥。
字符串與基本數(shù)據(jù)類型的轉(zhuǎn)換
String s=“”+123;? ? ? ? //基本數(shù)據(jù)類型轉(zhuǎn)換為字符串铡原,空串加基本數(shù)據(jù)類型(+可用于字符串連接)
Integer.parseInt(數(shù)字字符串)偷厦;? ? ? ? ? ? ? //字符串轉(zhuǎn)換為數(shù)字
Double.parseDouble(數(shù)字字符串);
s.charAt(index)//字符串轉(zhuǎn)換為字符
java代碼是順序執(zhí)行的
運算符(相等是==? 燕刻,賦值是= 千萬不要寫錯只泼!)
算術(shù)運算符:+ - * /? % ++ -- ? ? ?
(1) int a=5; int b=2卵洗; int c=a/b请唱;? ? int表示整數(shù),小數(shù)部分被舍棄过蹂,答案為2
(2) int a=3;int b=4;double c=a/b;? ? ? a/b運算之后是int型十绑,舍棄小數(shù)部分為0,自動轉(zhuǎn)換為double增加精度變成0.0
(3) int i=3酷勺; int a=i/2 + i/4? =1+0? ? 每一次i的運算返回值都是int型
(4) double a=3;int b=4;double c=a/b? 兩數(shù)想運算本橙,返回的結(jié)果是兩數(shù)據(jù)類型中較大的(精度)
整型運算自動轉(zhuǎn)換為int進行運算,浮點型運算自動轉(zhuǎn)換為double進行運算脆诉,因此要得到特定其它類型甚亭,需要進行強制轉(zhuǎn)換
注:不知道有沒有有這樣的疑問:
? ? ? ? 為什么byte a=1+2; 是合法的而? ? byte a=1击胜; byte b=2亏狰;byte c=a1+a2;就是非法的偶摔,這是因為a1+a2在運算的時候自動轉(zhuǎn)成了int型然后再運算暇唾,返回值變成了int型,或許還會想為什么兩者代表的都是1+2為什么第二個非法呢,因為在運算的時候第二個1和2從byte型的盒子里跑到了int型的盒子內(nèi)策州,而第一個里的1和2不在任何盒子里瘸味,所以第二個如果要把它變成byte型,就要打破盒子也就是強轉(zhuǎn)
i++先運算(包括比較)抽活,先賦值硫戈,先輸出,再自加下硕,自加表示對本身的操作等同于i=i+1(int i=5;int a=i++;? ? 此時a=5丁逝,i=6 ) ? ?byte a=127 ? byte=++a; ? 是對a本身操作梭姓,a的類型并沒有轉(zhuǎn)換霜幼,而
byte c=a+1 ? 右邊變成一個運算,所以會自動轉(zhuǎn)換為int型
int i=5;int a=i++ + i++;? ? ? ? 此時a=11誉尖,i=7第一個i++是5++罪既,第二個i++因為第一個i++結(jié)束變成6++? ,所以a=5+6=11铡恕;? ? i=i+1+1=7
int b=i++ + i-- + i++? ? 5++? + 6-- + 5++ =16
++i 先自加琢感,再賦值(int i=5;int a=++i;? ? 此時a=6,i=6 )
面試題
int i=3探熔;? i=i++驹针;? i=i++;? 輸出的i都為3诀艰,不變
原因:其實a++的運算柬甥,是在a進行運算之前,先開辟一塊內(nèi)存用來存儲變量a的復(fù)制其垄,b真正指向的其實是a運算之前的復(fù)制苛蒲,所以b的值為3
而i=i++,由于兩邊變量相同绿满,i的復(fù)制最后覆蓋了i++后的值
i++在內(nèi)存中是比較奇特的臂外,而a=b+c 在內(nèi)存中,b和c并不會復(fù)制棒口,而是直接將b和c相加寄月,得到的值賦給a
i*=++i ? ? ? i= i* ++i=12*13
邏輯和關(guān)系運算符
!=表不等? == 表相等
&&短路與无牵,||短路或? 如果第一個表達式能確定結(jié)果,第二個表達式就不進行計算
&厂抖,|? 兩個表達式都進行計算
建議用短路與與短路或茎毁,避免一些錯誤產(chǎn)生,例:x!=0&&1/x? 當(dāng)x=0時確定結(jié)果七蜘,不會執(zhí)行第二個表達式避免了錯誤的產(chǎn)生
expression1 ^ expression2 異或谭溉,兩側(cè)真假相同,為假
三元運算符
condition橡卤?expression1:expression2? ? 當(dāng)condition為真時計算第一個表達式扮念,為假計算第二個表達式
面試題:? ? System.out.println(3>2?2:3.0);
注:1.表達式1和表達式2決定返回值類型
? ? ? ? 2.如果表達式類型不一致碧库,必須進行類型轉(zhuǎn)換柜与,轉(zhuǎn)換為表達式類型中較大的一個類型,從而決定返回值
? ? ? ??3.表達式1和表達式2中都可以再套一個三元運算符構(gòu)成了復(fù)雜的三元運算符
位運算符(針對二進制)嵌灰,1表示true弄匕,0表示false ?(了解)
無符號右移:符號位不跟著移動,有符號右移>>>:符號跟著一起移動(不存在有符號左移)
5<<2左移兩位? ? 0000 0101? 左移兩位后0001 0100
5>>2
若是int型表32位沽瞭,則 1<<35? 與1<<3相同迁匠,因為需要進行模32的運算
1&1為1,否則為0? 0|0為0驹溃,否則為1
異或:相同為false(0)城丧,不同為true(1)
4取反為-5 ?4二進制為0100取反為1011,第一位為1表負(fù)數(shù)豌鹤,-1去反轉(zhuǎn)換為十進制為-5
面試題:把8變成2最快效率亡哄,把8右移二位(因為8/2計算機也會先轉(zhuǎn)換為2進制,再運算)
輸入輸出
控制臺輸入:構(gòu)建Scanner對象傍药,并與“標(biāo)準(zhǔn)輸入流”System.in關(guān)聯(lián)磺平。
Scanner in=new Scanner(System.in); ? ?
String name=in.nextLine()拐辽;? //nextLine()表示獲取一行 ??
使用println有可能讀取的是一個空行
String firstName=in.next()拣挪;? //讀取一個單詞,以空格為分隔符
int age=int.nextInt俱诸;? //讀取一個整數(shù)菠劝,舉一反三可以讀取其它基本類型
格式化輸出(了解)實際調(diào)用了format
System.out.printf(“hello,%s睁搭,you‘ll be %d”赶诊,name,age) ? 表示以%s的形式表示name
每一個以%字符開始的格式說明符都用相應(yīng)的參數(shù)替換园骆,f表浮點舔痪,s表字符串,d表十進制
%8.2f? 表示 打印8個字符锌唾,小數(shù)點后有兩位
%锄码,d ? ? 表示將整數(shù)以逗號進行間隔
print 表示不換行的打印
輸出時不管任何類型都會先轉(zhuǎn)換為String然后輸出