Java基礎知識總結(一)


《Java基礎知識總結》系列是對自己學習Java歷程中知識的一個總結,也是為自己找工作前知識的回顧,為找工作奠定基礎。

 

  1、Identifiers:標識符

   ①Names of class,method and variable:用於類名、方法名、變量名

  ②Begin with character,"_" or "$":標識符不能以數字開頭

  ③Case sensitive:大小寫敏感(區分大小寫)

  ④No length limitation:長度無限制

  ⑤標識符不能是Java關鍵字,漢字也可以做標識符,但是不建議使用(使用漢字涉及到編碼問題,跨平台時回出現問題)。

  ⑥StringJava的一個類,類名是標識符,所以String可以做標識符。

  ⑦There is no sizeof operator.Java中沒有sizeof運算符,所以sizeof可以作為標識符

  ⑧關鍵字、保留字(const、goto、true、false、null)不能用作標識符。

 1 public class Identifiers {
 2     public static void main(String[] args) {
 3         String $abc="abc1";
 4         String _abc="abc2";
 5         //編譯錯誤,標識符不能以數字開頭
 6         //String 8abc="abc3";  
 7         String 中國="China";
 8         String String="wanghao";
 9         int Integer=22;
10         //Java中沒有sizeof運算符,所以sizeof可以作為標識符
11         String sizeof="sizeof";
12         System.out.println(String);//wanghao
13         System.out.println(Integer);//22
14     }
15 }

 

  2、Keywords關鍵字

  The goto and const keyword are not used in the Java programming.

  const 保留關鍵字(留兒不用)。const是從C++繼承而來的,但是Java並不使用const這個關鍵字,由於JVM是由C++編寫的,因此,雖然Java並不使用const這個關鍵字,但卻要保留下來。和const一樣goto也是保留關鍵字!

  關鍵字全部用小寫表示(53個)

  Strictly speaking,the literals true,false,and null are not keywords but literals;however,the distinction is academic.

true,false,and null是保留字但不是關鍵字,只是3個值,不能用來做關鍵字。

  

   3、Primitive data types:基本數據類型

  Java強數據類型只能先聲明后使用。

  boolean    Boolean literals indicating true or false

  char       Stores one 16-bit unicode character

    char 同時具備字符和整數的特征。 

  byte       8-bit integer

  short      16-bit integer

  int        32-bit integer

  long       64-bit integer

    Integer Data Types-byte,short,int and long

  float       32-bit floating-point number

  double     64-bit floating-point number

  在范圍內的常數可以自動轉換類型,但是變量就不一定了。

  小————》大  自動轉換

  大————》小  強制類型轉化

  Byte相當於截取了最后8位,前面的全部舍去

 1 public class Demo {
 2     public static void main(String[] args) {
 3         int i1 = 5;  //語句1   Right
 4         
 5         byte b1=5;   //語句2   Right
 6         byte b2=3;   //語句3   Right
 7         //byte b3=128;  //語句4  Wrong   128超出了byte的范圍
 8         byte b3=(byte)128;  //語句5   Right
 9         //byte的取值范圍:(-128,127)
10         byte b4=127;
11         byte b5=-128;
12         //byte b6=-129;  //-129超出了byte的范圍
13         
14         long l1=5;    //語句6    Right
15         long l2=5L;   //語句7    Right
16         //b1=i1;      //語句8  Wrong   i1不能轉換成b1
17         b1=(byte)i1;  //語句9  
18         l1=i1;        //語句10  Right
19         //i1=123L;    //語句11   Wrong
20         i1=(int)123L;  //語句12
21         
22         //b1=b1+b2;   //語句13   Wrong  b1+b2變成int
23         b1=(byte)(b1+b2);  //語句14
24      }
25 }

  程序分析:

  整形數據默(byte,short,int and long)認類型是int型,因此語句1正確

   占用位數小的類型(簡稱“小類型”)向占用位數多的類型(簡稱“大類型”)可以自動轉換,相反,大類型到小類型則要通過強制類型轉換。

      如:語句6是由int---->long(自動轉換)

    語句11是由long---->int(不能進行轉換,提示“可能損失精度”的錯誤),必須通過強制類型轉換,改正后為語句12

   語句2和語句3是由int---->byte(自動轉換),這又是怎么回事呢?

    int可自動轉換為byte和short而無需強制類型轉換,這是因為byte和short表示的范圍較小,所有小於int的整型運算,先轉換為int類型,再參與運算。例如:1520都在byte范圍內但是15*20卻超出了byte的表示范圍,則要存放在int類型變量里面。

   既然int可以自動轉換為byte和short而不需強制類型轉換,那么為什么語句8會出錯,需要改成語句9這樣的強制類型轉換呢?

    語句8表面上是int---->byte但是i1是一個int型的變量,它表示(-65535----65535)范圍的整數,不能確定它的值,因此需要強制類型轉換。語句4中128超出了byte的表示范圍,因此不能賦值給byte變量b3需要進行強制類型轉換,如語句5。

   強制類型轉換的實質是什么呢?

    例如語句5執行的結果是:-128,這是為什么呢?

      這正是強制類型轉換后的結果。int類型是32-bit128的二進制表示形式為:00000000,00000000,00000000,10000000Byte類型是8-bit,要把int類型強制轉換成byte類型,則只截取其后8-bit,把前24-bit去除掉。因此byte b3=(byte)128;執行后的結果的二進制表示形式為:10000000,對應的整數即為-128

   所有小於Int的整型運算,先轉成int 再運算,因此語句13出現錯誤,需要進行強制類型轉換,如語句14

 1 public class Float {
 2     public static void main(String[] args) {
 3         double d1=123.0;
 4         double d2=123.0F;
 5         //編譯錯誤    Default data type is double
 6         //float f1=123.0; 
 7         //需要強制類型轉換
 8         float f1=(float)123.0;
 9         
10         //int和long可以自動轉換為float和double
11         float f2=123;
12         float f3=123L;
13         double d3=123;
14         double d4=123L;
15     }
16 }

  Float Point Data Type-float and double

   Default data type is double

   A float data is 32-bit long

   A double data is 64-bit long

   A float data ends with 'f' or 'F'

   A double data can end with 'd' or 'D'

     在計算機領域對於floatdouble只能表示他們的近似值。因為小數可以無限,但是計算機表示的精度是有限的。

  intlong可以自動轉換為floatdouble

 

  Java變量類型:

  ① 基本類型:boolean,byte,char,shot,int,long,float,double

  ② 引用類型:所有類、接口、數組、枚舉、標注

  

  Recommended Naming Rules

  ① Class names begin with uppercase character

  ② Interface names begin with uppercase character

  ③ Method names begin with lowercase character

  ④ Variable names begin with lowercase character

  ⑤ Constant variable names are in uppercase character,不同單詞間用“_ 隔開,例如:USER_NAME

  ⑥ Package names are in lowercase character

  規范我們可以違背,但是我們提倡遵守,養成一種良好的習慣!

 

  4、Operators  

  Assignment operators

  =   +=   -=   %=   *=   /=    <<=     >>=     >>>=    &=    ^=      |=

