1顿乒、public class 和 class的區(qū)別
- 一個java源文件當(dāng)中可以定義多個class
- 一個java源文件當(dāng)中public的class不是必須的
- 一個class會定義生成一個xxx.class字節(jié)碼文件
- 一個java源文件當(dāng)中public class只能有一個茂卦,并且該類名稱必須和java源文件名稱一致酸纲。
- 每一個class當(dāng)中都可以編寫main方法,都可以設(shè)定程序的入口漫贞,想執(zhí)行X.class當(dāng)中的main方法:java X
2甸箱、java內(nèi)存管理
- 方法區(qū)內(nèi)存:在類加載的時候,class字節(jié)碼代碼片段被加載到該內(nèi)存空間當(dāng)中
- 棧內(nèi)存(局部變量):方法代碼片段執(zhí)行的時候迅脐,會給該方法分配內(nèi)存空間芍殖,在棧內(nèi)存中壓棧
-
堆內(nèi)存:new的對象在堆內(nèi)存中存儲
3、形參引用傳值
java形參接收的都是實參中保存的值谴蔑,
只不過基礎(chǔ)類型例如int豌骏、char等變量都是直接保存的值本身龟梦,而引用變量保存的是對象的內(nèi)存地址。
- 傳遞基本數(shù)據(jù)類型:
void add(x){
x++;
System.out.println(x); //11
}
int x = 10;
add(x);
System.out.println(x); //10
- 傳遞引用:
void add(User u){
u.age++;
System.out.println(u.age); //11
}
User u = new User(10);
add(u); //這里的u保存的是user對象的內(nèi)存地址窃躲,原封不動的將地址傳給add中的u
System.out.println(u.age); //11
4计贰、this特殊用法
- this在static中不能使用
- this可以簡化無參構(gòu)造函數(shù)的默認賦值(這種語法只能出現(xiàn)在構(gòu)造函數(shù)第一行)
//帶參構(gòu)造函數(shù)
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public Date(){
/*this.year = 1997;
this.month = 1;
this.day = 1;*/
//通過這種方式不會創(chuàng)建新的對象,同時又可以調(diào)用其他的構(gòu)造函數(shù)
this(1970,1,1);
}
5蒂窒、靜態(tài)代碼塊
- 語法格式:
static{
java語句;
}
- 靜態(tài)代碼塊在類加載時執(zhí)行躁倒,且只執(zhí)行一次
- 靜態(tài)代碼塊在一個類中可以編寫多個,且遵循自上而下的順序依次執(zhí)行(在main方法之前執(zhí)行)
-
靜態(tài)代碼塊的作用:
如果需要在類加載時刻執(zhí)行一段特殊的代碼(例如日志記錄)洒琢,可以使用靜態(tài)代碼塊
6秧秉、繼承
- 三大特征:封裝、繼承衰抑、多態(tài)
- 繼承的基本作用:代碼復(fù)用象迎,有了繼承才有了“方法的覆蓋”和“多態(tài)機制”
- java中的類與類之間只支持單繼承
- java中子類繼承父類的哪些數(shù)據(jù)?
私有的不繼承呛踊、構(gòu)造方法不繼承砾淌,其他數(shù)據(jù)都可以被繼承 - java中的類默認繼承JavaSE庫中的Object類
7、方法覆蓋跟重載
- 重載:相同函數(shù)名恋技,不同參數(shù)列表拇舀,不關(guān)心返回值
- 覆蓋:子類中重新定義的函數(shù)逻族,其函數(shù)名蜻底、參數(shù)列表、返回類型與父類完全相同
- 覆蓋訪問權(quán)限只能更高不能更低
- 覆蓋拋出異常只能更少不能更多
- 私有方法聘鳞、構(gòu)造方法薄辅、靜態(tài)方法不能覆蓋
8、多態(tài)
①基礎(chǔ)語法
Animal a = new Dog(); //定義一個指向Dog對象的Animal類型的引用a抠璃,最后a調(diào)用的方法都是Dog類的方法站楚,因為對象實體是Dog,Animal只是a的引用類型
②向上搏嗡、向下轉(zhuǎn)型:
- 向上轉(zhuǎn)型:Animal a = new Dog();
- 向下轉(zhuǎn)型(強制類型轉(zhuǎn)換):當(dāng)調(diào)用的方法或者訪問的屬性是子類中特有的窿春,在父類中不存在必須要向下轉(zhuǎn)型。Animal a = new Dog(); -----> Dog b = (Dog) a;
③避免強制類型轉(zhuǎn)換(向下轉(zhuǎn)型)異常:(ClassCastException)
instanceof運算符
- 語法格式:引用 instanceof 類名
- 運行結(jié)果:
假設(shè):a instanceof Animal
true表示:a引用指向的對象是一個Animal類型
④實際使用示例:
//-----------------父類------------------
public class Animal {
void eat(){
System.out.println("我在進食");
}
}
//-----------------子類------------------
public class Bird extends Animal{
void eat(){
System.out.println("我在吃蟲子");
}
}
public class Dog extends Animal{
void eat(){
System.out.println("我在吃骨頭");
}
}
public class Cat extends Animal {
void eat(){
System.out.println("我在吃魚");
}
}
//-----------------主人類:要調(diào)用寵物的eat方法-----------------
public class Master {
//傳入Animal父類采盒,而非具體的子類避免高耦合
public void feed(Animal a) {
a.eat();
}
}
//-----------------main方法所在的類-----------------
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
Animal b = new Cat();
Animal c = new Bird();
Master m = new Master();
m.feed(a);
m.feed(b);
m.feed(c);
}
}
9旧乞、final關(guān)鍵字
①final修飾的類無法被繼承
②final修飾的方法無法被覆蓋
③final修飾的變量一旦賦值之后不可重新賦值【不可二次賦值】
④final修飾的實例變量必須手動賦值,不能采用系統(tǒng)默認值
⑤final修飾的引用一旦指向某個對象之后磅氨,不能再指向其他對象尺栖,那么被指向的對象無法被垃圾回收器回收【但是對象內(nèi)部的內(nèi)存可以被修改】
⑥java常量:public static final double PI = 3.1415926
10、package烦租、import
①包的作用:方便程序管理延赌,易查找除盏、易維護
②包的命名規(guī)范:公司域名倒序 + 項目名 + 模塊名 + 功能名 (公司域名具有全球唯一性,不容易重名)
③import語法:
import 類名; 例如:import java.util.Date;
import 包名.*; 例如:import java.util.*;
④java.lang.*; 不需要手動引入挫以,系統(tǒng)自動引入
11者蠕、訪問控制權(quán)限修飾符
①權(quán)限
public 表示公開的,任何位置都能訪問
protected 同包掐松、子類中可以訪問
缺省 同包中可以訪問
private 表示私有的蠢棱,只能在本類中訪問
②修飾符的范圍:private < 缺省 < protected < public
③只希望子類使用的時候使用protected
12、super
①super跟this很類似甩栈,this是指本類泻仙,super是指父類
②this()調(diào)用的是本類的構(gòu)造函數(shù),super()調(diào)用的是父類的構(gòu)造函數(shù)
③super量没、this都不能在靜態(tài)方法中使用玉转,都可以出現(xiàn)在實例方法和構(gòu)造方法中
④當(dāng)一個構(gòu)造方法第一行:
既沒有this()又沒有super()時,默認會有一個super();
表示通過當(dāng)前子類的構(gòu)造方法調(diào)用父類的無參數(shù)構(gòu)造方法殴蹄,所以必須保證父類的無參數(shù)構(gòu)造方法是存在的究抓。
⑤子類構(gòu)造方法執(zhí)行時必然調(diào)用父類的構(gòu)造方法
⑥不管new什么對象,Object類的無參構(gòu)造函數(shù)一定會執(zhí)行(且Object類的無參構(gòu)造函數(shù)一定是處于棧頂)
⑦super不能省略的情況:
如果父類和子類有同名屬性袭灯,并且想通過子類訪問父類的該屬性刺下,則不能省略
⑧super不是引用,不保存內(nèi)存地址稽荧,也不指向任何對象
13橘茉、抽象類
①類與類之間具有共同特征,將這些共同特征提取出來姨丈,形成的就是抽象類畅卓;
②抽象類無法創(chuàng)建對象(無法實例化),抽象類是用來被繼承的蟋恬;
③抽象類的子類也可以是抽象類翁潘;
④抽象類屬于引用數(shù)據(jù)類型;
⑤抽象類有構(gòu)造方法歼争,供子類使用拜马;
⑥抽象方法表示沒有實現(xiàn)的方法,沒有方法體的方法沐绒;
例:public abstract void doSome();
⑦抽象類中不一定有抽象方法俩莽,但是抽象方法一定出現(xiàn)在抽象類中;
⑧非抽象類繼承抽象類必須實現(xiàn)其抽象方法洒沦;
⑨沒有方法體的方法不一定都是抽象方法豹绪,例:
public native int hashCode(); native表示調(diào)用JVM本地程序。
14、接口 interface
①接口是完全抽象的瞒津,是一種特殊的抽象類蝉衣,所以也無法創(chuàng)建對象;
②接口支持多繼承:interface C extends A, B巷蚪;
③接口中只包含兩部分內(nèi)容:常量+抽象方法病毡;
④接口中所有元素都是public修飾的;
⑤接口中的抽象方法:public abstract 修飾符可以省略屁柏;
⑥接口中的常量:public static final 可以省略啦膜;
⑦繼承extends、實現(xiàn)implements淌喻;
⑧一個類可以同時實現(xiàn)多個接口: class Test implements A, B僧家;
⑨繼承和實現(xiàn)都存在時,extends在前裸删,implements在后;
⑩抽象類根接口的區(qū)別:
- 抽象類是半抽象的八拱,接口是完全抽象的
- 抽象類有構(gòu)造方法,接口沒有
- 接口和接口之間支持多繼承涯塔,類和類之間只能單繼承
- 接口中只允許出現(xiàn)常量和抽象方法
15肌稻、經(jīng)典異常
空指針異常:NullPointerException
類型轉(zhuǎn)換異常:ClassCastException
數(shù)組下標(biāo)越界異常:ArrayIndexOutOfBoundsException
數(shù)字格式化異常:NumberFormatException
16、可變長度參數(shù)
- 可變長度參數(shù)要求的參數(shù)個數(shù):0~N個匕荸;
- 可變長度參數(shù)必須在參數(shù)列表中的最后一個位置上爹谭,而且可變長度參數(shù)只能有一個;
- 可變長度參數(shù)在接受的時候可以當(dāng)做數(shù)組處理
- 實參傳入的時候可以直接傳數(shù)組
public static void test1(int... args){
System.out.println(args.length);
for(int i : args){
System.out.println(i);
}
}
public static void test2(int i, String... strs){
for(String s : strs){
System.out.println(s);
}
}
test1(1,2,3);
test2(1, new String[]{"wo", "shi"});