一  內部類

將類寫在其他類的內部,可以寫在其他類的成員位置和區域性位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。

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("這是靜態程式碼塊");
    }
}

當建立兩個物件時

執行結果為: