摘要:運算符主要介紹不常用到的位運算符,位運算符都是相對整型二進制數(shù)位來說的假設(shè)是一個被移位的整型數(shù)據(jù),是位移量。按位運算符也可以操作邏輯型數(shù)據(jù)。所以,如果以后有人問你是值傳遞還是引用傳遞,你直接告訴他這是個無聊的問題。
Java基礎(chǔ) 關(guān)鍵字
主要介紹不常用到的關(guān)鍵字:
native - native通常用來修飾方法,一個native方法就是一個Java調(diào)用非Java代碼的接口(A native method is a Java method whose implementation is provided by non-java code.),也就是說該方法的實現(xiàn)由非Java語言提供。另外,調(diào)用native方法的其他類甚至不知道它所調(diào)用的是一個本地方法,JVM將控制調(diào)用本地方法的所有細節(jié),即JNI框架,這里就不展開敘述了。
default - 定義注解時用于返回屬性的默認(rèn)值。Java 8用default來繞開已發(fā)布的接口無法再修改的障礙。在Java 8中,接口中的方法可以被實現(xiàn)。接口中被實現(xiàn)的方法叫做default方法,用關(guān)鍵字default作為修飾符來標(biāo)識。當(dāng)一個類實現(xiàn)一個接口的時候,它可以實現(xiàn)已經(jīng)在接口中被實現(xiàn)過的方法,但這不是必須的。這個類會繼承default方法。這就是為什么當(dāng)接口發(fā)生改變的時候,實現(xiàn)類不需要做改動的原因。
volatile - 被其修飾的域在每次被線程訪問時,都強迫從主內(nèi)存中重讀該成員變量的值;而且當(dāng)成員變量發(fā)生變化時,強迫線程將變化值回寫到主內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到域的同一個值,也稱作線程可見性。
Java語言規(guī)范中指出:為了獲得最佳速度,允許**線程保存共享成員變量的私有拷貝**,而且只當(dāng)線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。這樣當(dāng)多個線程同時讀寫某個對象,并且沒有進行同步時(不在同步代碼快內(nèi)),就需要讓線程及時的得到共享成員變量的變化。而volatile關(guān)鍵字就是告訴JVM對于這個域不能保存它的私有拷貝,而應(yīng)直接與其它線程共享。 由此可以,使用volatile屏蔽掉了JVM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時才使用此關(guān)鍵字。
transient - 被其修飾的域不會被序列化,請查看序列化。
strictfp - 修飾符的一種,可應(yīng)用于類、接口或方法。使用 strictfp 關(guān)鍵字聲明一個方法或類時,該方法或類中所有的float和double表達式都嚴(yán)格遵守FP-strict的限制,符合IEEE-754規(guī)范。通常處理器都各自實現(xiàn)浮點運算,各自專業(yè)浮點處理器為實現(xiàn)最高速,計算結(jié)果會和IEEE標(biāo)準(zhǔn)有細小差別。比如intel主流芯片的浮點運算,內(nèi)部是80bit高精運算,只輸出64bit的結(jié)果。IEEE只要求64bit精度的計算,你更精確反而導(dǎo)致結(jié)果不一樣。所以設(shè)立嚴(yán)格浮點計算,保證在各平臺間結(jié)果一致,IEEE標(biāo)準(zhǔn)優(yōu)先,性能其次;而非嚴(yán)格的浮點計算是性能優(yōu)先,標(biāo)準(zhǔn)其次。
const - Java保留字,不支持使用。
goto - Java保留字,不支持使用。
基本數(shù)據(jù)類型Data Type | Length(bit) | Default Value (for fields) |
---|---|---|
boolean | 1 | false |
byte | 8 | (byte)0 |
short | 2-byte | (short)0 |
char | 2-byte | "u0000" |
int | 4-byte | 0 |
long | 8-byte | 0L |
float | 4-byte | 0.0f |
double | 8-byte | 0.0d |
這8個基本數(shù)據(jù)類型可以分為兩大類,一類是整型,另一類是浮點型。浮點型包括float和double類型,剩下的可以歸為整型。整型是精確的,而浮點型是不精確的。如果要求數(shù)值的絕對精確,不要用浮點型,更多細節(jié)請查看精密計算。
除了上述8個基本數(shù)據(jù)類型, Java還通過類類型提供了對char串的支持。
Data Type | Default Value (for fields) |
---|---|
String (or any object) | null |
這里還涉及到字符編碼(比如ASCII和Unicode編碼)等知識,請另行查閱。
另外,Java還提供了與基本數(shù)據(jù)類型相關(guān)的類,即包裝類。尤其需要提到的是char的包裝類Character,而不是String。為什么需要包裝類這種東西?因為,基本類型不是對象,下面的代碼在Java里不被允許:
7.toString();
也正是這一點,有人說Java不是完全面向?qū)ο蟮恼Z言,而比如Ruby,其基本類型也是對象。所以在需要對象的地方,就需要與基本類型對應(yīng)的包裝類實例。
進制Java支持二進制、八進制、十進制和十六機制的數(shù)值表示:
二進制:數(shù)字前加0b前綴,如0b101。
八進制:數(shù)字前加0前綴,如0107。
十進制:數(shù)字前不加前綴,如109。
十六機制:數(shù)字前加0x前綴,如0x10F。
運算符主要介紹不常用到的位運算符,位運算符都是相對整型二進制數(shù)位來說的:
<< 假設(shè)a是一個被移位的整型數(shù)據(jù),n是位移量。a<
>> 假設(shè)a是一個被移位的整型數(shù)據(jù),n是位移量。a>>n運算的結(jié)果是通過將a的所有位都右移n位,每右移一位,右邊的低階位上的0或1被移出丟棄,并用0或1填充左邊的高位。a是正數(shù)時用0填充,是負數(shù)時用1填充。更多細節(jié)請另行查閱。
>>> 假設(shè)a是一個被移位的整型數(shù)據(jù),n是位移量。a>>>n運算的結(jié)果是通過將a的所有位都右移n位,每右移一位,右邊的低階位上的0或1被移出丟棄,并用0填充左邊的高位。更多細節(jié)請另行查閱。
&(&=) 按位與。
|(|=) 按位或。
^(^=) 按位異或,相同為0,不同為1。
按位運算符也可以操作邏輯型數(shù)據(jù)。按位運算的一個典型應(yīng)用是定義一組常量,將2的不同倍數(shù)賦予每個常量:
// Bit field enumeration constants - OBSOLETE! public class Text { public static final int STYLE_BOLD = 1 << 0; // 1 public static final int STYLE_ITALIC = 1 << 1; // 2 public static final int STYLE_UNDERLINE = 1 << 2; // 4 public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8 // Parameter is bitwise OR of zero or more STYLE_ constants public void applyStyles(int styles) { if ((styles & STYLE_BOLD) == STYLE_BOLD) { System.out.println("bold"); } if ((styles & STYLE_ITALIC) == STYLE_ITALIC) { System.out.println("italic"); } if ((styles & STYLE_UNDERLINE) == STYLE_UNDERLINE) { System.out.println("underline"); } if ((styles & STYLE_STRIKETHROUGH) == STYLE_STRIKETHROUGH) { System.out.println("strikethrough"); } } }
這種表示法允許你用按位或|運算符將幾個常量合并到一個表達式中,稱作位域(bit field):
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
位域表示法也允許利用位運算符,執(zhí)行聯(lián)合、差集以及交集等操作。
訪問權(quán)限Modifier | Class | Package | Subclass | World |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
package-private(default) | Y | Y | N | N |
private | Y | N | N | N |
注意:Override可以減弱訪問權(quán)限,但不能增強。
遞歸#Todo#
標(biāo)簽Java允許通過標(biāo)簽(結(jié)合關(guān)鍵字break和continue)實現(xiàn)流程控制,但最好不這樣做:
outer: while (...) { inner: for (...) { if (...) { break inner; } continue outer; } }接口
語言層面上,相較于類,接口有著自己的一些特性。
接口的所有成員變量都是public static final的,無論你顯式聲明與否。為什么是這樣,引用SO上的兩個答案感受一下:
Protected methods are intended for sharing implementation with subclasses. Interfaces have nothing to offer as far as implementation sharing goes, because they have no implementation at all. Therefore all methods on interfaces must be public.
Because an interface is supposed to mean "what you can see from outside the class". It would not make sense to add non-public methods.
但是這里有個問題,因為Java 8支持接口提供默認(rèn)的方法實現(xiàn),這樣的話,如果一個接口是為了被其它接口繼承而設(shè)計的,受保護(protected)的方法是不是就有意義了呢?當(dāng)然,這也是一種非常極端的用法,可能并不提倡。
接口的所有方法都是public abstract的,無論你顯式聲明與否;但Java 8 提供了接口方法的默認(rèn)實現(xiàn),叫做default方法,用關(guān)鍵字default作為修飾符來標(biāo)識,這一定意義上破壞了這一約束。
接口本身是public abstract的,abstract修飾符被默認(rèn)隱藏。
靜態(tài)靜態(tài)代碼的真正意義是什么?靜態(tài)代碼是屬于類的代碼,即便對象不存在,屬于類的代碼也存在也可訪問,只要類已經(jīng)被加載。#Todo#
值傳遞還是引用傳遞Java是值傳遞還是引用傳遞?不知道這個問題有沒有使你感到困擾,但這個問題確實一直困擾著我,我覺得對象是引用傳遞,但是很多教科書式的答案都是說Java只有值傳遞,直到我讀到《Thinking in Java 4th Edition》里面的一段話,才豁然開朗:
This brings up the terminology issue, which always seems good for an argument. The term is "pass by value," and the meaning depends on how you perceive the operation of the program. The general meaning is that you get a local copy of whatever you’re passing, but the real question is how you think about what you’re passing. When it comes to the meaning of "pass by value," there are two fairly distinct camps:
Java passes everything by value. When you’re passing primitives into a method, you get a distinct copy of the primitive. When you’re passing a handle into a method, you get a copy of the handle. Ergo, everything is pass by value. Of course, the assumption is that you’re always thinking (and caring) that handles are being passed, but it seems like the Java design has gone a long way toward allowing you to ignore (most of the time) that you’re working with a handle. That is, it seems to allow you to think of the handle as "the object," since it implicitly dereferences it whenever you make a method call.
Java passes primitives by value (no argument there), but objects are passed by reference. This is the world view that the handle is an alias for the object, so you don’t think about passing handles, but instead say "I"m passing the object." Since you don’t get a local copy of the object when you pass it into a method, objects are clearly not passed by value. There appears to be some support for this view within Sun, since one of the "reserved but not implemented" keywords is byvalue. (There’s no knowing, however, whether that keyword will ever see the light of day.)
Having given both camps a good airing and after saying "It depends on how you think of a handle," I will attempt to sidestep the issue for the rest of the book. In the end, it isn"t that important – what is important is that you understand that passing a handle allows the caller’s object to be changed unexpectedly.
其實,對于Java這種純面向?qū)ο蟮恼Z言,無所謂值傳遞還是引用傳遞,更準(zhǔn)確的理解就是傳遞的就是那個對象,所以對傳遞進來的對象的修改,會反映到原來對象上,這就足夠了。只有在低級語言如C++才會需要明顯區(qū)分地址、引用和值這些概念,而對于高級的面向?qū)ο笳Z言則完全是多此一舉。所以,如果以后有人問你Java是值傳遞還是引用傳遞,你直接告訴他這是個無聊的問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65560.html
摘要:一般使用使用正則循環(huán)替換如下這種情況,表情標(biāo)簽的替換,我們需要正常的字符串替換,例如結(jié)合實現(xiàn)。 一般使用 var str = test-test-test; str = test-test-test.replace(test, ok); console.log(str); 使用正則: var str = test-test-test; str = test-test-test.repl...
摘要:觀察者模式定義設(shè)計模式中對的定義一個對象稱為維持一系列依賴于它觀察者的對象,將有關(guān)狀態(tài)的任何變更自動通知給它們。如圖模式比較觀察者模式則多了一個類似于話題調(diào)度中心的流程,發(fā)布者和訂閱者解耦。 Obeserver(觀察者)模式 定義 《js設(shè)計模式》中對Observer的定義:一個對象(稱為subject)維持一系列依賴于它(觀察者)的對象,將有關(guān)狀態(tài)的任何變更自動通知給它們。 《設(shè)計模...
摘要:加載配置文件失敗加載配置文件失敗添加定時調(diào)度任務(wù)定時調(diào)度任務(wù)添加定時調(diào)度任務(wù)定時調(diào)度任務(wù)執(zhí)行的張表入數(shù)據(jù)庫添加啟動類簡單微服務(wù),采用注解配置分布式集群。 SpringCloud(第 054 篇)簡單 Quartz-Cluster 微服務(wù),采用注解配置 Quartz 分布式集群 - 一、大致介紹 1、因網(wǎng)友提到有沒有采用注解式配置的Quartz例子,因此本人就貼上了這樣一個樣例; 2、至...
摘要:然后煎魚加了一個后再調(diào)用函數(shù),得到的輸出結(jié)果和加修飾器的一樣,換言之等效于因此,我們對于,可以理解是,它通過閉包的方式把新函數(shù)的引用賦值給了原來函數(shù)的引用。 Python有什么好學(xué)的這句話可不是反問句,而是問句哦。 主要是煎魚覺得太多的人覺得Python的語法較為簡單,寫出來的代碼只要符合邏輯,不需要太多的學(xué)習(xí)即可,即可從一門其他語言跳來用Python寫(當(dāng)然這樣是好事,誰都希望入門簡...
閱讀 979·2021-11-17 09:33
閱讀 435·2019-08-30 11:16
閱讀 2498·2019-08-29 16:05
閱讀 3374·2019-08-29 15:28
閱讀 1422·2019-08-29 11:29
閱讀 1975·2019-08-26 13:51
閱讀 3415·2019-08-26 11:55
閱讀 1238·2019-08-26 11:31