Java 數(shù)據(jù)類型
-
基本數(shù)據(jù)類型
- 數(shù)值:int凿叠、short涩笤、long
- 字符:char
- 布爾:boolean
-
引用數(shù)據(jù)類型
- class(類)
- interface(接口)
- 數(shù)組[]
-
所占字節(jié)數(shù)(
1 byte= 8 bits
)- int:4字節(jié)
- char: 規(guī)定2字節(jié)。若使用UTF-8編碼盒件,數(shù)字和英文等占1個(gè)字節(jié)蹬碧,中文3個(gè)字節(jié);若用GBK編碼炒刁,中文是2個(gè)字節(jié)
- float:4字節(jié)
- short:2字節(jié)
- long:8字節(jié)
- double:8字節(jié)
注意:Java中整數(shù)默認(rèn)的是Int恩沽,小數(shù)默認(rèn)double
float f = 2.3; // 2.3默認(rèn)為double,不能轉(zhuǎn)為float翔始,可能丟失精度
float f = 2.3f; // true 末尾加f罗心,表示這是一個(gè)float型
long l = 12343565475989778034; // false, 默認(rèn)為int,但是超出了范圍
long l = 12343565475989778034l; // 末尾加l绽昏,表示這是long型
但是如下代碼第一行是正確的协屡。
byte b = 4; // 默認(rèn)int,但經(jīng)過檢查4是在byte型范圍內(nèi)的全谤,發(fā)生int -> byte的隱式強(qiáng)轉(zhuǎn)
b = b + 3; // false肤晓,和為int,int型不能賦值給byte
// aa和bb都是變量认然,其和不能確定是否在范圍內(nèi)
byte aa = 3;
byte bb = 4;
byte cc = aa + bb; // false
byte cc = 3 + 4; // 但若明確給出常量补憾,則true
- 變量(局部)僅在一對
{}
內(nèi)有效,然后被銷毀卷员。局部代碼塊盈匾,可以決定局部變量的生命周期。
{
int a = 3;
}
System.out.println(a); // false, 已經(jīng)出了這對{}毕骡,被銷毀了
- switch語句
// 若不加break削饵,從匹配到的那個(gè)case開始,之后如果都沒break未巫,都執(zhí)行窿撬,不會跳出
switch (expression) {
case x:
code;
break;
case y:
code;
break;
default:
code;
break
}
函數(shù)重載和重寫(覆寫@Override)
- 函數(shù)重載
- 同一個(gè)類中
- 同名
- 參數(shù)不同,或者類型不同
- 函數(shù)重載和返回類型無關(guān)叙凡!
- 函數(shù)覆寫(@Override)
- 繼承了父類或者實(shí)現(xiàn)了借口劈伴,有事需要Override父類的方法,定義子類特有的方法握爷。
- 返回類型跛璧,參數(shù)列表严里,函數(shù)名都一致。修飾符一般也一致追城,總的來說刹碾,除了內(nèi)部實(shí)現(xiàn)全部一樣。
數(shù)組--引用類型
- 數(shù)組的定義
int[] a = {1, 23, 3};
int[] b = new int[4]; // 此種定義方式必須指定數(shù)組長度
int[] c = new int[]{1, 2, 3}; // 一般不這么寫
- 二維數(shù)組
int[][] arr2= new int[3][]; // 至少給第一維指定長度
// 每行的列數(shù)相同,3行2列
int[][] = arr2 = new int[3][2];
// 每行列數(shù)不一樣
int[][] arr2= new int[3][];
arr2[0] = new int[2]; // 第1行
arr2[1] = new int[3]; // 第2行
arr2[2] = new int[4]; // 第3行
棧內(nèi)存和堆內(nèi)存
- 棧內(nèi)存:存儲的是局部對象漓柑,作用域結(jié)束就被釋放
- 堆內(nèi)存:存儲的是數(shù)組和對象教硫,凡是new建立的都在堆內(nèi)存中
int[] arr = new int[3];
// 這句右邊new一個(gè)引用數(shù)據(jù)到堆內(nèi)存,給三個(gè)值默認(rèn)初始化為0
// a指向這個(gè)數(shù)組對象辆布,即地址。也可以說new出來的數(shù)組把它的地址給了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進(jìn)制表示的地址
訪問修飾符
- public:任何類任何包都可以訪問
- private:僅限于當(dāng)前類中訪問
- default(什么修飾符都不寫惭蹂,默認(rèn)):同一個(gè)包的都可以訪問,不同包的子類也不能訪問
- protected:同一個(gè)包割粮,不同包只有子類可訪問盾碗。(范圍比default大一點(diǎn))
public static void main(String args[])
這是固定格式!
為什么必須這樣寫舀瓢?
public:外界(JVM)調(diào)用main()函數(shù)廷雅,為了方便訪問,設(shè)為最高權(quán)限
static:靜態(tài)函數(shù)京髓,非類成員函數(shù)航缀,無需new新對象就可通過
類名.main()
直接調(diào)用。void:main()函數(shù)就是執(zhí)行任務(wù)堰怨,不需要返回什么值芥玉。
main():JVM識別main()字樣,當(dāng)滿足
public static void main(String args[])
這樣的寫法時(shí)备图,則把其當(dāng)成程序的入口開始執(zhí)行灿巧。String args[]:命令行參數(shù),規(guī)定必須要有
public static void abc(String args[]) // 函數(shù)名不是main揽涮,不是主函數(shù)
public static void main() // 缺少命令行參數(shù) String args[]也不是主函數(shù)
static void abc(String args[]) // 不是主函數(shù)抠藕,一定要是public static void main(String args[])
靜態(tài)static
靜態(tài)函數(shù)
靜態(tài)函數(shù)一般作為工具函數(shù),里面不可以用類成員绞吁,只能全用靜態(tài)成員或者方法幢痘,但是成員函數(shù)卻可以用靜態(tài)數(shù)據(jù)和方法。
靜態(tài)變量
static int money
這樣就是一個(gè)靜態(tài)數(shù)據(jù)了家破⊙账担可以被很多對象共享购岗,對象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());
}
}
- 成員變量和靜態(tài)變量
- 成員變量隨對象的建立而建立,隨對象消亡而消亡玄妈。< -- > 靜態(tài)變量隨著類(和對象即實(shí)例區(qū)別開)的加載而加載乾吻,隨類的消亡而消亡。即靜態(tài)成員是先于實(shí)例存在的拟蜻,還沒new出對象就存在了绎签。
- 成員對象只能是new出新實(shí)例后調(diào)用。< -- > 靜態(tài)成員可以直接使用酝锅,
類名.靜態(tài)變量
即可诡必。 - 成員變量被稱為實(shí)例變量。< -- > 靜態(tài)變量被稱為類 變量搔扁。
- 成員變量位于堆內(nèi)存的對象中爸舒,是對象的特有數(shù)據(jù)。 < -- > 靜態(tài)變量位于方法區(qū)(的靜態(tài)區(qū))中稿蹲,也叫對象的共享數(shù)據(jù)扭勉。
Q:static為何不能調(diào)用非靜態(tài)方法或者數(shù)據(jù)?
A:因?yàn)殪o態(tài)數(shù)據(jù)先于對象就已經(jīng)產(chǎn)生苛聘,成員變量還不存在涂炎,不能訪問。同理static函數(shù)中不能出現(xiàn)this焰盗、super
關(guān)鍵字璧尸。
Q: 什么時(shí)候用static?
A:1. 靜態(tài)變量熬拒,共享數(shù)據(jù)時(shí)爷光,各個(gè)對象都使用同一個(gè)數(shù)據(jù),不必作為對象特有的數(shù)據(jù)時(shí)候澎粟。如每個(gè)學(xué)生的姓名是特有的蛀序,但是每個(gè)學(xué)生可以共用同一個(gè)圖書館。
- 靜態(tài)方法活烙,無需訪問類成員時(shí)(非靜態(tài))徐裸,就可以定義為靜態(tài),一般為工具函數(shù)啸盏。
各種代碼塊
public class Abc {
// 構(gòu)造代碼塊重贺,沒有static。每new一個(gè)對象,就執(zhí)行一次气笙,故稱為構(gòu)造代碼塊
// 針對不同的對象次企,進(jìn)行相同的初始化,而構(gòu)造函數(shù)對不同的對象進(jìn)行不同的初始化潜圃,如給不同的人傳入不同的名字和年齡進(jìn)行初始化
{
System.out.println("我是構(gòu)造代碼塊")
}
// 構(gòu)造函數(shù)
Abc() {
System.out.pritnln("我是構(gòu)造函數(shù)缸棵,后于構(gòu)造代碼塊執(zhí)行");
}
// 靜態(tài)代碼塊最先執(zhí)行谭期,不論放在main()前面還是后面堵第,都先于main加載,且只執(zhí)行一次
static {
System.out.println("我最先");
}
public static void main(String args[]) {
Abc a = new Abc(); // 先進(jìn)入先構(gòu)造代碼塊隧出,
// 以下是局部代碼塊踏志,b只在這對{}內(nèi)有效
{
int b = 3;
}
System.out.println(b); // false,b已經(jīng)被釋放
}
}
U偷伞U帷!總的來說赏廓,執(zhí)行順序:static代碼塊 --> main() --> 構(gòu)造代碼塊 --> 構(gòu)造方法
by @sunhaiyu
2016.12.8