變數什麼情況下會自動被賦一個初始值
基本型別(不包括基本型別陣列)的成員變數在定義的時候如果沒有初始化,那麼編譯器會自動初始化給他賦一個初始值。區域性變數則不會。
(int[] i = new int[5]; 這樣的式子不管是成員變數還是區域性變數,都會有預設的值。其實它和上面說的不一樣,它已經初始化了,所以會有預設值,上面說的是沒有初始化的情況下。)
(另外,final型別的成員變數必須初始化,不然編譯器會報錯)
預設的構造方法
如果一個類中沒有構造方法,編譯器會自動給這個類新增一個無參的預設構造方法。
如果一個類中已經有了構造方法,不管是無參的還是有參的,編譯器都不會再建立預設構造方法了。
看下面的例子:
class Dog {
private String name;
Dog(String name) {}
}如果這樣寫new Dog();那麼編譯器會報錯。
值傳遞和引用傳遞
當一個變數作為一個引數傳入方法內部的時候,會有兩種不同的傳遞方式:值傳遞和引用傳遞。
值傳遞的特點:不管方法內部對傳進去的引數作任何改變,也不會影響方法外部的變數的值。
引用傳遞的特點:方法內部對傳進去的引數作的改變也會影響方法外部的變數的值。
那麼哪些是值傳遞,哪些是引用傳遞呢?
- 基本型別(8種)的傳遞都是值傳遞。
- 引用型別(除String外)都是引用傳遞。
- Strng比較特殊,它雖然是引用型別,但是卻是值傳遞。
基本型別的取值範圍
在講解基本型別的取值範圍之前,先講講二進位制怎麼轉換為十進位制(算取值範圍的時候會用到)。
首先二進位制有帶符號的二進位制和不帶符號的二進位制。
比如:1111
如果它是不帶符號的二進位制,那麼它的十進位制值 = 2^3 2^2 2^1 2^0 = 2^4 – 1 = 15
如果它是帶符號的二進位制,那麼最高位(千位)就是符號位,1代表負數,0代表正數。那麼負的二進位制怎麼換算為十進位制呢?首先要把除符號位的所有位按位取反再加1(算出來是1001),然後在算它的十進位制值 = -2^0 = -1
Java中基本型別的取值範圍
基本型別 位元組數 位數 最大值 最小值 byte 1byte 8bit 2^7 – 1 -2^7 short 2byte 16bit 2^15 – 1 -2^15 int 4byte 32bit 2^31 – 1 -2^31 long 8byte 64bit 2^63 – 1 -2^63 float 4byte 32bit 3.4028235E38 1.4E – 45 double 8byte 64bit 1.7976931348623157E308 4.9E – 324 char 2byte 16bit 2^16 – 1 0 其實,這些取值範圍不需要死記,可以通過位數計算出來,下面舉兩個例子(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,它們的訪問許可權如下:
包外 子類 包內 本類 public YES YES YES YES protected NO YES YES YES (default) NO NO YES YES private NO NO NO YES 繼承時需要複寫父類的方法的時候,許可權反問修飾符可以往範圍大的變,不可以往範圍小的變。
介面和抽象類的比較
介面 抽象類 功能 實現多繼承 作為直接父類被繼承 成員變數 必須是public static final的常量
(如果不加修飾符,預設是public static final的)沒有要求,和普通類一樣 方法 所有方法都必須是public abstract的
(如果不加修飾符,預設是public abstract)抽象方法和非抽象方法都可以有
一個抽象類並不一定必須存在非抽象方法
抽象方法的訪問許可權沒有要求,和普通類一樣
(但是abstract關鍵字和介面不同必須要加)抽象方法的實現 如果是介面繼承介面,或者是抽象類實現介面,都不需要實現抽象方法 和介面一樣 能不能例項化 不能 不能
写评论
很抱歉,必須登入網站才能發佈留言。