1. 程式人生 > >內部類的四種用法

內部類的四種用法

內部類Inner Class

  將相關的類組織在一起,從而降低了名稱空間的混亂。
  一個內部類可以定義在另一個類裡,可以定義在函式裡,甚至可以作為一個表示式的一部分。
Java中的內部類共分為四種:
靜態內部類static inner class (also called nested class)
成員內部類member inner class
區域性內部類local inner class
匿名內部類anonymous inner class

靜態內部類Static Inner Class

  最簡單的內部類形式。
  類定義時加上static關鍵字。
  不能和外部類有相同的名字。
  被編譯成一個完全獨立的.class檔案,名稱為OuterClass$InnerClass.class的形式。
只可以訪問外部類的靜態成員和靜態方法,包括了私有的靜態成員和方法。
  生成靜態內部類物件的方式為:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
  靜態內部類使用程式碼:

package com.learnjava.innerclass;

class StaticInner
{
    privatestaticint a = 4;

    // 靜態內部類publicstaticclass Inner
    {
        publicvoid test()
        {
            // 靜態內部類可以訪問外部類的靜態成員
            // 並且它只能訪問靜態的
            System.out.println(a);
        }

    }
}

publicclass StaticInnerClassTest
{ publicstaticvoid main(String[] args) { StaticInner.Inner inner = new StaticInner.Inner(); inner.test(); } }

成員內部類Member Inner Class

  成員內部類也是定義在另一個類中,但是定義時不用static修飾。
  成員內部類和靜態內部類可以類比為非靜態的成員變數和靜態的成員變數。
  成員內部類就像一個例項變數。
它可以訪問它的外部類的所有成員變數和方法,不管是靜態的還是非靜態的都可以。
  在外部類裡面建立成員內部類的例項:
this.new Innerclass();
  在外部類之外建立內部類的例項:
(new Outerclass()).new Innerclass();
  在內部類裡訪問外部類的成員:
Outerclass.this.member
  詳情見程式碼例子:

package com.learnjava.innerclass;

class MemberInner
{
    privateint d = 1;
    privateint a = 2;

    // 定義一個成員內部類publicclass Inner2
    {
        privateint a = 8;

        publicvoid doSomething()
        {
            // 直接訪問外部類物件
            System.out.println(d);
            System.out.println(a);// 直接訪問a,則訪問的是內部類裡的a

            // 如何訪問到外部類裡的a呢?
            System.out.println(MemberInner.this.a);
        }

    }

}

publicclass MemberInnerClassTest
{

    publicstaticvoid main(String[] args)
    {

        // 建立成員內部類的物件
        // 需要先建立外部類的例項
        MemberInner.Inner2 inner = new MemberInner().new Inner2();

        inner.doSomething();
    }
}

區域性內部類Local Inner Class

  區域性內部類定義在方法中,比方法的範圍還小。是內部類中最少用到的一種型別。
  像區域性變數一樣,不能被public, protected, private和static修飾。
  只能訪問方法中定義的final型別的區域性變數。
  區域性內部類在方法中定義,所以只能在方法中使用,即只能在方法當中生成區域性內部類的例項並且呼叫其方法。

package com.learnjava.innerclass;

class LocalInner
{
    int a = 1;

    publicvoid doSomething()
    {
        int b = 2;
        finalint c = 3;
        // 定義一個區域性內部類class Inner3
        {
            publicvoid test()
            {
                System.out.println("Hello World");
                System.out.println(a);

                // 不可以訪問非final的區域性變數
                // error: Cannot refer to a non-final variable b inside an inner
                // class defined in a different method
                // System.out.println(b);

                // 可以訪問final變數
                System.out.println(c);
            }
        }

        // 建立區域性內部類的例項並呼叫方法new Inner3().test();
    }
}

