Java 關鍵字專題

總覽

Java 語言中有 50 個關鍵字,這些關鍵字不能用做標識符,以下圖所示(來自 jls8)html

圖片描述

其中關鍵字 const 和 goto 是預留的,如今沒法使用,而且在程序中出現會是編譯器產生錯誤信息。java

true 和 false 也許看起來像是關鍵字,可是他們專門用於表示布爾類型的字面量。相似的, null 專門用於表示 Null 類型的字面量。算法

其中 strictfp 始於 1.2,assert 始於 1.4, enum 始於 1.5, 這裏說的都是 JDK 的版本。shell

下面咱們先開始將關鍵詞分類,沒法的分類的關鍵詞將分開講解。編程

歸類

基本類型

  1. char併發

  2. booleanoracle

  3. double floatapp

  4. byte int long short框架

共計 8 中類型的基本類型,佔據了 Java 的 8 的關鍵字。
下面簡單介紹一下,從最簡單的開始。ide

boolean

很簡單,非真即假,有兩個字面量,true 和 false。 值得注意的是,在 Java 中整形值和布爾值之間不能相互轉換,至少在語言層面。網上有關 boolean 在內存中佔用多大空間,這涉及到一個設計與實現的問題,Java 語言的規範和 Java 虛擬機的規範和最終實現的 Java 虛擬機的實現總會有實現上的語意偏離,而 Java 虛擬機的規範的原則也是在保證正確性的狀況下儘可能讓虛擬機的實現提高效率。

相關的操做:

  1. == != 等於 不等於

  2. ! 取反

  3. & ^ | 位與 異或 或

  4. && || 條件與 條件或

  5. ? : 三目運算符

  6. 在控制流程中使用(if, while, do, for)

一個布爾值可且僅可被轉型爲 boolean, Boolean, Object 類型。

char

char 類型用於表示單個字符。
而關於 char 的長度是個很是有趣的問題,咱們首先須要瞭解編碼的相關知識。
能夠看一下吳秦的博客,總結的很好。

在 Java 語言中字符編碼是基於 Unicode 編碼規範中的 UTF-16 實現的,UTF-16 具體定義了 Unicode 字符在計算機中的存取方法,UTF-16 使用定長的兩個字節來表示 Unicode 的轉換格式,也是16位長度,理論上能夠表示
65536 個字符,而後在當時足夠長的 char 類型在加入大量東亞體系的表意文字後, 16 位的 char 類型已經不能描述全部的 Unicode 字符了。

對此 Java 的對應策略能夠參照 魏照哲的專欄 進行理解,學習完上面兩篇博客和 Java 既有的字符表現形式,對於 char 長度這個問題你們應該要慎重對待。

byte short int long (Java 整型)

Java 的整型的範圍是與機器無關的(這與 C,C++ 正好相反),由於 Java 程序時運行在 Java 虛擬機之上的,各個平臺的上的 Java 虛擬機遵循一樣的 Java 虛擬機規範。

這裏再講一些關於整型字面量表示的內容:

// 注意 '0' 是零 不是 字母 o 或 O
int a = 077;   // 前面加 '0' 表示八進制數, 十進制 63
int b = 0xee;  // 前面加 '0x' 或 '0X',後面的 ee 也能夠表示成 EE、Ee、eE 表示十六進制,十進制238
int c = 0b00000001; // 前面加 '0b' 或 '0B',表示十六進制,十進制 1 ,JDK 1.7 增長的

另外順便說下在整形字面量和浮點數中使用下劃線的特性(也是JDK 1.7 增長的)

int a = 1_500_000; // 方便閱讀
float b = 5_6.3_4;
// 須要注意的是不能以 '_' 開頭,只能出如今數字中間,包括不能出如今進制標示的後面 '0x_EF' 這樣不合法

float double

怎麼說呢,它們沒法精確的表示全部數,對於不少數而言,是存在偏差的。
你們先看篇博客,我去喝杯咖啡

流程控制

  1. if else switch case

  2. while do for

  3. break 用於退出 switch 和 當前循環,另外支持標籤跳出多重循環

  4. continue 用於結束本輪循環,從下輪循環開始執行

共計 9 個關鍵字。

