package關(guān)鍵字的概述及作用
- A:為什么要有包
- 將字節(jié)碼(.class)進(jìn)行分類(lèi)存放
- 包其實(shí)就是文件夾
- B:包的概述
- 舉例:
學(xué)生:增加鸠按,刪除礼搁,修改,查詢(xún)
老師:增加目尖,刪除馒吴,修改,查詢(xún)
方案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 包名;
- 多級(jí)包用.分開(kāi)即可
- B:定義包的注意事項(xiàng)
- A:package語(yǔ)句必須是程序的第一條可執(zhí)行的代碼
- B:package語(yǔ)句在一個(gè)java文件中只能有一個(gè)
- C:如果沒(méi)有package瑟曲,默認(rèn)表示無(wú)包名
帶包的類(lèi)編譯和運(yùn)行
- A:如何編譯運(yùn)行帶包的類(lèi)
- a:javac編譯的時(shí)候帶上-d即可
- javac -d . HelloWorld.java
- b:通過(guò)java命令執(zhí)行饮戳。
- java 包名.HelloWord
- a:javac編譯的時(shí)候帶上-d即可
import關(guān)鍵字的概述和使用
- A:案例演示
- 為什么要有import
- 其實(shí)就是讓有包的類(lèi)對(duì)調(diào)用者可見(jiàn),不用寫(xiě)全類(lèi)名了
- 為什么要有import
- B:導(dǎo)包格式
- import 包名;
- 注意:
- 這種方式導(dǎo)入是到類(lèi)的名稱(chēng)。
- 雖然可以最后寫(xiě)*测蹲,但是不建議莹捡。
- C:package,import,class有沒(méi)有順序關(guān)系(面試題)
- package第一句,import中間,class最后
四種權(quán)限修飾符的測(cè)試
- A:案例演示
- 四種權(quán)限修飾符
- B:結(jié)論
本類(lèi) 同一個(gè)包下(子類(lèi)和無(wú)關(guān)類(lèi)) 不同包下(子類(lèi)) 不同包下(無(wú)關(guān)類(lèi))
private Y
默認(rèn) Y Y
protected Y Y Y
public Y Y Y Y
類(lèi)及其組成所使用的常見(jiàn)修飾符
-
A:修飾符:
- 權(quán)限修飾符:private扣甲,默認(rèn)的篮赢,protected齿椅,public
- 狀態(tài)修飾符:static,final
- 抽象修飾符:abstract
-
B:類(lèi):
權(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
用的最多的就是: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)部類(lèi)概述和訪問(wèn)特點(diǎn)
A:內(nèi)部類(lèi)概述
- B:內(nèi)部類(lèi)訪問(wèn)特點(diǎn)
- a:內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的成員急但,包括私有澎媒。
- b:外部類(lèi)要訪問(wèn)內(nèi)部類(lèi)的成員波桩,必須創(chuàng)建對(duì)象。
- 外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi)對(duì)象.內(nèi)部類(lèi)對(duì)象
class Demo1_InnerClass {
public static void main(String[] args) {
//Inner i = new Inner();
//i.method();
Outer.Inner oi = new Outer().new Inner(); //創(chuàng)建內(nèi)部類(lèi)對(duì)象
oi.method();
}
}
class Outer {
class Inner {
public void method() {
System.out.println("Hello World突委!");
}
}
}
class Demo1_InnerClass {
public static void main(String[] args) {
//Inner i = new Inner();
//i.method();
//Outer.Inner oi = new Outer().new Inner(); //創(chuàng)建內(nèi)部類(lèi)對(duì)象
//oi.method();
Outer o = new Outer();
o.print();
}
}
class Outer {
private int num = 10;
private class Inner {
public void method() {
System.out.println(num);
}
}
public void print() {
Inner i = new Inner();
i.method();
}
}
靜態(tài)成員內(nèi)部類(lèi)
- static
- B:成員內(nèi)部類(lèi)被靜態(tài)修飾后的訪問(wèn)方式是:
- 外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi)名.內(nèi)部類(lèi)對(duì)象;
class Demo1_InnerClass {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner();
oi.method();
Outer.Inner2.print();
}
}
class Outer {
static class Inner {
public void method() {
System.out.println("method");
}
}
static class Inner2 {
public static void print() {
System.out.println("print");
}
}
}
class Test_Innerclass {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
//要求:使用已知的變量柏卤,在控制臺(tái)輸出30,20匀油,10。
//內(nèi)部類(lèi)之所以能獲得到外部類(lèi)的成員桥滨,是因?yàn)樗塬@取到外部類(lèi)的引用 外部類(lèi)名.this
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量的問(wèn)題
- A:案例演示
局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量必須用final修飾(匿名內(nèi)部類(lèi)也是一樣的弛车,因?yàn)槟涿麅?nèi)部類(lèi)是局部?jī)?nèi)部類(lèi)的一種(這句話存在爭(zhēng)議))
-
局部?jī)?nèi)部類(lèi)在訪問(wèn)他所在方法中的局部變量必須用final修飾,為什么?
因?yàn)楫?dāng)調(diào)用這個(gè)方法時(shí),局部變量如果沒(méi)有用final修飾,他的生命周期和方法的生命周期是一樣的,當(dāng)方法彈棧,這個(gè)局部變量也會(huì)消失,那么如果局部?jī)?nèi)部類(lèi)對(duì)象還沒(méi)有馬上消失想用這個(gè)局部變量,就沒(méi)有了,如果用final修飾會(huì)在類(lèi)加載的時(shí)候進(jìn)入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用但是jdk1.8取消了這個(gè)事情,所以我認(rèn)為這是個(gè)bug,雖然取消,如果在書(shū)寫(xiě)代碼時(shí)候,沒(méi)有手動(dòng)添加,系統(tǒng)底層也會(huì)默給你final
class Demo1_InnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
//局部?jī)?nèi)部類(lèi)
class Outer {
public void method() {
final int num = 10;
class Inner {
public void print() {
System.out.println("num");
}
}
Inner i = new Inner();
i.print();
}
/*public void run() {
Inner i = new Inner(); //局部?jī)?nèi)部類(lèi),只能在其所在的方法中訪問(wèn)
i.print();
}*/
}
匿名內(nèi)部類(lèi)的格式和理解
A:匿名內(nèi)部類(lèi)
* 就是內(nèi)部類(lèi)的簡(jiǎn)化寫(xiě)法喻括。
- B:前提:存在一個(gè)類(lèi)或者接口
- 這里的類(lèi)可以是具體類(lèi)也可以是抽象類(lèi)贫奠。
- C:格式:
new 類(lèi)名或者接口名(){
重寫(xiě)方法;
}
- D:本質(zhì)是什么呢?
- 是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)匿名對(duì)象望蜡。
- E:案例演示
- 按照要求來(lái)一個(gè)匿名內(nèi)部類(lèi)
class Demo1_NoNameInnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
interface Inter {
public void print();
}
class Outer {
/*class Inner implements Inter {
public void print() {
System.out.println("print");
}
}*/
public void method() {
//Inner i = new Inner();
//i.print();
new Inter() { //實(shí)現(xiàn)Inter接口
public void print() { //重寫(xiě)抽象方法
System.out.println("print");
}
}.print();
}
}
匿名內(nèi)部類(lèi)重寫(xiě)多個(gè)方法調(diào)用
class Demo2_NoNameInnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
//匿名內(nèi)部類(lèi)只針對(duì)重寫(xiě)一個(gè)方法時(shí)候使用
interface Inter {
public void show1();
public void show2();
}
class Outer {
public void method() {
/*new Inter(){
public void show1() {
System.out.println("show1");
}
public void show2() {
System.out.println("show2");
}
}.show1();
new Inter(){
public void show1() {
System.out.println("show1");
}
public void show2() {
System.out.println("show2");
}
}.show2();*/
Inter i = new Inter(){
public void show1() {
System.out.println("show1");
}
public void show2() {
System.out.println("show2");
}
public void show3() {
System.out.println("show3");
}
};//父類(lèi)引用指向子類(lèi)對(duì)象拷恨,不能調(diào)用子類(lèi)特有方法,這里是show3()
i.show1();
i.show2();
//i.show3(); //匿名內(nèi)部類(lèi)是不能向下轉(zhuǎn)型的小泉,因?yàn)闆](méi)有子類(lèi)類(lèi)名
}
}
匿名內(nèi)部類(lèi)在開(kāi)發(fā)中的應(yīng)用
class Test1_NoNameInnerClass {
public static void main(String[] args) {
//如何調(diào)用PersonDemo中的method方法冕杠?
PersonDemo pd = new PersonDemo();
//pd.method(new Student()); //1,通過(guò)繼承實(shí)現(xiàn)
pd.method(new Person(){
public void show() {
System.out.println("show");
}
}); //2,匿名內(nèi)部類(lèi)當(dāng)作參數(shù)傳遞(本質(zhì)把匿名內(nèi)部類(lèi)看作一個(gè)子類(lèi)對(duì)象)
}
}
//這里寫(xiě)抽象類(lèi),接口都行
abstract class Person {
public abstract void show();
}
/*
可以這樣理解
一個(gè)沒(méi)有創(chuàng)建的子類(lèi) 一個(gè)沒(méi)有創(chuàng)建的變量 = new Person(){ //父類(lèi)引用指向子類(lèi)對(duì)象
public void show() { //重寫(xiě)了抽象方法
System.out.println("show");
}
});
*/
class PersonDemo {
public void method(Person p) {
p.show();
}
}
class Student extends Person {
public void show() {
System.out.println("show");
}
}
匿名內(nèi)部類(lèi)的面試題
class Test2_NoNameInnerClass {
public static void main(String[] args) {
Outer.method().show(); //鏈?zhǔn)骄幊谭衷ぃ看握{(diào)用方法后還能繼續(xù)調(diào)用方法,證明返回的是對(duì)象
}
}
//按照要求,補(bǔ)齊代碼
interface Inter {
void show();
}
class Outer {
//補(bǔ)齊代碼
public static Inter method() {
return new Inter() {
public void show() {
System.out.println("HelloWorld");
}
};
}
}
//要求在控制臺(tái)輸出"HelloWorld"