Java_一些小知識點

NO IMAGE

變數什麼情況下會自動被賦一個初始值

基本型別(不包括基本型別陣列)的成員變數在定義的時候如果沒有初始化,那麼編譯器會自動初始化給他賦一個初始值。區域性變數則不會。

(int[] i = new int[5];   這樣的式子不管是成員變數還是區域性變數,都會有預設的值。其實它和上面說的不一樣,它已經初始化了,所以會有預設值,上面說的是沒有初始化的情況下。)

(另外,final型別的成員變數必須初始化,不然編譯器會報錯)

預設的構造方法

如果一個類中沒有構造方法,編譯器會自動給這個類新增一個無參的預設構造方法。

如果一個類中已經有了構造方法,不管是無參的還是有參的,編譯器都不會再建立預設構造方法了。

看下面的例子:

class Dog {
    private String name;
    Dog(String name) {}
}

如果這樣寫new Dog();那麼編譯器會報錯。

值傳遞和引用傳遞

當一個變數作為一個引數傳入方法內部的時候,會有兩種不同的傳遞方式:值傳遞和引用傳遞。

值傳遞的特點:不管方法內部對傳進去的引數作任何改變,也不會影響方法外部的變數的值。

引用傳遞的特點:方法內部對傳進去的引數作的改變也會影響方法外部的變數的值。

那麼哪些是值傳遞,哪些是引用傳遞呢?

  1. 基本型別(8種)的傳遞都是值傳遞。
  2. 引用型別(除String外)都是引用傳遞。
  3. Strng比較特殊,它雖然是引用型別,但是卻是值傳遞。

基本型別的取值範圍

在講解基本型別的取值範圍之前,先講講二進位制怎麼轉換為十進位制(算取值範圍的時候會用到)。

首先二進位制有帶符號的二進位制和不帶符號的二進位制。

比如:1111

如果它是不帶符號的二進位制,那麼它的十進位制值 = 2^3 2^2 2^1 2^0 = 2^4 – 1 = 15

如果它是帶符號的二進位制,那麼最高位(千位)就是符號位,1代表負數,0代表正數。那麼負的二進位制怎麼換算為十進位制呢?首先要把除符號位的所有位按位取反再加1(算出來是1001),然後在算它的十進位制值 = -2^0 = -1

Java中基本型別的取值範圍

基本型別位元組數位數最大值最小值
byte1byte8bit2^7 – 1-2^7
short2byte16bit2^15 – 1-2^15
int4byte32bit2^31 – 1-2^31
long8byte64bit2^63 – 1-2^63
float4byte32bit3.4028235E381.4E – 45
double8byte64bit1.7976931348623157E3084.9E – 324
char2byte16bit2^16 – 10

其實,這些取值範圍不需要死記,可以通過位數計算出來,下面舉兩個例子(byte和char)說明一下

byte的情況:

byte佔8位,而且有正有負。最大值當然就是01111111 = 2^7 – 1。因為負的二進位制有個按位取反再加1的操作,所以最小值是10000000,按位取反後為11111111,再加1後為110000000 = -2^7

char的情況:

char佔16位,而且沒有負值。所以最小值是0。最大值是1111111111111111 = 2^16 – 1

Java中的許可權訪問修飾符

Java中有四種許可權訪問修飾符:private、(default)、protected、public,它們的訪問許可權如下:

 包外子類包內本類
publicYESYESYESYES
protectedNOYESYESYES
(default)NONOYESYES
privateNONONOYES

繼承時需要複寫父類的方法的時候,許可權反問修飾符可以往範圍大的變,不可以往範圍小的變。

介面和抽象類的比較

 介面抽象類
功能實現多繼承作為直接父類被繼承
成員變數必須是public static final的常量
(如果不加修飾符,預設是public static final的)
沒有要求,和普通類一樣
方法所有方法都必須是public abstract的
(如果不加修飾符,預設是public abstract)
抽象方法和非抽象方法都可以有
一個抽象類並不一定必須存在非抽象方法
抽象方法的訪問許可權沒有要求,和普通類一樣
(但是abstract關鍵字和介面不同必須要加)
抽象方法的實現如果是介面繼承介面,或者是抽象類實現介面,都不需要實現抽象方法和介面一樣
能不能例項化不能不能