package
package就是文件夾估灿,將字節(jié)碼(.class)進(jìn)行分類存放 敬察。
包的注意事項(xiàng):
- 包的寫法:package 包名
- package語(yǔ)句必須是程序的第一條可執(zhí)行的代碼
- package語(yǔ)句在一個(gè)java文件中只能有一個(gè)
- 如果沒(méi)有package茫叭,默認(rèn)表示無(wú)包名
帶包的類的編譯和運(yùn)行
編譯:在D盤下有Person_Test.java ,在D盤下打開dos命令行執(zhí)行 javac -d . Person_Test.java 命令就會(huì)生成一個(gè)D:/com/heima/Person_Test.class
運(yùn)行:在D盤下打開dos命令行(當(dāng)前路徑下,不要跑到D:/com/heima去打開dos) 執(zhí)行java com.heima.Person_Test
不同包下類之間的訪問(wèn)
1)類的全路徑名 變量名 = new 類的全路徑名();
?
案例:一個(gè)java文件里面是Demo1_Package類
package com.heima;
class Demo1_Package {
public static void main(String[] args) {
//Person p = new Person(); //報(bào)錯(cuò):不同包下的類不能直接訪問(wèn)
com.baidu.Person p = new com.baidu.Person(); //類的全路徑名
}
}
package com.baidu;
class Person {
String name;
int age;
}
2)package和class之間加入一個(gè)"import 包;"然后就可以直接訪問(wèn)不同包下的類了
?
案例:一個(gè)java文件里面是Demo2_Package類
package com.heima;
import com.baidu.Person; //導(dǎo)包
class Demo2_Package {
public static void main(String[] args) {
Person p = new Person(); //導(dǎo)包后道媚,就能直接訪問(wèn)了
}
}
package com.baidu;
class Person {
String name;
int age;
}
?
修飾符
權(quán)限修飾符的訪問(wèn)權(quán)限
- private: 是為本類準(zhǔn)備的
- 默認(rèn):是為同一個(gè)包下的類準(zhǔn)備的
- protected:是為子類準(zhǔn)備的,無(wú)論子類在任何地方
- public: 為所有類準(zhǔn)備的
每個(gè)內(nèi)容一般都用什么修飾符修飾
- 類:public
- 成員變量:private
- 構(gòu)造方法:public (當(dāng)定義一個(gè)工具類的時(shí)候 可以用private)
- 成員方法:public
- 接口中的成員變量:public static final
- 接口中的成員方法:public abstract
內(nèi)部類
類內(nèi)部的類就叫做內(nèi)部類
訪問(wèn)特點(diǎn)
- 外部類訪問(wèn)內(nèi)部類里面的內(nèi)容 ,必須創(chuàng)建內(nèi)部類的對(duì)象來(lái)訪問(wèn)
- 內(nèi)部類訪問(wèn)外部類的內(nèi)容最域, 直接訪問(wèn)包括私有
代碼:
class Demo1_InnerClass {
public static void main(String[] args) {
//報(bào)錯(cuò)谴分,因?yàn)閮?nèi)部類是寫在其他類的內(nèi)部 不能這樣直接創(chuàng)建內(nèi)部類的對(duì)象
//Inner i = new Inner();
//i.method();
//創(chuàng)建內(nèi)部類對(duì)象格式:外部類名.內(nèi)部類名 = 外部類對(duì)象.內(nèi)部類對(duì)象
Outer.Inner oi = new Outer().new Inner();
oi.method();
}
}
class Outer {
private int num = 10;//外部類的私有屬性
class Inner {
String name = "內(nèi)部類";
public void method() {
System.out.println(num);//內(nèi)部類訪問(wèn)外部類的內(nèi)容, 直接訪問(wèn)包括私有
}
}
public void show(){
//System.out.println(name);//報(bào)錯(cuò):外部類不能直接訪問(wèn)內(nèi)部類的內(nèi)容
Inner i = new Inner();
//這樣才是正確的镀脂,外部類訪問(wèn)內(nèi)部類里面的內(nèi)容牺蹄,必須創(chuàng)建內(nèi)部類的對(duì)象來(lái)訪問(wèn)
System.out.println(i.name);
}
}
成員私有內(nèi)部類
class Demo2_InnerClass {
public static void main(String[] args) {
//Outer.Inner oi = new Outer().new Inner();
//不能創(chuàng)建私有內(nèi)部類的對(duì)象,因?yàn)閮?nèi)部類被私有了
//oi.method();
Outer o = new Outer();
o.print();
}
}
class Outer {
private int num = 10;
private class Inner {
//內(nèi)部類私有是為了讓內(nèi)部的這個(gè)類更安全 比如:內(nèi)部類就相當(dāng)于人類的心臟
//怎么能讓外面直接訪問(wèn)你的心臟呢?
public void method() {
System.out.println(num);
}
}
public void print() {
Inner i = new Inner();
i.method();
}
}
成員靜態(tài)內(nèi)部類
class Demo1_InnerClass {
public static void main(String[] args) {
//外部類名.內(nèi)部類名 對(duì)象名 = 外部類名.內(nèi)部類對(duì)象;
Outer.Inner oi = new Outer.Inner();
oi.method();
Outer.Inner2.print(); //直接訪問(wèn)靜態(tài)內(nèi)部類里面的靜態(tài)方法
}
}
class Outer {
static class Inner { //靜態(tài)成員內(nèi)部類
public void method() {
System.out.println("method");
}
}
static class Inner2 { //靜態(tài)成員內(nèi)部類
public static void print() { //靜態(tài)方法
System.out.println("print");
}
}
}
內(nèi)部類對(duì)象訪問(wèn)當(dāng)前外部類對(duì)象的成員變量
class Test_InnerClass {
public static void main(String[] args) {
Outer ot = new Outer();
ot.num = ot.num - 5;
Outer.Inner oi = ot.new Inner();
oi.show();
}
}
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);//訪問(wèn)的是局部變量 30
System.out.println(this.num);//訪問(wèn)的是成員變量 20
//外部類名.this訪問(wèn)的是當(dāng)前外部類對(duì)象的num 5
//因?yàn)楫?dāng)前外部類對(duì)象ot的num值已經(jīng)改變成了5 ot.num=ot.num-5
System.out.println(Outer.this.num);
System.out.println(new Outer().num);//一個(gè)新的外部類對(duì)象的num 10
}
}
}
局部?jī)?nèi)部類訪問(wèn)局部變量薄翅,局部變量前面必須加final修飾钞馁,為了延長(zhǎng)局部變量的生命周期
class Demo1_InnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
class Outer {
public void method() {
final int num = 10;
class Inner {
public void print() {
System.out.println(num);
}
}
Inner i = new Inner();//對(duì)象的生命周期比局部變量長(zhǎng),
i.print();
//當(dāng)method()方法執(zhí)行完畢后匿刮,i還存在著,就會(huì)導(dǎo)致如果i對(duì)象還想訪問(wèn)num僧凰,而
//num已經(jīng)消失了,訪問(wèn)不到了熟丸。所以在num前面加final 永遠(yuǎn)放到常量池里面去训措,常量池的
//東西永遠(yuǎn)都不會(huì)消失(虛擬機(jī)掛掉才會(huì)消失)
}
}
?
匿名內(nèi)部類
前提:有一個(gè)接口或者抽象類或者普通的類
格式:
new 接口名或者抽象類名(){
重寫方法;
};
本質(zhì):就是接口或者抽象類或者普通類的一個(gè)子類對(duì)象
代碼:
interface Inter{
public abstract void show();
}
class Demo {
public static void main(String[] args){
new Inter(){
public void show(){
System.out.println("hehe");
}
}.show();
}
}
- 匿名內(nèi)部類可以重寫多個(gè)方法, 但是一般開發(fā)中就讓其重寫一個(gè)方法。
- 匿名內(nèi)部類是不能向下轉(zhuǎn)型的,因?yàn)闆](méi)有子類類名光羞,所以不能使用匿名內(nèi)部類里面的特有方法绩鸣。
- 當(dāng)我們看到一個(gè)方法的參數(shù)類型是抽象類或者接口的時(shí)候, 我們調(diào)用這個(gè)方法的時(shí)候纱兑,可以考慮用匿名內(nèi)部類來(lái)實(shí)現(xiàn)呀闻。
課后習(xí)題:補(bǔ)齊代碼,使得控制臺(tái)輸出HelloWorld
interface Inter {
void show();
}
class Outer {
//補(bǔ)齊代碼
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
今天學(xué)習(xí)了package和導(dǎo)包(import)之后是不是覺得編譯步驟很復(fù)雜扒鄙鳌捡多?下節(jié)我們將學(xué)習(xí)用Eclipse來(lái)編譯運(yùn)行程序。想了解更多學(xué)習(xí)知識(shí)铐炫,請(qǐng)關(guān)注微信公眾號(hào)“阿Q說(shuō)”垒手,獲取更多學(xué)習(xí)資料吧!你也可以后臺(tái)留言說(shuō)出你的疑惑倒信,阿Q將會(huì)在后期的文章中為你解答科贬。每天學(xué)習(xí)一點(diǎn)點(diǎn),每天進(jìn)步一點(diǎn)點(diǎn)鳖悠。
?
?
?