java學習之內部類、包與代碼塊
一 內部類
將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。
1 成員內部類
成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問
定義的格式:
class 外部類 {
修飾符 class 內部類 {
//其他代碼
}
}
訪問方式:外部類名.內部類名 變量名 = new 外部類名().new 內部類名();
2 局部內部類
局部內部類,定義在外部類方法中的局部位置。與訪問方法中的局部變量相似,可通過調用方法進行訪問
定義格式:
class 外部類 {
修飾符 返回值類型 方法名(參數) {
class 內部類 {
//其他代碼
}
}
}
訪問方式:在外部類方法中,創建內部類對象,進行訪問。
3 匿名內部類
最常用到的內部類就是匿名內部類,它是局部內部類的一種。
定義的匿名內部類有兩個含義:
1 臨時定義某一指定類型的子類
2 定義後即刻創建剛剛定義的這個子類的對象
下面是例子來幫助理解:
package com.oracle.Demo01; public interface Smoking { public abstract void smoke(); }
public class Test { public static void main(String[] args) {//匿名內部類對象 //new 接口或者抽象類{ //重寫父類的抽象方法 //} new Smoking(){ public void smoke(){ System.out.println("抽煙"); } }.smoke(); } }
當接口中有多個構造方法的時候,必須重寫所有的接口方法,否則會報錯。
二 包的聲明與訪問
1 包的概念
java的包,其實就是我們電腦系統中的文件夾,包裏存放的是類文件。
當類文件很多的時候,通常我們會采用多個包進行存放管理他們,這種方式稱為分包管理。
在項目中,我們將相同功能的類放到一個包中,方便管理。並且日常項目的分工也是以包作為邊界。
類中聲明的包必須與實際class文件所在的文件夾情況相一致,即類聲明在a包下,則生成的.class文件必須在a文件夾下,否則,程序運行時會找不到類。
2 包的聲明格式
通常使用公司網址反寫,可以有多層包,包名采用全部小寫字母,多層包之間用”.”連接
如:Oracle網址oracle.com那麽網址反寫就為com.oracle
註意:聲明包的語句,必須寫在程序有效代碼的第一行(註釋不算)
3 包的訪問
在訪問類時,為了能夠找到該類,必須使用含有包名的類全名(包名.類名)。
如: java.util.Scanner
java.util.Random
com.oracle.Demo
4 導包
我們每次使用類時,都需要寫很長的包名。很麻煩,我們可以通過import導包的方式來簡化。
導包的格式:
import 包名.類名;
三 訪問修飾符
在Java中提供了四種訪問權限,使用不同的訪問權限時,被修飾的內容會有不同的訪問權限,以下表來說明不同權限的訪問能力:
|
public |
protected |
Default(默認) |
private |
同一類中 |
√ |
√ |
√ |
√ |
同一包中(子類與無關類) |
√ |
√ |
√ |
|
不同包的子類 |
√ |
√ |
|
|
不同包中的無關類 |
√ |
|
|
|
這是兩個不同包下的四個類
這是A類
這是B類
這是C類
這是D類
五 代碼塊
1局部代碼塊
class Demo{ public static void main(String[] args) { { int x = 1; System.out.println("普通代碼塊" + x); } int x = 99; System.out.println("代碼塊之外" + x); } }
結果:
普通代碼塊1
代碼塊之外99
2 構造代碼塊
構造代碼塊是定義在類中成員位置的代碼塊
l 優先於構造方法執行,構造代碼塊用於執行所有對象均需要的初始化動作
l 每創建一個對象均會執行一次構造代碼塊。
package com.oracle.Demo04; public class Person { public Person(){ System.out.println("這是構造方法"); } { System.out.println("這是構造代碼塊"); } }
package com.oracle.Demo04; public class Test { public static void main(String[] args) { Person p=new Person(); } }
運行結果為:
當再創建一個對象p2時
運行結果為:
3 靜態代碼塊
靜態代碼塊是定義在成員位置,使用static修飾的代碼塊。
l 它優先於主方法執行、優先於構造代碼塊執行,當以任意形式第一次使用到該類時執行。
l 該類不管創建多少對象,靜態代碼塊只執行一次。
package com.oracle.Demo04; public class Person { public Person(){ System.out.println("這是構造方法"); } { System.out.println("這是構造代碼塊"); } static{ System.out.println("這是靜態代碼塊"); } }
當創建兩個對象時
運行結果為:
java學習之內部類、包與代碼塊