1 public class ByteDemo {
2     public static void main(String[] args) {
3         byte b1=2;
4         byte b2=3;
5         b1=(byte)(b1+b2);  // 語句1   加法,轉int
6         b1+=b2;            //語句2    賦值,不轉int
7     }
8 }

  b1+=b2;是否和語句b1=b1+b2完全等價?

    答案是否定的,上面程序中的語句1和語句2給出了證明。語句1中byte類型參數與運算時要先轉換為int型,因此要進行強制類型轉換。而語句2中,自動進行類型轉換。(我的理解:我們可以把“b11+=b2;”看做是對“b1=(byte)(b1+b2);”的優化!)

  Comparison operators

  >    >=     <     <=     instanceof

  Equality operators

  = =        !=

  Arithmetic operators

  +       -       *       /        %

  Shift operators

  >>   <<    >>>

  Bitwise operators

  &     |      ^(按位異或)   ~(按位取反)

  Logic operators

  &&  (邏輯與) &      ||  (邏輯或)  |      !(邏輯非)

  &&&都是邏輯與,它們之間的區別:&&是短路邏輯與,有短路的效果,效率更高。

  |||都是邏輯或,它們之間的區別:||是短路邏輯或,有短路的效果,效率更高。

  Conditional  operators

  ? :

  Other operators

  ++    --

 1 public class Test5 {
 2     public static void main(String [] args){
 3         int i=2;
 4         System.out.println(i++);   //2
 5         System.out.println(i);      //3
 6         int a=i++ + ++i;    //3+5=8
 7         System.out.println(a);
 8         System.out.println(i);  //5
 9         for(int j=0;j<1000;j++){
10             i=i++;
11         }
12         System.out.println(i);   //5
13     }
14 }

  程序分析:

  為什么經過1000次循環后,i=i++;的結果仍然是5?

  (老師講解)++的運算符優先級高於=(賦值)運算符,i++的運算結果為5,進入寄存器,這時寄存器中存放的值為5。然后i的值變為6,繼續執行賦值語句,賦值時,把寄存器中的值賦5值給i,因此i的值是5和6之間來回切換的!

  (我的理解)++的運算符優先級高於=(賦值)運算符,因此這個表達式的執行順序如下:①運算i++這個表達式的結果為----> i的值自加1(i++先參與運算,再自加1),即i的值變為6----> ③將i++這個表達式的值,即第①部的結果賦值給變量i("="表達式是將右邊表達式的值賦值與左邊的變量,因此是將5賦於i,而不是將6賦於i)。整個循環過程i的值在56之間來回切換。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM