關於內部類

2021-05-02 02:51:23 字數 3105 閱讀 1644

對內部類用的少,基本上都有點陌生了。今天看到乙個部落格感覺還不錯就轉了過來。先謝謝博主!!!

1.關於內部類的說明

1)在乙個類中定義另外乙個類,這個類就叫做內部類(inner class) 。內部類的定義和普通類的定義沒什麼區別,它可以直接訪問和引用它的外部類的所有變數和方法(包括private),就像外部類中的其他非static成員的功能一樣。區別是,外部類只能宣告為public和default,而內部類可以宣告為private和protected。 中國自學程式設計網 www.zxbc.cn

2)當我們建立乙個inner class時,其物件就擁有了與外部類物件之間的一種關係,這是通過乙個特殊的this reference形成的,當內部類的成員方法中訪問某個變數/方法時,如果在該方法和內部類中都沒有定義過這個變數,呼叫就會被傳遞給內部類中儲存的那個外部類物件的引用(outerclass.this),通過那個外部類物件的引用去呼叫這個變數。

2.內部類變數訪問

2.1在main中直接從外部類呼叫內部類的方法

package org.zj.sample;

class outer

} void print()

} class test

} 該示例程式列出了重名成員變數分布的3種情況。

訪問內部類方法中的變數:

system.out.println(index);

訪問內部類中的成員變數:

system.out.println(this.index);

訪問所在外部類的成員變數:

system.out.println(outer.this.index);

2.2在main中顯式返回內部類引用

package org.zj.example;

class outer

} inner getinner()

} class test

} 2.3當main方法在outer類內部

package org.zj.sample1;

class outer

} inner getinner()

public static void main(string args)

} 2.4在main方法中直接產生內部類物件

package org.zj.sample2;

class outer

} }

class test

} 2.5在方法中定義內部類

在方法中定義的內部類只能訪問方法中的final型別的區域性變數,因為用final定義的區域性變數相當於是乙個常量,它的生命週期超出方法執行的生命週期。而且方法體中的內部類不能有訪問說明符。

package org.zj.sample;

class inout

public void sayhello()

} inner inner=new inner();//此句必須放在定義類inner的後面

inner.sayhello();

} public static void main(string args)

} 在方法體中使用內部類可以使用乙個已命名的構造子,或過載構造子。而匿名內部類只能用於例項初始化。

3.內部類的繼承

當乙個類繼承自乙個內部類時,預設的構造器不可用。必須使用如下語法:

enclosingclassreference.super();(見下例綠色部分)

package org.zj.sample;

class withinner

} }

public class inheritinner extends withinner.inner

public static void main(string args)

} 結果:

hello.

4.匿名內部類

未使用匿名內部類的情況:這裡單獨寫了乙個內部類inner。

package org.zj.example;

abstract class a

class outer

} new outer().callinner(new inner());

} public void callinner(a a)

} 使用匿名內部類的情況:直接在new a()中給出inner的定義。

package org.zj.example;

abstract class a

class outer

});

} public void callinner(a a)

} 5.內部類的2種特殊用法

乙個類從另乙個類派生出來,又要實現乙個介面。但在介面中定義的方法與父類中定義的方法的意義不同,則可以利用內部類來解決這個問題。

package org.zj.sample;

inte***ce machine

class person

} class robot extends person

} machine getmachine()

} class test

} 在robot類內部使用內部類machineheart來實現介面machine的run方法。同時robot類又繼承了父類person的run方法。如果不使用內部類machineheart而使robot直接實現介面machine,則該如何呼叫父類的run方法?

利用內部類可解決c++中多重繼承所解決的問題

package org.zj.example;

class a

} abstract class b

class c extends a

}; }

} class test

} 類c既要繼承類a又要繼承類b,則可將類b的定義放入類c內部,使之成為內部類。

6.我們為什麼使用內部類

這是對上一章節兩種用法的總結,可結合上一章節的兩個例項分析。

1)  當我們需要在某一情形下實現乙個介面,而在另一情形下又不需要實現這個介面時,我們可以使用內部類來解決這一問題。讓內部類來實現這個介面。

2)  內部類有效的解決了多重繼承的問題。

關於內部類

內部類可以大概分為四種 1.成員內部類 2.區域性內部類 3.巢狀內部類 4.匿名內部類 1.首先是成員內部類,其作為外部類的成員存在。所以內部類可以訪問外部類的一切成員和方法 即使這個方法是私有的 但是外部類若是想使用內部類的變數和方法則需要使用內部類的物件來獲取。一定要記住成員內部類不能含有靜態...

關於內部類

整理關於內部類的一些知識 什麼是內部類 概念 在乙個類的內部再定義乙個完整的類 特點 成員內部類outer out new outer outer.inner oi out.new inner package com.company public class main class outer 靜態內...

內部類 成員內部類 區域性內部類 匿名內部類

public class 外部類 private int num 0 外部類如果要訪問內部類的成員,則需要通過內部類的物件訪問 使用方式 1.外部類使用內部類,主函式再使用外部類 2.通過new的方式 外部類.內部類 物件名 new 外部類 new 內部類 定義在方法內部的類,就是區域性內部類,只有...