關於流程控制關鍵字這裏只講一下 switch :
case: 標籤能夠是:

  1. char, byte, short, int, Character, Byte, Short, Integer

  2. enum 枚舉類型

  3. String 字符串字面量 (JDK 1.7 增長),其實是利用 hash 算法轉化爲 int 類型的語法糖

訪問控制符

包括 public protected private

訪問控制符決定了其餘類是否可使用特定的域或調用特定的方法。訪問控制分爲兩個層次:

  • 頂層,能夠修飾類,public, package-private (不須要顯式修飾).

  • 成員層面,public, private, protected 或者 package-private (不須要顯式修飾).

被聲明爲 public 的類對全部類可見,沒有顯式修飾的類只在包內可見。
關於成員的可見性,給出下圖以供理解:
圖片描述

包相關

  1. package

  2. import

包是咱們用來分類相同功能模塊的類、接口文件的一個集合,就像咱們電腦中文件夾同樣。聲明在類或接口文件的頭部,以下所示:
package packageName
關於包咱們須要牢記的一點是,相同前綴的包除了能夠在組織上在一塊兒,可是實際上他們沒有任何關係:
例如 com.sun.a 和 com.sun 做爲兩個包沒有任何關係,屬於獨立的類集合。

既然包已經將咱們類組織起來,那麼咱們如何來使用包中個類的?
咱們能夠像下面同樣使用類的全限定名:

java.util.Date date = new java.util.Date(); 
// 假如你一直這麼幹,那麼恭喜你,你對 JDK 中經常使用類分佈必定很是熟悉
// 假如你一直這麼幹,而且使用黑軸的機械鍵盤,那麼很不幸,你手指必定很是痠痛

這時 import 關鍵字就登場了,咱們能夠這樣:

import java.util.Date;
...
Date date = new Date();

實際上在這裏我必需要提早講到 static 關鍵字,JDK 1.5 起支持靜態導入:

// 讓咱們能夠不一樣導入 Math 類再使用 PI 靜態變量
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;   
    }   
}

面向對象

對於各類編程範式,沒有本質上的優劣,都是爲了更好的解決問題而存在的,咱們須要權衡利弊,簡單就是一種美。
下面有幾篇文章是關於面向對象一些內容,你們能夠看看:
Wiki的詞條 ------ 如何理解面向對象
代碼重構的一個例子 -------- 各類流行的編程方式
有時候走得太遠,咱們都忘了咱們爲什麼出發,不忘初心,不只對於夢想,對程序設計也是如此。

開始將涉及的關鍵字再次分類:

  1. class interface

  2. extends implements

  3. abstract static native

  4. new

  5. instanceof

  6. this super

  7. return

  8. void
    這部份內容涉及面太廣,你們本身看看書吧,哈哈。

異常處理

五連發
try catch finally throw throws

併發與同步

三連發
final volatile sychronized
final 基礎用法
內存模型系列文章 建議你們看完這一系列文章

什麼鬼的其餘

五連發
enum default assert strictfp transient

enum

先看用法----》源碼解析---》一篇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 註解指導手冊-----註解的實現-曹旭東的回答

關於 default 在註解中的使用
來自 Java Language Specification 8 9.6.2 章節
An annotation type element may have a default value, specified by following the
element's (empty) parameter list with the keyword default and an ElementValue

Default 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)

我就不瞎比比了,你們看下幾篇介紹文章:
天馬流星拳------圓月彎刀

assert

在各類測試框架大行其道的背景,這個關鍵字的使用,應該僅限於簡單的程序測試,須要注意的是斷言機制是否生效須要的顯式地指定 JVM 運行參數。參考 Programming With Assertions

strictfp

引用 stackoverflow 上的一個回答來終結這個關鍵字

It 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 independent

  1. Also, this might lead to loss of precision/data when a code

  2. 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

給出幾篇文章來按部就班地解決這個關鍵字
序列化用法--->深刻分析序列化--->單獨說下transient關鍵字---》序列化高級認知---》序列化中那些你不知道的5件事---》使用SealedObject & SignedObject對序列化加密解密(只須要關注SealedObject & SignedObject 加解密這部分)

相關文章
相關標籤/搜索