摘要
- package關(guān)鍵字
- 權(quán)限修飾符
- 匿名內(nèi)部類
package關(guān)鍵字的概述及作用
-
A:為什么要有包
- 將字節(jié)碼(.class)進(jìn)行分類存放
- 包其實(shí)就是文件夾
B:包的概述
-
舉例:
學(xué)生:增加,刪除,修改,查詢
老師:增加,刪除,修改,查詢
...方案1:按照功能分 com.heima.add AddStudent AddTeacher com.heima.delete DeleteStudent DeleteTeacher com.heima.update UpdateStudent UpdateTeacher com.heima.find FindStudent FindTeacher 方案2:按照模塊分 com.heima.teacher AddTeacher DeleteTeacher UpdateTeacher FindTeacher com.heima.student AddStudent DeleteStudent UpdateStudent FindStudent
包的定義及注意事項(xiàng)
- A:定義包的格式
- package 包名;
- 多級包用.分開即可
- B:定義包的注意事項(xiàng)
- A:package語句必須是程序的第一條可執(zhí)行的代碼
- B:package語句在一個java文件中只能有一個
- C:如果沒有package,默認(rèn)表示無包名
- C:案例演示
- 包的定義及注意事項(xiàng)
帶包的類編譯和運(yùn)行
- A:如何編譯運(yùn)行帶包的類
- a:javac編譯的時候帶上-d即可
- javac -d . HelloWorld.java
- b:通過java命令執(zhí)行。
- java 包名.HelloWord
- a:javac編譯的時候帶上-d即可
不同包下類之間的訪問
- A:案例演示
- 不同包下類之間的訪問
import關(guān)鍵字的概述和使用
- A:案例演示
- 為什么要有import
- 其實(shí)就是讓有包的類對調(diào)用者可見,不用寫全類名了
- 為什么要有import
- B:導(dǎo)包格式
- import 包名;
- 注意:
- 這種方式導(dǎo)入是到類的名稱。
- 雖然可以最后寫*,但是不建議(即匹配該包中所有的類,當(dāng)匹配上時導(dǎo)入該類)。
- C:package,import,class有沒有順序關(guān)系(面試題)有,從前到后
四種權(quán)限修飾符的測試
-
A:案例演示
- 四種權(quán)限修飾符
-
B:結(jié)論
本類 同一個包下(子類和無關(guān)類) 不同包下(子類) 不同包下(無關(guān)類) private Y 默認(rèn) Y Y protected Y Y Y public Y Y Y Y
類及其組成所使用的常見修飾符
-
A:修飾符:
- 權(quán)限修飾符:private,默認(rèn)修飾符,protected,public
- 狀態(tài)修飾符:static,final
- 抽象修飾符:abstract
-
B:類:
權(quán)限修飾符:默認(rèn)修飾符,public
狀態(tài)修飾符:final
抽象修飾符:abstract
用的最多的就是:public
-
C:成員變量:
權(quán)限修飾符:private,默認(rèn)的,protected,public
狀態(tài)修飾符:static,final
用的最多的就是:private
-
D:構(gòu)造方法:
- 權(quán)限修飾符:private,默認(rèn)的,protected,public
- 靜態(tài)類會將構(gòu)造方法私有
- 用的最多的就是:public
-
E:成員方法:
權(quán)限修飾符:private,默認(rèn)的,protected,public
狀態(tài)修飾符:static,final
抽象修飾符:abstract
用的最多的就是:public
-
F:除此以外的組合規(guī)則:
- 成員變量:public static final
- 成員方法:
- public static
- public abstract
- public final
內(nèi)部類概述和訪問特點(diǎn)
- A:內(nèi)部類概述
- 在類中定義的類
- B:內(nèi)部類訪問特點(diǎn)
- a:內(nèi)部類可以直接訪問外部類的成員,包括私有。
- b:外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對象。
- 外部類名.內(nèi)部類名 對象名 = 外部類對象.內(nèi)部類對象;
- C:案例演示
class Outer{ class Inner{ public void method() { System.out.println("內(nèi)部類"); } } } class Test { public static void main(String[] args) { Outer.Inner oi=new Outer().new Inner();//外部類訪問內(nèi)部類成員,需要創(chuàng)建對象 oi.method(); } }
成員內(nèi)部類私有使用
- private
class Outer{
private class Inner{
public void method() {
System.out.println("內(nèi)部類");
}
}
public void print() { //內(nèi)部類私有時需要通過成員函數(shù)調(diào)用
Inner i=new Inner(); //外部類訪問內(nèi)部類成員,需要創(chuàng)建對象
i.method();
}
}
class Test {
public static void main(String[] args) {
Outer o=new Outer();
o.print();
}
}
靜態(tài)成員內(nèi)部類
- static
- B:成員內(nèi)部類被靜態(tài)修飾后的訪問方式是:
- 外部類名.內(nèi)部類名 對象名 = 外部類名.內(nèi)部類對象;
class Outer{ static class Inner{ public void method() { System.out.println("method"); } public static void print() { System.out.println("print"); } } } class Test { public static void main(String[] args) { Outer.Inner oi=new Outer.Inner();//靜態(tài)內(nèi)部類的調(diào)用方法 oi.method(); Outer.Inner.print(); //靜態(tài)內(nèi)部類中的靜態(tài)函數(shù)的調(diào)用方法 } }
成員內(nèi)部類的面試題
- A:面試題
要求:使用已知的變量,在控制臺輸出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?);
System.out.println(??);
System.out.println(???);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
/*
? num
?? this.num
??? Outer.this.num
*/
局部內(nèi)部類訪問局部變量的問題
- A:案例演示
局部內(nèi)部類訪問局部變量必須用final修飾 (注:jdk1.8中不需要顯式使用final修飾,但是此變量是effectively final的,同樣不可修改)
-
局部內(nèi)部類在訪問他所在方法中的局部變量必須用final修飾,為什么?
因?yàn)楫?dāng)調(diào)用這個方法時,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當(dāng)方法彈棧,這個局部變量也會消失,那么如果局部內(nèi)部類對象還沒有馬上消失想用這個局部變量,就沒有了,如果用final修飾會在類加載的時候進(jìn)入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用但是jdk1.8取消了這個事情,雖然取消,如果在書寫代碼時候,沒有手動添加,系統(tǒng)底層也會默給你final
class Outer {
public void method() {
int num=10; //
class Inner { //局部內(nèi)部類,只能在該方法內(nèi)訪問
public void print() {
System.out.println(num);
}
}
Inner i=new Inner();
i.print();
}
}
class Test {
public static void main(String[] args) {
Outer o=new Outer();
o.method();
}
}
匿名內(nèi)部類的格式和理解
- A:匿名內(nèi)部類
- 就是內(nèi)部類的簡化寫法。
- B:前提:存在一個類或者接口
- 這里的類可以是具體類也可以是抽象類。
- C:格式:
new 類名或者接口名(){ 重寫方法; }- D:本質(zhì)是什么呢?
- 是一個繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對象。
- E:案例演示
- 按照要求來一個匿名內(nèi)部類
interface Inter{
public void print();
}
class Outer {
// class Inner implements Inter{
// public void print() {
// System.out.println("print");
// }
// }
// public void metohd() {
// Inner i=new Inner();
// i.print();
// }
// 以上類和方法可以組合為以下匿名內(nèi)部類
public void method() {
new Inter() { //實(shí)現(xiàn)Inter接口
public void print() { //重寫抽象方法
System.out.println("print");
}
}.print();
}
}
class Test {
public static void main(String[] args) {
Outer o=new Outer();
o.method();
}
}
匿名內(nèi)部類重寫多個方法調(diào)用
- 需要調(diào)用多個方法時每次都要重寫所有方法,過于復(fù)雜,因此只推薦重寫一個方法時使用匿名內(nèi)部類。匿名內(nèi)部類沒有子類類名,不能向下轉(zhuǎn)型。
匿名內(nèi)部類在開發(fā)中的應(yīng)用
-
A:代碼如下
//這里寫抽象類,接口都行 abstract class Person { public abstract void show(); } class PersonDemo { public void method(Person p) { p.show(); } } //創(chuàng)建一個子類繼承抽象類 class Student extends Person{ public void show() { System.out.println("show"); } } class PersonTest { public static void main(String[] args) { //如何調(diào)用PersonDemo中的method方法呢? PersonDemo pd = new PersonDemo (); //通過調(diào)用子類來實(shí)例化 pd.method(new Student()); } } /* 第二種方法:直接在調(diào)用方法時使用匿名內(nèi)部類 pd.method(new Person() { public void show() { System.out.println("show"); } });
匿名內(nèi)部類的面試題
-
A:面試題
//按照要求,補(bǔ)齊代碼 interface Inter { void show(); } class Outer { //補(bǔ)齊代碼 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } //要求在控制臺輸出”HelloWorld”interface Inter { void show(); } class Outer { //補(bǔ)齊代碼 public static Inter method() { return new Inter() { public void show() { System.out.println("hello world"); } }; } } class Test { public static void main(String[] args) { Outer.method().show(); //鏈?zhǔn)骄幊?,調(diào)用方法后還能調(diào)用方法,說明返回的是對象 } }