java學習之內部類、包與程式碼塊
一 內部類
將類寫在其他類的內部,可以寫在其他類的成員位置和區域性位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。
1 成員內部類
成員內部類,定義在外部類中的成員位置。與類中的成員變數相似,可通過外部類物件進行訪問
定義的格式:
class 外部類 {
修飾符 class 內部類 {
//其他程式碼
}
}
訪問方式:外部類名.內部類名 變數名 = new 外部類名().new 內部類名();
2 區域性內部類
區域性內部類,定義在外部類方法中的區域性位置。與訪問方法中的區域性變數相似,可通過呼叫方法進行訪問
定義格式:
class 外部類 {
修飾符 返回值型別 方法名(引數) {
class 內部類 {
//其他程式碼
}
}
}
訪問方式:在外部類方法中,建立內部類物件,進行訪問。
3 匿名內部類
最常用到的內部類就是匿名內部類,它是區域性內部類的一種。
定義的匿名內部類有兩個含義:
1 臨時定義某一指定型別的子類
2 定義後即刻建立剛剛定義的這個子類的物件
下面是例子來幫助理解:
package com.oracle.Demo01; public interfaceSmoking { 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("這是靜態程式碼塊"); } }
當建立兩個物件時
執行結果為: