摘要:和也許看起來像是關鍵字,但是他們專門用于表示布爾類型的字面量。值得注意的是,在中整形值和布爾值之間不能相互轉(zhuǎn)換至少在語言層面。相關的操作等于不等于取反位與異或或條件與條件或三目運算符在控制流程中使用一個布爾值可且僅可被轉(zhuǎn)型為,類型。
總覽
Java 語言中有 50 個關鍵字,這些關鍵字不能用作標識符,如下圖所示(來自 jls8)
其中關鍵字 const 和 goto 是預留的,現(xiàn)在無法使用,并且在程序中出現(xiàn)會是編譯器產(chǎn)生錯誤信息。
true 和 false 也許看起來像是關鍵字,但是他們專門用于表示布爾類型的字面量。類似的, null 專門用于表示 Null 類型的字面量。
其中 strictfp 始于 1.2,assert 始于 1.4, enum 始于 1.5, 這里說的都是 JDK 的版本。
下面我們先開始將關鍵詞分類,無法的分類的關鍵詞將分開講解。
歸類 基本類型char
boolean
double float
byte int long short
共計 8 中類型的基本類型,占據(jù)了 Java 的 8 的關鍵字。
下面簡單介紹一下,從最簡單的開始。
很簡單,非真即假,有兩個字面量,true 和 false。 值得注意的是,在 Java 中整形值和布爾值之間不能相互轉(zhuǎn)換,至少在語言層面。網(wǎng)上有關 boolean 在內(nèi)存中占用多大空間,這涉及到一個設計與實現(xiàn)的問題,Java 語言的規(guī)范和 Java 虛擬機的規(guī)范和最終實現(xiàn)的 Java 虛擬機的實現(xiàn)總會有實現(xiàn)上的語意偏離,而 Java 虛擬機的規(guī)范的原則也是在保證正確性的情況下盡量讓虛擬機的實現(xiàn)提升效率。
相關的操作:
== != 等于 不等于
! 取反
& ^ | 位與 異或 或
&& || 條件與 條件或
? : 三目運算符
在控制流程中使用(if, while, do, for)
一個布爾值可且僅可被轉(zhuǎn)型為 boolean, Boolean, Object 類型。
charchar 類型用于表示單個字符。
而關于 char 的長度是個非常有趣的問題,我們首先需要了解編碼的相關知識。
可以看一下吳秦的博客,總結(jié)的很好。
在 Java 語言中字符編碼是基于 Unicode 編碼規(guī)范中的 UTF-16 實現(xiàn)的,UTF-16 具體定義了 Unicode 字符在計算機中的存取方法,UTF-16 使用定長的兩個字節(jié)來表示 Unicode 的轉(zhuǎn)換格式,也是16位長度,理論上可以表示
65536 個字符,然后在當時足夠長的 char 類型在加入大量東亞體系的表意文字后, 16 位的 char 類型已經(jīng)不能描述所有的 Unicode 字符了。
對此 Java 的對應策略可以參照 魏照哲的專欄 進行理解,學習完上面兩篇博客和 Java 既有的字符表現(xiàn)形式,對于 char 長度這個問題大家應該要慎重對待。
byte short int long (Java 整型)Java 的整型的范圍是與機器無關的(這與 C,C++ 正好相反),因為 Java 程序時運行在 Java 虛擬機之上的,各個平臺的上的 Java 虛擬機遵循同樣的 Java 虛擬機規(guī)范。
這里再講一些關于整型字面量表示的內(nèi)容:
// 注意 "0" 是零 不是 字母 o 或 O int a = 077; // 前面加 "0" 表示八進制數(shù), 十進制 63 int b = 0xee; // 前面加 "0x" 或 "0X",后面的 ee 也可以表示成 EE、Ee、eE 表示十六進制,十進制238 int c = 0b00000001; // 前面加 "0b" 或 "0B",表示十六進制,十進制 1 ,JDK 1.7 增加的
另外順便說下在整形字面量和浮點數(shù)中使用下劃線的特性(也是JDK 1.7 增加的)
int a = 1_500_000; // 方便閱讀 float b = 5_6.3_4; // 需要注意的是不能以 "_" 開頭,只能出現(xiàn)在數(shù)字中間,包括不能出現(xiàn)在進制標示的后面 "0x_EF" 這樣不合法float double
怎么說呢,它們無法精確的表示所有數(shù),對于很多數(shù)而言,是存在誤差的。
大家先看篇博客,我去喝杯咖啡
if else switch case
while do for
break 用于退出 switch 和 當前循環(huán),另外支持標簽跳出多重循環(huán)
continue 用于結(jié)束本輪循環(huán),從下輪循環(huán)開始執(zhí)行
共計 9 個關鍵字。
關于流程控制關鍵字這里只講一下 switch :
case: 標簽可以是:
char, byte, short, int, Character, Byte, Short, Integer
enum 枚舉類型
String 字符串字面量 (JDK 1.7 增加),實際上是利用 hash 算法轉(zhuǎn)化為 int 類型的語法糖
訪問控制符包括 public protected private
訪問控制符決定了其他類是否可以使用特定的域或調(diào)用特定的方法。訪問控制分為兩個層次:
頂層,可以修飾類,public, package-private (不需要顯式修飾).
成員層面,public, private, protected 或者 package-private (不需要顯式修飾).
被聲明為 public 的類對所有類可見,沒有顯式修飾的類只在包內(nèi)可見。
關于成員的可見性,給出下圖以供理解:
package
import
包是我們用來分類相同功能模塊的類、接口文件的一個集合,就像我們電腦中文件夾一樣。聲明在類或接口文件的頭部,如下所示:
package packageName
關于包我們需要牢記的一點是,相同前綴的包除了可以在組織上在一起,但是實際上他們沒有任何關系:
例如 com.sun.a 和 com.sun 作為兩個包沒有任何關系,屬于獨立的類集合。
既然包已經(jīng)將我們類組織起來,那么我們?nèi)绾蝸硎褂冒袀€類的?
我們可以像下面一樣使用類的全限定名:
java.util.Date date = new java.util.Date(); // 假如你一直這么干,那么恭喜你,你對 JDK 中常用類分布一定非常熟悉 // 假如你一直這么干,并且使用黑軸的機械鍵盤,那么很不幸,你手指一定非常酸痛
這時 import 關鍵字就登場了,我們可以這樣:
import java.util.Date; ... Date date = new Date();
實際上在這里我必須要提前講到 static 關鍵字,JDK 1.5 起支持靜態(tài)導入:
// 讓我們可以不同導入 Math 類再使用 PI 靜態(tài)變量 import static java.lang.Math.PI; public class MathUtils{ //計算圓面積 public static double calCircleArea(double r){ return PI * r * r; } //計算球面積 public static double calBallArea(double r){ return 4 * PI * r * r; } }面向?qū)ο?/b>
對于各種編程范式,沒有本質(zhì)上的優(yōu)劣,都是為了更好的解決問題而存在的,我們需要權衡利弊,簡單就是一種美。
下面有幾篇文章是關于面向?qū)ο笠恍﹥?nèi)容,大家可以看看:
Wiki的詞條 ------ 如何理解面向?qū)ο?
代碼重構的一個例子 -------- 各種流行的編程方式
有時候走得太遠,我們都忘了我們?yōu)楹纬霭l(fā),不忘初心,不僅對于夢想,對程序設計也是如此。
開始將涉及的關鍵字再次分類:
class interface
extends implements
abstract static native
new
instanceof
this super
return
void
這部分內(nèi)容涉及面太廣,大家自己看看書吧,哈哈。
五連發(fā)
try catch finally throw throws
三連發(fā)
final volatile sychronized
final 基礎用法
內(nèi)存模型系列文章 建議大家看完這一系列文章
五連發(fā)
enum default assert strictfp transient
先看用法----》源碼解析---》一篇e文
default 在 switch 語句的的使用:int i=3; switch(i) { case 1: System.out.println(1); break; case 2: System.out.println(2); break; case 3: System.out.println(3); break; default: System.out.println("default"); break; }在注解中的使用
不了解注解的朋友可以先看幾篇文章Java 注解指導手冊-----注解的實現(xiàn)-曹旭東的回答
關于 default 在注解中的使用
來自 Java Language Specification 8 9.6.2 章節(jié)
An annotation type element may have a default value, specified by following the
element"s (empty) parameter list with the keyword default and an ElementValueDefault values are not compiled into annotations, but rather applied
dynamically at the time annotations are read. Thus, changing a default
value affects annotations even in classes that were compiled before
the change was made (presuming these annotations lack an explicit
value for the defaulted element)
public @interface RequestForEnhancementDefault { int id(); // No default - must be specified in each annotation String synopsis(); // No default - must be specified in each annotation String engineer() default "[unassigned]"; String date() default "[unimplemented]"; }interface default method (JDK 1.8)
我就不瞎比比了,大家看下幾篇介紹文章:
天馬流星拳------圓月彎刀
在各種測試框架大行其道的背景,這個關鍵字的使用,應該僅限于簡單的程序測試,需要注意的是斷言機制是否生效需要的顯式地指定 JVM 運行參數(shù)。參考 Programming With Assertions
strictfp引用 stackoverflow 上的一個回答來終結(jié)這個關鍵字
transientIt all began with a story,
When java was being developed by James Gosling, Herbert and rest of
his team. They had this crazy thing in mind called platform independency.
They wanted to make oak(Java) so much better that it
would run exactly same on any machine having different instruction
set, even running different operating systems. But, there was a
problem with decimal point numbers also known as floating point and
double in programming languages. Some machines were built targeting
efficiency while rest were targeting accuracy. So, the later(more
accurate) machines had size of floating point as 80 bits while the
former(more efficient/faster) machines had 64 bit doubles. But, this
was against there core idea of building a platform independentAlso, this might lead to loss of precision/data when a code
built on some machine(having double of 64 bit size) and run on
another kind of machine(having double of 80 bit size).
Up-Sizing can be tolerated but Down-Sizing can"t be. So, they came
across a concept of strictfp i.e. strict floating point. If you use
this keyword with a class/function then its floating point and doubles
have a consistent size over any machine. i.e. 32/64 -bit respectively.
給出幾篇文章來循序漸進地解決這個關鍵字
序列化用法--->深入分析序列化--->多帶帶說下transient關鍵字---》序列化高級認知---》序列化中那些你不知道的5件事---》使用SealedObject & SignedObject對序列化加密解密(只需要關注SealedObject & SignedObject 加解密這部分)
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65705.html
摘要:什么是線程餓死,什么是活鎖多線程中的忙循環(huán)是什么變量是什么變量和變量有什么不同類型變量提供什么保證能使得一個非原子操作變成原子操作嗎 JVM專題 showImg(https://segmentfault.com/img/remote/1460000019943435); (面試題+答案領取方式見個人主頁) Java 類加載過程? 描述一下 JVM 加載 Class 文件的原理機制? ...
摘要:為了幫助大家更快更多的了解阿里巴巴小程序繁星計劃的動態(tài),我們上線了專題頁面,匯集最新資訊,小程序云產(chǎn)品策略扶持計劃,一云多端架構,開發(fā)者互動區(qū),專家團和實踐案例?!军c擊訂閱云棲夜讀周刊】 阿里巴巴小程序繁星計劃公布后,得到開發(fā)者們的熱切關注,大家積極參與小程序開發(fā)者問卷調(diào)研,加入小程序開發(fā)者群中交流討論,開通小程序云應用資源體驗實踐。為了幫助大家更快更多的了解阿里巴巴小程序繁星計劃的動態(tài),...
閱讀 1872·2023-04-26 01:58
閱讀 1994·2019-08-30 11:26
閱讀 2737·2019-08-29 12:51
閱讀 3505·2019-08-29 11:11
閱讀 1192·2019-08-26 11:54
閱讀 2107·2019-08-26 11:48
閱讀 3489·2019-08-26 10:23
閱讀 2392·2019-08-23 18:30