【Java】编码规范
Java編程入門
回顧
什么是Java語言
- 一種面向對象的語言
- 編寫程序的開始就是編寫類的開始 class 用于定義類
- 一種平臺無關的語言,必須程序運行的解釋環境
- 真正的運行步驟為 javac編譯–java解釋執行
- 一種健壯【魯棒性】的語言,吸收了C/C++語言的優點,但是去掉了影響程序健壯性的部分,例如指針、內存的申請與釋放等。
典型的應用場景:互聯網環境
常見錯誤
1、使用臨時變量,Java要求必須是先定義后使用,必須是先賦初值后使用
int k; Systm.out.println(k);2、目前的要求:將所有的程序都必須寫在方法內部,不能寫在方法外
public class ForTest{ int res=0; for(int k=1;k<101;k++){ res+=k; } System.out.println("1+2+3+...+100="+res); }Java的三種核心機制
- Java語言包含三種核心機制:Java 虛擬機、垃圾收集機制和代碼安全檢測。
Java虛擬機 JVM
- Java虛擬機可以理解成一個以字節碼為機器指令的CPU
- 對于不同的運行平臺,有不同的虛擬機
- Java虛擬機機制屏蔽了底層運行平臺的差別,實現了“一次編譯,到處運行”
垃圾收集機制 gc
- 不再使用內存空間回收——垃圾回收
- 在C/C++等語言中,由程序員負責回收無用內存
- Java語消除了程序員回收無用內存空間的責任,它提供了一種系統級線程跟蹤存儲空間的分配情況,并在JVM的空閑時檢查并釋放哪些可被釋放的存儲空間
- 垃圾收集在Java程序原型過程中自動運行,程序員無法精確控制和干預
代碼安全性檢查
Java代碼的目標運行環境在于網絡,Java以犧牲執行性能為代價換取了高安全性
- 首先由類加載器classLoader負責將類文件.class加載到Java虛擬機中。通過區分本地文件系統的類和網絡系統導入的類增加安全性,可以限制任何木馬程序,因為本機類總是有限被加載,一旦所有的類都被加載完畢,直線文件的內存就固定了。
- 其次字節碼校驗器進行校驗。字節碼校驗器不檢查那些可信任的編譯器生成的類文件,而是對違背 命名空間規定和java語言規則的類進行檢查,并且關閉具有安全性漏洞的類文件
- 最后字節碼校驗通過后,才由Java解釋器負責將類文件解釋成為機器碼進行執行
Java中標識符
- 字母(Unicode編碼字符集)、數字、下劃線和$符構成,不允許數字打頭
- 嚴格區分大小寫
- ISO8859-1
- GB2312和GBK【GB8030】
- Unicode統一編碼字符集
- 由于_和$有特殊含義,一般不建議用戶直接使用
- 不建議使用中文命名
- 不允許使用保留字(goto const)和關鍵字(public class static…)
- 長度沒有限制
編碼規范
- 類名首字母大寫,大寫字母分詞 建議名詞。例如UserName或者MingZi
- 方法名稱首字母小寫,大寫字母分詞
- 變量名稱首字母小寫,大寫字母分詞
- 包名稱全小寫,使用域名反轉的方式定義
平常練習中遵循SUN的基礎規范;項目開發中要求遵循ali發布的規范。進入公司首先考察公司的編碼規
范
Java是一種先編譯后解釋執行型語言
- javac Hello.java【源代碼文件名稱】編譯,將源代碼轉換為虛擬機可以識別的中間性質語言,一般生成一個同名的后綴為class的文件【二進制文件,字節碼文件】,這里就是跨平臺的原理
- java Hello[類名稱,就是源代碼中class關鍵字后面所跟的名稱]一般是解釋執行字節碼文件
Java語法基礎
- Java大小寫敏感。比如HelloWorld和Helloworld是不一樣的
- 包名Package是公司、組織、個人的域名的反轉,一般是英文字母。英文字母必須是小寫
- 包名稱可以認為是一個名空間
- 例如藍鷗的網址為lanou3g.com,定義包名稱為com.lanou3g
- 類名ClassName和方法名稱采用駝峰命名法,例如StudentName
- Java源文件的文件名必須和文件中公共public類名稱一樣
- 關鍵字中所有字母都為小寫。關鍵字不能用作變量名,方法名,類名,包名和參數。
Java是一種自由格式的語言,可用任意個空格、制表符、換行符隔開每個詞
System.
out.
println
( “Counted " + count + " chars.” );
同時也允許將多行代碼寫在一行上,注意使用分號隔開。所有的語句末尾以分號;收尾
java中空語句
;常見的編程錯誤
目前的要求:將所有的程序都必須寫在方法內部,不能寫在方法外
使用臨時變量,Java要求必須是先定義后使用,必須是先賦初值后使用
Java標識符
- 標識符可從一個字母(Unicode編碼字符集)、下劃線_或美元符號$開始,隨后也可跟數字、字母、下劃線或美元符號。
- 標識符是區分大小寫,沒有長度限制,可以為標識符取任意長度的名字
- 標識符不允許使用保留字。關鍵字對Java編譯器有特殊的含義,它們可標識數據類型名或程序構造construct名, java語言中的保留字均用小寫字母表示
變量
- 變量是Java程序中的基本存儲單元,它的定義包括變量名、變量類型和作用域幾個部分
- 例如int k=100; 其中int是數據類型,k是變量名 m
- 變量名稱:在一個方法內部不允許出現多個同名稱的變量
- java要求見名知意,例如username。但是xm則不建議使用變量類型:
- Java屬于強類型編程語言,變量類型一旦聲明,則不能進行修改
- 數據類型可以決定變量所需要的存儲空間大小和對應的處理邏輯
作用域是指變量的有效范圍,一般是在所在花括號范圍內
public static void main(String[] args){ { System.out.println(k);//錯誤1:要求臨時變量必須是先定義后使用,必須是先賦初值后使 用 int k=100; System.out.println(k); } System.out.println(k);//錯誤2:因為k定義在{}內部,所以k只在上面的{}分為內有效,離開了 {}則失效,{}外引用k則報錯 } public static void main(String[] args){ int k=99; { System.out.println(k); int k=100; //錯誤:因為Java是強類型編程語言,所以在{}外已經聲明了k的類型,在k的有效 范圍內不允許重新聲明。這里可以修改為k=100; System.out.println(k); } System.out.println(k); }JAVA是強類型語言
每個變量有類型,每個表達式有類型,而且每種類型都是嚴格定義的
Java編譯器對所有的表達式和參數都要進行類型相容性的檢查,以保證類型是兼容的
任何類型的不匹配都將被報告為錯誤而不是警告。在編譯器完成編譯以前,錯誤必須被改正過來
String s1="123";//字符串類型 int k1=s1;//語法報錯在Java語言數據類型可以分為兩大類:基本類型和引用類型
基本類型(原生類型)
基本類型是指不能再分解的數據類型,其數據在函數的調用中是以傳值方式工作的。
簡單數據類型代表單值,而不是復雜的對象
Java是完全面向對象的,但簡單數據類型卻不是,它們類似于其他大多數非面向對象語言中的簡單數據類型。這樣做的原因是出于效率方面的考慮。在面向對象中引入簡單數據類型不會對執行效率產生太多的影響。
Java針對基本類型同時提供了對應的引用類型:包裝類
Java編程語言有八個原始數據類型,可分為4種整型、浮點數、字符型數據和布爾型數據,不會隨著計算機類型而變化的,注意Java具有平臺無關性,所以不論硬件平臺是什么,1B都是8位
整型有4種:byte字節整、short短整、int整、long長整
- java中的數據采用的是補碼的存儲方式
計算機中存儲數據有3種不同的方式,分別是原碼、反碼和補碼
byte:1B(8b),-128到127
short:2B,-32768到32767
int:4B,-2147483648到2147483647
long:8B,-9223372036854775808到9223372036854775807
如果需要使用具體的上下限取值,可以通過包裝類中的常量進行使用
十進制整數。如123,-456,0
八進制整數。以0開頭,如0123表示十進制數83,-011表示十進制數-9。
十六進制整數。以0x或0X開頭,如0x123表示十進制數291,-0X12表示十進制數-18
二進制整數,以0b或0B開頭,例如0b10110010
int k1=123; int k2=0123; int k3=0x123; int k4=0b100101; System.out.println(k1+"\t"+k2+"\t"+k3+"\t"+k4);//具體輸出時,系統會自動將k2轉換為10進 制輸出可以通過包裝類中提供的方法將十進制數轉換為2、8和16進制
int k = 123; String ob=Integer.toBinaryString(k);//將十進制數轉換為2進制的字符串 System.out.println(ob); //1111011 String oo=Integer.toOctalString(k); System.out.println(oo); //173 String oh=Integer.toHexString(k); System.out.println(oh);//7b整數類缺省為int類型,如在其后有一個字母“l或者L”表示一個long值
123系統會自動識別為int類型 123L或者123l系統自動識別為long浮點數類型
float單精度、double雙精度
- float是4B,可以保證小數點后6位有效精度和第7位的部分精度 e38
- double是8B,可以保證小數點后15位有效精度和第16位的部分精度。e308
- 浮點數是無法精確存放的,原因在于將浮點數轉換為補碼時的限制
- 針對浮點數則不能使用等值判斷
Java浮點數都是用科學計數法來存儲數據的,無論是單精度還是雙精度在存儲中都分為三個部分: - 符號位Sign : 0代表正,1代表為負,是第一位
- 指數位Exponent:用于存儲科學計數法中的指數數據,單精度為8位,雙精度11位。用指數部分的值(8位/11位unsigned)的值減去偏移附加值得到該數實際的指數。例如值200,實際指數為73=200-127,對于雙精度的double來說常量1023
- 尾數部分Mantissa
樣例17.625在內存中的存儲為:
- 首先要把17.625換算成二進制:10001.101
- 整數部分:除以2,直到商為0,余數反轉
- 小數部分:乘以2,直到乘位為0,進位順序取。(即:乘2取整法)
- 再將10001.101右移,直到小數點前只剩1位,1.0001101*2^4 ,右移動了四位。
- 符號:因為是正數,所以是0
- 綜上所述,17.625在內存中的存儲格式是:01000001 10001101 00000000 00000000
在Java中浮點數無法精確存放,除非使用BigDecimal
float:4B:1.4E-45到3.4028235E38 保存7-8位有效數據
double:8B:4.9E-324到1.7976931348623157E308 保存15-16位有效數據
注意:浮點數無法精確存放
表示方法: - 十進制數形式。由數字和小數點組成,且必須有小數點,如0.123, 1.23, 123.0
- 科學計數法形式。如:123e3或123E-3,其中e或E之前必須有數字,且e或E后面的指數必須為整數
- f或者F表示float,而d或者D代表double。例如123f或者123.45D,系統默認為double類型
Java精確計算問題
關鍵字strictfp是strict float point的縮寫,指的是精確浮點,它是用來確保浮點數運算的準確性。
- JVM在執行浮點數運算時,如果沒有指定strictfp關鍵字,此時計算結果可能會不精確,而且計算結果在不同平臺或廠商的虛擬機上會有不同的結果,導致意想不到的錯誤。而一旦使用了strictfp來聲明一個類、接口或者方法,那么在所聲明的范圍內,Java編譯器以及運行環境會完全依照IEEE二進制浮點數算術標準來執行,在這個關鍵字聲明的范圍內所有浮點數的計算都是精確的。
- 需要注意的是,當一個類被strictfp修飾時,所有方法都會自動被strictfp修飾。因此,strictfp可以保證浮點數運算的精確性,而且在不同的硬件平臺會有一致的運行結果。但是精確計算事實上還是沒有得到保障,這是受到存儲方式的限制。需要精確計算還是以來BigDecimal實現的。
常見數學計算
Java的Math類中包含了用于執行基本數學運算的屬性和方法,如初等指數、對數、平方根和三角函數。Math的方法都被定義為static 形式,通過Math類可以在主函數中直接調用。
- Math.sqrt()計算平方根
- Math.pow(a, b)計算a的b次方
- Math.max(a,b)計算最大值
- Math.min(a,b)計算最小值
- Math.abs()求絕對值
- Math.ceil天花板的意思,就是返回大的值;floor地板的意思,就是返回小的值;round 四舍五入,float時返回int值,double時返回long值
- random 取得一個大于或者等于0.0小于不等于1.0的隨機數
字符類型 char
Java中存放字符采用的是Unicode編碼字符集,2B,0-65535
- 字符類型的變量可以當作整數使用
- char c=‘a’; 注意:這里使用的是單引號,不是雙引號,單引號中只能包含一個字符
- 需要記憶: ‘0’ < ‘A’ <‘a’
- Java也提供轉義字符,以反斜杠(\)開頭,將其后的字符轉變為另外的含義
基本使用
char c='h'; System.out.println((int)c); //獲取'h'字符對應的unicode編碼值 104 //GB2312 System.out.println(c); // c='ab' 語法報錯,因為只能對應一個字符 //引入轉移字符 c='\''; c='\110'; System.out.println(c);//H System.out.println((int)c);//72 c='\u0050'; System.out.println(c); //P System.out.println((int)c);//80布爾類型 boolean
boolean數據類型有兩種文字值:true真和false假
在Java編程語言中boolean類型只允許使用boolean值,在整數類型和boolean類型之間無轉換計算
基本數據類型轉換
小轉大自動轉換
byte b1=123; long k1=b1; double kk=k1; System.out.println(kk); long kk = 123456L; float ff=kk; //沒有錯誤。float 4B long 8B大轉小需要強制轉換
double dd=123.567; long kk=(long)dd; System.out.println(kk);類型轉換的語法:
int k=100; char cc=(char)k; //強制類型轉換:窄化操作 char k='d'; System.out.println((int)k); boolean bb=true; System.out.println((int)bb);//因為boolean類型和數值類型之間沒有任何對應關系,所以這里的強轉會報語法錯誤double
float f1=123.456;//語法報錯,因為系統默認帶小數點的數據為double類型,所以123.456是double 類型的數據,而聲明f1為float,所以這里需要進行數據類型轉換或者進行特殊聲明。如果浮點數轉換為整數 是直接截斷小數部分。 float f1=(float)123.456; float f1=123.456f; //數字末尾的f類似于數字末尾的L,用于進行數據類型的說明,f/F表示這是一個 float類型的數據 d/D表示是一個double類型的數據復合數據類型
復合數據類型包括:class類、interface接口、數組。
null 索引在運行時并沒有對應的類型,但它可以被轉換為任何類型(不能是簡單類型)。
索引類型的默認值就是null
常量
常量就是指在程序執行期間其值不能發生變化的數據,常量是固定的。如整型常量123,實型常量1.23,字符常量’A’,布爾常量true等
需求:要求用戶鍵盤輸入一個整數的半徑值,計算園的面積
還需要計算周長
但是客戶提出需求變動,認為2位小數精度不足,需要進一步提升精度
解決方案就是將2處的3.14修改為3.1415926
新問題是:如果修改時漏改一處,則是一個隱藏的bug。引入常量以避免出現這樣的問題。
如何接收鍵盤錄入數據
java.util.Scanner類常用于控制臺的輸入,當需要使用控制臺輸入時即可調用這個類。
使用方法
- 首先需要構造一個Scanner類的對象,并且與標準輸入流System.in關聯 Scanner sc = new
Scanner(System.in); - 調用Scanner類對象sc的方法從輸入流中獲取你需要的輸入
說明:
當創建了一個Scanner類對象之后,控制臺會一直等待輸入,直到敲回車鍵結束,把所輸入的內容
傳給對象sc,若要獲取需要的內容,調用sc的方法即可
每次可以只輸入一個數字,回車確認,例如123,只能被一個nextInt讀取。
也可以輸入一組數字,例如123 456 789,每個數字之間用空格(一個或多個空格)隔開,可被多
個nextInt()讀取,空格及回車不會被讀取。(注:輸入數字中不能夾雜除數字、空格、回車之外的
其他字符,否則會報錯)
如何在控制臺輸出數據
System.out.println(數據); System.out.println("請輸入園的半徑值:"); int kk=100; double res=3.14*kk*kk; System.out.println("園的半徑值為"+kk+",對應面積為"+res);表達式
表達式就是運算符、操作數以及方法調用的序列,用來說明某個計算過程并返回計算結果. 按照運算符功能來分,基本的運算符分包括算術運算符、關系運算符、位運算符、條件運算符等
- 算術運算符 +、-、*、/、%、++、–
- 關系運算符 >、<、>=、<=、==、!=
- 邏輯運算符 &&、 ||、 !。注意:邏輯計算支持短路操作
- 位運算符 &、|、^、~、<< 、 >>、>>>。注意:為運算符不支持短路操作[考點]
- 賦值運算符 =,+=,―=,*=,/=
- 三目條件運算符(?:)規則是完全一致的,使用的形式是: x ? y:z;
算術運算符 +、-、*、/、%、++、–
+-*/ 整除:參與運算的雙方都是整數 10/3=3而不是3.33333 如果是10./3=3.333...這里由于10.是浮點數,則3會自動轉換為大類型并參與計算,所以最終是10.0/3.0 的計算結果 計算次序為先乘除后加減,如果優先級一致,則自動從左向右進行計算 10+2*5=20 /除法分母不能為0,否則出錯 % 求余(取模) 10%3=1實際就是10除以3求余數 double k=10.12; System.out.println(k%3); 輸出:1.1199999999999992 應該返回值為1.12,由于浮點數不能精確存放,所以返回值是一個類似值 double d1=-10.12; double res=d1%3; System.out.println(res); 輸出值為-1.1199999999999992 求余計算中符號位不參與計算 ++和--是單目運算符 i++等價于i=i+1,i--等價于i=i-1 以++為例寫法有2個:i++或者++i i++是先獲取i的值,然后再對i加1 int age=100; System.out.println(age++);輸出為100 System.out.println(age); 輸出為101,因為上面進行加1 ++i是先對i加1,然后再獲取i的值 int age=100; System.out.println(++age);輸出101,先加1然后獲取值 System.out.println(age); 輸出101考核題目
public class Oper11 { public static void main(String[] args) { int k = 0; int res = k++ + k++ + k; System.out.println(res); //3 int m = 0; res = ++m + m++ + m; System.out.println(res); //4 } }關系運算符 >、<、>=、<=、==、!=
用于判斷兩個數據之間的大小關系,計算結果為boolean,如果成立返回為true,否則為false
double d1=10; System.out.println(d1>3); 返回true ==和=的區別: k=100;這是賦值運算符,意思是將=右邊的計算結果儲存在=左邊的變量中 k==100這是比較計算符,意思是判斷k是否值為100;如果是則返回true,否則false !=意思是判斷是否不等于,表示如果相等時返回false,否則返回true k!=100不等于判定,如果k值為100則返回false,如果k值不是100則返回true 由于浮點數無法精確存放,所以判斷k==1.0這個寫法是錯誤的 正確寫法: a-b的絕對值小于1e-6 Java提供了一個工具類Math,其中包含一個abs()的方法實現求絕對值 Math.abs(d1-1)<1e-6 判斷浮點類型的變量d1的值是否為1浮點數的比較
double res = 0; for(int i=0;i<10;i++) res=res+0.1; if(Math.abs(res-1)<1e-6) //|res-1|判斷是否小于10的-6次方 System.out.println("計算結果為1"); else System.out.println("計算結果不為1");需求:
用戶輸入身高和體重,計算對應的BMI指數值
BMI指數(英文為Body Mass Index,簡稱BMI),是用體重千克數除以身高米數的平方得出的數字,是國際上常用的衡量人體胖瘦程度以及是否健康的一個標準
如何實現接受用戶的鍵盤錄入數據
//建立一個變量指向鍵盤錄入 Scanner sc = new Scanner(System.in); //通過這個變量讀取用戶鍵盤錄入的數據,如果用戶不輸入則一直等待,如果輸入的數據不是浮點數,則報錯 double height=sc.nextDouble(); 變量sc中是Java提供的具體實現方法nextDouble實現從鍵盤讀取一個浮點數,如果要求用戶輸入int,則方 法為nextInt,。。。如何實現屏幕輸出
System.out.println("具體需要輸出的內容");輸出內容后會自動換行,如果不需要換行,則使用方法 System.out.print("") System.out.println("num:"+num);意思是輸出【num:123】 System.out.println("num:num")意思是輸出【num:num】總結
以上是生活随笔為你收集整理的【Java】编码规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于ArcEngine实现分组统计面积的
- 下一篇: Struts2中action接受参数方法