Java 數據類型 基本數據類型 數值:int、short、long 字元:char 布爾:boolean 引用數據類型 class(類) interface(介面) 數組[] 所占位元組數 ( ) int:4位元組 char: 規定2位元組。若使用UTF 8編碼,數字和英文等占1個位元組,中文3個位元組;若 ...
Java 數據類型
基本數據類型
- 數值:int、short、long
- 字元:char
布爾:boolean
引用數據類型
- class(類)
- interface(介面)
數組[]
所占位元組數(
1 byte= 8 bits
)- int:4位元組
- char: 規定2位元組。若使用UTF-8編碼,數字和英文等占1個位元組,中文3個位元組;若用GBK編碼,中文是2個位元組
- float:4位元組
- short:2位元組
- long:8位元組
double:8位元組
註意:Java中整數預設的是Int,小數預設double
float f = 2.3; // 2.3預設為double,不能轉為float,可能丟失精度
float f = 2.3f; // true 末尾加f,表示這是一個float型
long l = 12343565475989778034; // false, 預設為int,但是超出了範圍
long l = 12343565475989778034l; // 末尾加l,表示這是long型
但是如下代碼第一行是正確的。
byte b = 4; // 預設int,但經過檢查4是在byte型範圍內的,發生int -> byte的隱式強轉
b = b + 3; // false,和為int,int型不能賦值給byte
// aa和bb都是變數,其和不能確定是否在範圍內
byte aa = 3;
byte bb = 4;
byte cc = aa + bb; // false
byte cc = 3 + 4; // 但若明確給出常量,則true
- 變數(局部)僅在一對
{}
內有效,然後被銷毀。局部代碼塊,可以決定局部變數的生命周期。
{
int a = 3;
}
System.out.println(a); // false, 已經出了這對{},被銷毀了
- switch語句
// 若不加break,從匹配到的那個case開始,之後如果都沒break,都執行,不會跳出
switch (expression) {
case x:
code;
break;
case y:
code;
break;
default:
code;
break
}
函數重載和重寫(覆寫@Override)
- 函數重載
- 同一個類中
- 同名
- 參數不同,或者類型不同
- 函數重載和返回類型無關!
- 函數覆寫(@Override)
- 繼承了父類或者實現了藉口,有事需要Override父類的方法,定義子類特有的方法。
- 返回類型,參數列表,函數名都一致。修飾符一般也一致,總的來說,除了內部實現全部一樣。
數組--引用類型
- 數組的定義
int[] a = {1, 23, 3};
int[] b = new int[4]; // 此種定義方式必須指定數組長度
int[] c = new int[]{1, 2, 3}; // 一般不這麼寫
- 二維數組
int[][] arr2= new int[3][]; // 至少給第一維指定長度
// 每行的列數相同,3行2列
int[][] = arr2 = new int[3][2];
// 每行列數不一樣
int[][] arr2= new int[3][];
arr2[0] = new int[2]; // 第1行
arr2[1] = new int[3]; // 第2行
arr2[2] = new int[4]; // 第3行
棧記憶體和堆記憶體
- 棧記憶體:存儲的是局部對象,作用域結束就被釋放
- 堆記憶體:存儲的是數組和對象,凡是new建立的都在堆記憶體中
int[] arr = new int[3];
// 這句右邊new一個引用數據到堆記憶體,給三個值預設初始化為0
// a指向這個數組對象,即地址。也可以說new出來的數組把它的地址給了arr
// arr = null; 表示空,不綁定地址了
int[] a = new int[3];
int[] b = new int[5];
a = b; // 把b的地址綁定到a,a和b都指向b的地址了
System.out.println(arr); // 列印的是地址,格式為"[I@number",表示int,number為16進位表示的地址
訪問修飾符
- public:任何類任何包都可以訪問
- private:僅限於當前類中訪問
- default(什麼修飾符都不寫,預設):同一個包的都可以訪問,不同包的子類也不能訪問
- protected:同一個包,不同包只有子類可訪問。(範圍比default大一點)
public static void main(String args[])
這是固定格式!
為什麼必須這樣寫?
- public:外界(JVM)調用main()函數,為了方便訪問,設為最高許可權
static:靜態函數,非類成員函數,無需new新對象就可通過
類名.main()
直接調用。- void:main()函數就是執行任務,不需要返回什麼值。
- main():JVM識別main()字樣,當滿足
public static void main(String args[])
這樣的寫法時,則把其當成程式的入口開始執行。 String args[]:命令行參數,規定必須要有
public static void abc(String args[]) // 函數名不是main,不是主函數
public static void main() // 缺少命令行參數 String args[]也不是主函數
static void abc(String args[]) // 不是主函數,一定要是public static void main(String args[])
靜態static
靜態函數
靜態函數一般作為工具函數,裡面不可以用類成員,只能全用靜態成員或者方法,但是成員函數卻可以用靜態數據和方法。
靜態變數
static int money
這樣就是一個靜態數據了。可以被很多對象共用,對象A改變了a,對象B中的a也改變了。大家用同一份money。
package Test;
public class StaticDemo {
private static int money = 100;
public int getMonney() {
return money;
}
public void useMoney() {
money--;
}
public static void main(String[] args) {
StaticDemo a = new StaticDemo();
StaticDemo b = new StaticDemo();
// a用了一塊
a.useMoney();
// 還剩99
System.out.println(a.getMonney());
// b用的是同一份money
b.useMoney();
// 還剩98
System.out.println(b.getMonney());
}
}
- 成員變數和靜態變數
- 成員變數隨對象的建立而建立,隨對象消亡而消亡。< -- > 靜態變數隨著類(和對象即實例區別開)的載入而載入,隨類的消亡而消亡。即靜態成員是先於實例存在的,還沒new出對象就存在了。
- 成員對象只能是new出新實例後調用。< -- > 靜態成員可以直接使用,
類名.靜態變數
即可。 - 成員變數被稱為實例變數。< -- > 靜態變數被稱為類 變數。
- 成員變數位於堆記憶體的對象中,是對象的特有數據。 < -- > 靜態變數位於方法區(的靜態區)中,也叫對象的共用數據。
Q:static為何不能調用非靜態方法或者數據?
A:因為靜態數據先於對象就已經產生,成員變數還不存在,不能訪問。同理static函數中不能出現this、super
關鍵字。
Q: 什麼時候用static?
A:1. 靜態變數,共用數據時,各個對象都使用同一個數據,不必作為對象特有的數據時候。如每個學生的姓名是特有的,但是每個學生可以共用同一個圖書館。
- 靜態方法,無需訪問類成員時(非靜態),就可以定義為靜態,一般為工具函數。
各種代碼塊
public class Abc {
// 構造代碼塊,沒有static。每new一個對象,就執行一次,故稱為構造代碼塊
// 針對不同的對象,進行相同的初始化,而構造函數對不同的對象進行不同的初始化,如給不同的人傳入不同的名字和年齡進行初始化
{
System.out.println("我是構造代碼塊")
}
// 構造函數
Abc() {
System.out.pritnln("我是構造函數,後於構造代碼塊執行");
}
// 靜態代碼塊最先執行,不論放在main()前面還是後面,都先於main載入,且只執行一次
static {
System.out.println("我最先");
}
public static void main(String args[]) {
Abc a = new Abc(); // 先進入先構造代碼塊,
// 以下是局部代碼塊,b只在這對{}內有效
{
int b = 3;
}
System.out.println(b); // false,b已經被釋放
}
}
!!!總的來說,執行順序:static代碼塊 --> main() --> 構造代碼塊 --> 構造方法
by @sunhaiyu
2016.12.8