publicclass LocalInnerClassTest
{
    publicstaticvoid main(String[] args)
    {
        // 建立外部類物件
        LocalInner inner = new LocalInner();
        // 呼叫外部類的方法
        inner.doSomething();
    }

}

匿名內部類Anonymous Inner Class

  匿名內部類就是沒有名字的區域性內部類,不使用關鍵字class, extends, implements, 沒有構造方法。
匿名內部類隱式地繼承了一個父類或者實現了一個介面。
  匿名內部類使用得比較多,通常是作為一個方法引數。

package com.learnjava.innerclass;

import java.util.Date;

publicclass AnonymouseInnerClass
{

    @SuppressWarnings("deprecation")
    public String getDate(Date date)
    {
        return date.toLocaleString();

    }

    publicstaticvoid main(String[] args)
    {
        AnonymouseInnerClass test = new AnonymouseInnerClass();

        // 列印日期:
        String str = test.getDate(new Date());
        System.out.println(str);
        System.out.println("----------------");

        // 使用匿名內部類
        String str2 = test.getDate(new Date()
        {
        });// 使用了花括號,但是不填入內容,執行結果和上面的完全一致
            // 生成了一個繼承了Date類的子類的物件
        System.out.println(str2);
        System.out.println("----------------");

        // 使用匿名內部類,並且重寫父類中的方法
        String str3 = test.getDate(new Date()
        {

            // 重寫父類中的方法
            @Override
            @Deprecated
            public String toLocaleString()
            {
                return "Hello: " + super.toLocaleString();
            }

        });

        System.out.println(str3);
    }
}

  生成的.class檔案中,匿名類會生成OuterClass$1.class檔案,數字根據是第幾個匿名類而類推。
  Swing中使用內部類的例子如下:

package com.learnjava.innerclass;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

publicclass SwingTest
{
    publicstaticvoid main(String[] args)
    {
        JFrame frame = new JFrame("JFrame");
        JButton button = new JButton("JButton");

        button.addActionListener(new ActionListener()
        {
            // new出來一個實現了ActionListener介面的類的例項

            @Override
            publicvoid actionPerformed(ActionEvent arg0)
            {
                System.out.println("Hello World");

            }
        });

        //加入按鈕
        frame.getContentPane().add(button);

        //設定關閉行為
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(200, 200);

        frame.addWindowListener(new WindowAdapter()
        {
            //也可以使用繼承了介面卡類的匿名內部類
            @Override
            publicvoid windowClosing(WindowEvent e)
            {

                System.out.println("Closing");
                System.exit(0);
            }
        });
        frame.setVisible(true);
    }

}

相關推薦

部類用法

