Java標識符
Java所有的組成部分都需要名字。類名、變量名以及方法名都被稱為標識符。
規范 :
所有的標識符都應該以字母(A-Z或者a-z),美元符($)、或者下劃線()開始
首字符之后可以是字母(A-Z或者a-z),美元符($)、下劃線()或數字的任何字符組合
關鍵字不能用作標識符
標識符是大小寫敏感的
類名最好要大寫,用來區分他是一個類
java命名規范
(1)類名接口名:所有首字母大寫XxxYyyZzz
(2)變量名,函數名:xxYyZz
(3)包名:xxyyzz
(4)常量名 XXX_YYY_ZZZ
****Java關鍵字
這些保留字不能用于常量、變量、和任何標識符的名稱。(不用記,以后會接觸)
Java注釋:一定要寫
(被注釋內容不會被編譯,僅僅起到提示的作用,便于后期review代碼)
1.// 單行注釋
2./*
多行注釋
/
3./*多行注釋,可以生成文檔,又叫文檔注釋 命令行輸入javadoc xxx.java
*/
常量
常量表示不能被改變的數值
變量
變量指的是內存中的一塊存儲區域,該區域有自己的名稱(變量名)和類型(數據類型),該區域的數據可以在同一類型范圍內不斷變化, 變量的作用范圍只在該“{}”中有效
int a; { a=6; } // a等于6 { int a =6;} //定義在{}內的變量,{}外不可以訪問
所以說如果你想要在{}之后訪問大括號里進行變化的變量,此變量必須在{}外聲明
定義變量的格式
1.數據類型 變量名 = 初始化值(聲明并初始化)
2.先聲明,再初始化
注意:(1)變量的定義格式是固定的,變量就如同數學中的未知數
(2)變量必須有 初始值
(3)變量只能 被聲明一次
二進制(了解)
java二進制采用 補碼 形式表示 , 正負數區分的標志:符號位(0正,1負)
正數補碼是其本身,負數補碼取反+1
所以 計算機二進制 與十進制轉換,要先把二進制轉換為原碼作為過渡再進行轉換。
1.十進制轉換為二進制: 除2取余,除盡為止,余數從上向下看為二進制源碼結果,由于是正數所以原碼和補碼相同
- 二進制轉換為十進制 :累加求和
-
負十進制轉換為負數二進制 :取絕對值,轉換為二進制,取反加1
4.負二進制:取反加1,轉換為十進制,乘-1
拓展: 為什么byte表示的是8個字節,范圍卻是-128到127呢?
-128到127.共256個數。剛好可以用一個字節(8位)表示出來(2^8=256);
01111111表示的是127 ,按道理128表示的是10000000,可是因為第一位是一個符號位,所以byte正數最大值就為127,當第一位等于1的時候就是負數,把10000000看作是一個負數的補碼,轉換為十進制就是把10000000取反加1為10000000十進制就是128,再乘-1為-128
127后面是-128,最大的正數之后是最小的負數。這就跟鐘表一樣,12點鐘后面是1點中鐘一樣。
byte b=(byte)128, 把128賦值給b,計算機語言 是通過二進制補碼表示的,但因為正數原碼補碼相同,所以b的值變成了10000000,這時你要輸出b,計算機發現第一位的符號位是1,則把它看成是負數的補碼,輸出時再轉換為十進制則變成負128( 賦值時,計算機接收的是二進制的補碼,輸出的時候把補碼轉換為原碼在轉換為十進制然后再輸出 )
基本數據類型 :四型八種(可以想象是一種容器,承裝事物)
整型 (整數):byte(1個字節8位 -128-127)、short(2個字節)、int(4個字節)、long(8個字節)
浮點型(小數):float(4個字節,2的-149次方—2的127次方)、double(8個字節,非常大)
布爾型(表示真假):boolean(1字節)
字符型:char(2字節)用單引號括起來,只能是兩個字母,一個漢字等于兩個字符(0-65535)
ascii掌握 a-z(97-122),A-Z(65-90),1-9(48-57),每個ascii都對應一個字符
Java中默認的整數類型是int,如果要定義為long ,則要在數值后加上L或者l
默認的浮點型是雙精度浮點,如果要定義float,則要在數值后面加上f或者F
一個字節等于8位,1個字節等于256個數。2^8
一個英文字母或者阿拉伯數字占一個字節
一個漢字占2個字節
可為數字加下劃線,讓人更易閱讀,編譯器自動去除
轉義字符 :具有特殊含義的字符
System.out.prinltn(‘\’’);
\’算是一個整體標識一個單引號
\v豎向跳格 \b退格
\r回車(表示的是回到本行行首)
System.out.println('h');
System.out.println('\r');
System.out.println('a'); //最后輸出的是 a因為\r回到了行首,a覆蓋了h
\反斜線符"" \n新行
\t跳向下一個tab位置(橫向跳到下一制表位置) 縮進的時候都要寫
數據類型轉換
1.自動類型轉換
小類型可自動轉換為大類型
byte a=12; int b=a byte自動轉換為int
2.強制類型轉換
(比如把裝滿水的大杯子往小杯子里倒水,多余的會溢出,而小向大倒沒有問題。)
大類型轉換為小類型,可能損失精度
int a=3;
byte b=(byte)a;
字符串類型 (引用類型)
String str = ""; // 這個跟"abc"、"中國",本質上這都一樣,只是空串,長度為0罷了
""是空字符串,但是也是字符串,沒有什么東西。 //字符串初始化用“”,不用null
而null是空的意思,什么都沒有,沒有地址。
字符串與基本數據類型的轉換
String s=“”+123; //基本數據類型轉換為字符串,空串加基本數據類型
Integer.parseInt(數字字符串); //字符串轉換為數字
Double.parseDouble(數字字符串);
s.charAt(index)//字符串轉換為字符
運算符( 相等是== ,賦值是= 千萬不要寫錯! )
算術運算符 :+ - * / % ++ --
(1) int a=5; int b=2; int c=a/b; int表示整數,小數部分被舍棄,答案為2
(2) int a=3;int b=4;double c=a/b; a/b運算之后是int型,舍棄小數部分為0,自動轉換為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 兩數想運算, 返回的結果是兩數據類型中較大的(精度)
整型運算自動轉換為int進行運算,浮點型運算自動轉換為double進行運算,因此要得到特定其它類型,需要進行強制轉換
****注:不知道有沒有有這樣的疑問:****
為什么byte a=1+2; 是合法的而 byte a=1; byte b=2;byte c=a1+a2;就是非法的,這是因為a1+a2在運算的時候自動轉成了int型然后再運算,返回值變成了int型,或許還會想為什么兩者代表的都是1+2為什么第二個非法呢,因為在運算的時候第二個1和2從byte型的盒子里跑到了int型的盒子內,而第一個里的1和2不在任何盒子里,所以第二個如果要把它變成byte型,就要打破盒子也就是強轉
i++先運算,先賦值,先輸出,再自加,自加 表示對本身的操作 等同于i=i+1(int i=5;int a=i++; 此時a=5,i=6 ) ** byte a=127 byte=++a; 是對a本身操作,a的類型并沒有轉換,而**
byte c=a+1 右邊變成一個運算,所以會自動轉換為int型
int i=5;int a=i++ + i++; 此時a=11,i=7第一個i++是5++,第二個i++因為第一個i++結束變成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進行運算之前,先開辟一塊內存用來存儲變量a的復制,b真正指向的其實是a運算之前的復制,所以b的值為3
而i=i++,由于兩邊變量相同,i的復制最后覆蓋了i++后的值
i++在內存中是比較奇特的,而a=b+c 在內存中,b和c并不會復制,而是直接將b和c相加,得到的值賦給a
邏輯和關系運算符
!=表不等 == 表相等
&&短路與,||短路或 如果第一個表達式能確定結果,第二個表達式就不進行計算
&,| 兩個表達式都進行計算
建議用短路與與短路或 ,避免一些錯誤產生,例:x!=0&&1/x 當x=0時確定結果,不會執行第二個表達式避免了錯誤的產生
expression1 ^ expression2 異或,兩側真假相同,為假
三元運算符
condition?expression1:expression2 當condition為真時計算第一個表達式,為假計算第二個表達式
面試題: System.out.println(3>2?2:3.0);
注:1.表達式1和表達式2決定返回值類型
2.如果表達式類型不一致,必須進行類型轉換,轉換為表達式類型中較大的一個類型,從而決定返回值
** ** 3.表達式1和表達式2中都可以再套一個三元運算符構成了復雜的三元運算符
位運算符(針對二進制),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
4取反為-5 4二進制為0100取反為1011,第一位為1表負數,-1去反轉換為十進制為-5
面試題:把8變成2最快效率,把8右移二位(因為8/2計算機也會先轉換為2進制,再運算)
輸入輸出
控制臺輸入:構建Scanner對象,并與“標準輸入流”System.in關聯。
Scanner in=new Scanner(System.in);
String name=in.nextLine(); //nextLine()表示獲取一行
String firstName=in.next(); //讀取一個單詞,以空格為分隔符
int age=int.nextInt; //讀取一個整數,舉一反三可以讀取其它基本類型
格式化輸出(了解)
System.out.printf(“hello,%s,you‘ll be %d”,name,age)
每一個以%字符開始的格式說明符都用相應的參數替換,f表浮點,s表字符串,d表十進制
%8.2f 表示 打印8個字符,小數點后有兩位
print 表示不換行的打印