path 配置javac 編譯 不需要進入bin目錄 直接運行javac
classpath 配置java 運行 不需要進入文件目錄 直接運行class 文件 算是瞭解知識模仿path製作的
包:文件夾,區分類。。。全部用小寫。
類或接口:
一個單詞:單詞首字母必須大寫 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++內存管理
棧
堆
自由存儲區
全局(靜態)存儲區
常量存儲區