內部類Inner Class   將相關的類組織在一起,從而降低了名稱空間的混亂。   一個內部類可以定義在另一個類裡,可以定義在函式裡,甚至可以作為一個表示式的一部分。 Java中的內部類共分為四種: 靜態內部類static inner class (

Python_隊列

style pan 右移 left 新元素 優先隊列 四種 int ons from queue import Queue #LILO隊列q = Queue() #創建隊列對象q.put(0) #在隊列尾部插入元素q.put(1)q.put(2)print(‘LILO

mysql中模糊查詢的用法介紹

包含 如果 正則 搜索 name 模糊查詢 長度 use mysql 下面介紹mysql中模糊查詢的四種用法: 1,%:表示任意0個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。 比如 SELECT * FROM [user] W

JS中this的用法

syn pac copy title pan 復制 comment test code 1.在一般函數方法中使用 this 指代全局對象 1 2 3 4 5 function test(){     this.x = 1;     alert(this.

C# this關鍵字的用法

end 復制代碼 replace 原始類型 catch 擴展 取數據 convert exec 用法一 this代表當前類的實例對象 namespace Demo { public class Test { private string

c++中for的用法

四種 mes pre using In col space c++ names #include <algorithm> #include <vector> #include <iostream> using namespace

QMessageBox 的用法

void MainWindow::on_info_clicked() { //info QMessageBox::information(this, "Title", "Text"); } void MainWindow::on_question_clicked() { //ques

Dialog的用法

 對話方塊Dialog在android基本用法很多種簡單介紹一下以下四種用法  Button btn1;  Button btn2;  Button btn3;  Button btn4;  final int DIALOG_ONE

JAVA中this的用法的詳解

2018年10月31日 15:27:47 Nirvana again 閱讀數:2 個人分類: JAVA

[java]static關鍵字的用法

在java的關鍵字中,static和final是兩個我們必須掌握的關鍵字。不同於其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程式的執行效能,優化程式的結構。下面我們先來了解一下static關鍵字及其用法。 static關鍵字 1.修飾成員變數 在我們平時的使用當中,static最常用的功能就是

java web javaEE ,jsp EL表示式和JSTL標籤if-else if-else用法

一.條件運算子${user.gender==1?'男':'女'}二.if()<c:if test="${2>1}">code..</c:if>code會在test屬性為true時執行三.if()-else{}<c:choose>  &

static關鍵字的用法

在java的關鍵字中,static和final是兩個我們必須掌握的關鍵字。不同於其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程式的執行效能,優化程式的結構。下面我們先來了解一下static關鍵字及其用法。static關鍵字1.修飾成員變數在我們平時的使用當中,

淺談c#委託的用法及lambda匿名委託

c#委託是一個類,可以定義一種方法型別,將有這種型別的函式當做引數進行傳遞,即他是一個可以把方法作為引數的類。 這裡通過一個小功能分別說明一下c#委託(delegate、Action、Func、predicate)的用法。 如下圖所示: Form1窗體

JS(ES6)中this的用法

轉載文章:https://www.cnblogs.com/pabitel/p/5922511.html JS(ES6)中this的五種用法 1.在回撥函式中使用this 不知道呼叫者是誰? //setInterval定時器函式中的回撥函式,不知道最後是那個在呼叫,如果回撥函式不用箭頭函,

正則表示式-問號的用法

原文符號 因為?在正則表示式中有特殊的含義,所以如果想匹配?本身,則需要轉義,\? 有無量詞 問號可以表示重複前面內容的0次或一次,也就是要麼不出現,要麼出現一次。 非貪婪匹配 貪婪匹配 在滿足匹配時,匹配儘可能長的字串,預設情況下,採用貪婪匹配 string patt

C語言const關鍵字的用法

#include <stdio.h> /* gcc中,const是通過編譯器在編譯的時候執行檢查來確保實現的(也就是 說const型別的變數不能改是編譯錯誤,不是執行時錯誤。)所以

SUMPRODUCT函式的用法

SUMPRODUCT函式   在給定的幾組陣列中,將陣列間對應的元素相乘,並返回乘積之和。 語法   SUMPRODUCT(array1,array2,array3, ...)   Array1,array2,array3, ... 為 2 到 30 個數組,其相

[java]static關鍵字的用法和void的用法

void關鍵字表示函式沒有返回結果,是java中的一個關鍵字。Void作為函式的返回結果表示函式返回null(除了null不能返回其它型別)。在java的關鍵字中,static和final是兩個我們必須掌握的關鍵字。不同於其他關鍵字,他們都有多種用法,而且在一定環境下使用,可

淺談static關鍵字的用法

 1、修飾成員變數:  在一個person類中,一個成員變數例如 String name,當new2個person()物件時候,這2個物件在堆的位置是不同的,給name賦值張三、李四,這兩個物件的  name是互相不影響的。  當用static修飾時,例如static String name,這個變數是存在靜

vs2010+cmake3.2.1+VTK搭建(VTK版本)

kernel32.libuser32.libgdi32.libwinspool.libshell32.libole32.liboleaut32.libuuid.libcomdlg32.libadvapi32.libE:\VTKITK\VTK\lib\vtkalglib-6.0.libws2_32.libE:\