2017 - 10 -13 java基礎

1  環境配置

path              配置javac 編譯  不需要進入bin目錄 直接運行javac

classpath    配置java 運行  不需要進入文件目錄 直接運行class 文件  算是瞭解知識    

                     模仿path製作的


2  命名規則

包:文件夾,區分類。。。全部用小寫。

類或接口: 
       一個單詞:單詞首字母必須大寫  Student  Dog
       多個單詞:每個單詞首字母必須大寫  HelloWorld

方法或者變量:
       一個單詞:單詞的首字母小寫  main age
       多個單詞:從第二個單詞開始,每個單詞的首字母大寫  studentAge

常量:
      一個單詞:全部大寫                 PI
      多個單詞:每個字母都大寫,用_隔開  STUDENT_MAX_AGE

3 原碼反碼補碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001

正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反

正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)
(補碼->原碼   取反加一   補碼的補碼就是原碼 )

4  自動轉換

byte  a=3;
int   b=4;
byte c= a+b;// byte做加法 默認轉換,a轉換成4字節然後加b,結果會提示精度問題。
                      //從小轉換到大  byte char short 轉換成int進行運算

5  強制類型轉換溢出問題(8種類型)

//因爲byte的範圍是:-128到127 而130不在範圍內,所以報錯
byte b=130;
//所以可以使用強制類型轉換
byte b =(byte)130;

分析過程:
我們要想知道結果是什麼,就應該知道是如何進行計算的
而我們又知道計算機中數據的運算都是補碼進行的。
而要得到補碼,首先要計算出數據的二進制

A:130 這個數據的二進制
   00000000 00000000 00000000 10000010

B:做截取操作,截成byte類型的了。
   10000010
   這個結果是補碼。

C:已知補碼求原碼
          符號位           數值位
   補碼:   1             0000010
   反碼:   1             0000001
   原碼:   1             1111110
(1 1111110)所以變成了 -126

***6 面試題
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是編譯失敗的呢?爲什麼呢?
byte b=130;有沒有問題?如果我想讓賦值正確,可以怎麼做?結果是多少呢?
練習:byte b=300;

b=b1+b2;//這個是類型提升,所以有問題  。。。byte做加法 自動轉換成int類型,但b是byte類型
b=3+4;  //常量,先把結果計算出來,然後看是否在byte的範圍內,如果在範圍就運算

(XJad 反編譯工具,將class文件編譯成java文件)

***7 看程序寫結果

class DataTypeDemo{
      public static void main(String[] args){
         System.out.println('a');   //直接輸出一個  字符a

         System.out.println('a'+1); //輸出一個字符和一個整數做加法 98   ('0'48 'A'65 'a'97 )

         // 字符串數據和其他數據做+,結果是字符串類型。
         // 這裏的+不是加法運算,而是字符串連接符。
         //println輸出從左到右?
         System.out.println("hello"+'a'+1);//helloa1
         System.out.println('a'+1+"hello");//98hello
         System.out.println("5+5="+5+5);//5+5=55
         System.out.println(5+5"=5+5");//10=5+5

8 數據類型中補充的幾個小問題
(1):在定義Long或者Float類型變量的時候,要加L或者f。
   整數默認是int類型,浮點數默認是double。

   byte,short在定義的時候,它們接收的其實是一個int類型的值。
   這個是自己做了一個數據檢測的,如果不在它們範圍內,就報錯。

(2):byte值得問題
   byte b1=127;
   byte b2=(byte)128; //-128
   byte b3=(byte)129; //-127
   byte b4=(byte)130; //-127
   byte的範圍:-128-127
   
   128:1000 0000
   -128:1000 000(這裏的1即是符號位,也是數值位)

(3):數據類型轉換之默認轉換
   byte,short,char--int--long--float--double
   long:8個字節
   float:4個字節

  l爲什麼long會轉換成float呢?

  A:它們底層的存儲結構不同。
  B:float表示的數據範圍比long的範圍更大
  long:2^63-1
  float:3.4*10^38>2*10^38>2*8^38=2*2^114>2^63-1

(4):java語言中的字符char可以存儲一箇中文漢字嗎?爲什麼呢?
     可以,因爲java語言中字符佔用兩個字節。
     java語言採用的unicode編碼。

9 +的用法:
  A:加法
  B:正號
  C:字符串連接符

  System.out.println(3+4);//加法
  System.out.println(+4);//正號
  System.out.println("hello"+'a'+1);//helloa1
  System.out.println('a'+1+"hello");//98hello

10 單目運算符  ~3
   雙目運算符  3+4
   三目運算符:
   格式:比較表達式?表達式1:表達式2;

     

***11 賦值運算符 面試題
   short s= 1;
   s=s+1; //有問題,s運算時自動轉換成int類型,然後s又是short 會精度報錯

   short s=1;
   s +=1;//好像是s=s+1;
   //但實際上沒有問題。。。。

   爲什麼第二個沒有問題。。。因爲擴展的賦值運算符其實隱含了一個強制類型轉換。
   s+=1;
   不是等價於 s=s+1;
   而是等價於 s=(s的數據類型)(s+1)

***12 位運算符 面試題

   兩個數的交換
   a b
   方式1:使用第三方變量 c
   方式2:用位異或實現(面試用)
   a=a^b;
   b=a^b;//a^b^b=a
   a=a^b;//a^b^a=b
   方式3:用變量相加的做法
   a=a+b;//a=30
   b=a-b;//b=10
   a=a-b;//a=20
   方式4:一句話搞定
   b=(a+b) - (a=b);// b=10+20 - (20) , a=20

13 \t tab的位置  \n 換行  \r 回車
  
14 java內存分配
   寄存器
   棧
   堆
   方法區

   常量池
 (jdk1.6及之前的版本常量池在方法區,方法區默認4M,容易出現java.lang.OutOfMemoryError:PermGen space錯誤;jdk1.7做了調整,常量池移動到堆中;jdk1.8取消方法區。永久代是hotspot虛擬機的中方法區的實現,所以hotspot虛擬機中方法區也叫永久代。jdk1.8中用元空間代替了方法區。)


   c++內存管理
   棧
   堆
   自由存儲區
   全局(靜態)存儲區
   常量存儲區
發佈了31 篇原創文章 · 獲贊 2 · 訪問量 9211
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章