概念:
內(nèi)部類( Inner Class )就是定義在另外一個(gè)類里面的類玛痊。與之對(duì)應(yīng)藕夫,包含內(nèi)部類的類被稱為外部類克伊。
作用:
內(nèi)部類提供了更好的封裝谆膳,可以把內(nèi)部類隱藏在外部類之內(nèi)皮官,不允許同一個(gè)包中的其他類訪問該類
內(nèi)部類的方法可以直接訪問外部類的所有數(shù)據(jù)脯倒,包括私有的數(shù)據(jù)
內(nèi)部類所實(shí)現(xiàn)的功能使用外部類同樣可以實(shí)現(xiàn),只是有時(shí)使用內(nèi)部類更方便
內(nèi)部類方法實(shí)例:
//外部類HelloWorld
public class HelloWorld {
// 內(nèi)部類Inner捺氢,類Inner在類HelloWorld的內(nèi)部
public class Inner {
// 內(nèi)部類的方法
public void show() {
System.out.println("welcome to imooc!");
}
}
public static void main(String[] args) {
// 創(chuàng)建外部類對(duì)象
HelloWorld hello = new HelloWorld();
// 創(chuàng)建內(nèi)部類對(duì)象
Inner i = hello.new Inner();
// 調(diào)用內(nèi)部類對(duì)象的方法
i.show();
}
}
Java中的成員內(nèi)部類
代碼示例:
public class HelloWorld {
//外部類的私有屬性
private int a = 99;
//內(nèi)部類
public class Inner{
//內(nèi)部類成員
int b = 2;
//內(nèi)部類方法
public void test(){
System.out.println("訪問外部類變量"+a);
System.out.println("訪問內(nèi)部類變量"+b);
}
}
public static void main(String[] args){
//要想調(diào)用內(nèi)部類方法步驟
//1.初始化一個(gè)外部類對(duì)象
HelloWorld out = new HelloWorld();
//2.利用外部類對(duì)象的new方法+內(nèi)部類構(gòu)造方法
Inner in = out.new Inner();
//3.利用內(nèi)部類對(duì)象藻丢,調(diào)用內(nèi)部類方法
in.test();
}
}
public class HelloWorld {
//外部類的私有屬性name
private String name = "imooc";
//外部類的成員屬性
int age = 20;
//成員內(nèi)部類Inner
public class Inner {
String name = "愛慕課";
//內(nèi)部類中的方法
public void show() {
System.out.println("外部類中的name:" + HelloWorld.this.name);
System.out.println("內(nèi)部類中的name:" +name);
System.out.println("外部類中的age:" + age);
}
}
//測(cè)試成員內(nèi)部類
public static void main(String[] args) {
//創(chuàng)建外部類的對(duì)象
HelloWorld o = new HelloWorld ();
//創(chuàng)建內(nèi)部類的對(duì)象
Inner inn =o.new Inner();
//調(diào)用內(nèi)部類對(duì)象的show方法
inn.show();
}
}
#######總結(jié):根據(jù)上述實(shí)例內(nèi)部類的使用方法
1、Inner類定義在HelloWorld類的內(nèi)部摄乒,Inner類可以使用任意訪問控制符
2悠反、內(nèi)部類的方法中,可以直接訪問HelloWorld類中的數(shù)據(jù)馍佑,不受任何訪問控制符的影響(也就是上例中斋否,在test方法中可以訪問外部類的私有熟悉a)
3、定義了成員內(nèi)部類后拭荤,必須使用外部類對(duì)象來創(chuàng)建內(nèi)部類茵臭,而不能直接去new一個(gè)內(nèi)部類對(duì)象,即:`內(nèi)部類 對(duì)象名 = 外部對(duì)象.new 內(nèi)部類構(gòu)造方法()`;
4舅世、外部類是不能直接使用內(nèi)部類的成員和方法的
5笼恰、如果外部類和內(nèi)部類具有`重名`的成員變量或方法時(shí),內(nèi)部類默認(rèn)訪問的是自己的成員變量或方法 / 如果要訪問外部類的成員變量歇终,需使用`this`關(guān)鍵字
Java中的靜態(tài)內(nèi)部類
######特點(diǎn):
1、靜態(tài)內(nèi)部類是static修飾的內(nèi)部類
2逼龟、`靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員`(但可以通過new 外部類().成員的方式訪問)
3评凝、如果外部類的靜態(tài)成員與內(nèi)部類的成員名相同,可通過`類名.靜態(tài)成員`訪問外部類的靜態(tài)成員腺律,如果不相同則可直接調(diào)用外部類的靜態(tài)成員
4奕短、創(chuàng)建靜態(tài)內(nèi)部類的對(duì)象時(shí)宜肉,不需要外部類的對(duì)象,可以直接創(chuàng)建(與非靜態(tài)內(nèi)部類不一樣)
代碼實(shí)例
//外部類
public class HelloWorld {
// 外部類中的靜態(tài)變量score
private static int score = 84;
// 創(chuàng)建靜態(tài)內(nèi)部類
public static class SInner {
// 內(nèi)部類中的變量score
int score = 91;
public void show() {
System.out.println("訪問外部類中的score:" + HelloWorld.score);
System.out.println("訪問內(nèi)部類中的score:" + score);
}
}
// 測(cè)試靜態(tài)內(nèi)部類
public static void main(String[] args) {
// 直接創(chuàng)建內(nèi)部類的對(duì)象
SInner si = new SInner();
// 調(diào)用show方法
si.show();
}
}
Java中的方法內(nèi)部類
概念:方法內(nèi)部類就是內(nèi)部類定義在外部類的方法中翎碑,方法內(nèi)部類只在該方法的內(nèi)部可見谬返,即只在該方法內(nèi)可以使用。
//外部類
public class HelloWorld {
private String name = "愛慕課";
// 外部類中的show方法
public void show() {
// 定義方法內(nèi)部類
class MInner {
int score = 83;
public int getScore() {
return score + 10;
}
}
// 創(chuàng)建方法內(nèi)部類的對(duì)象
MInner mi = new MInner();
// 調(diào)用內(nèi)部類的方法
int newScore = mi.getScore();
System.out.println("姓名:" + name + "\n加分后的成績(jī):" + newScore);
}
// 測(cè)試方法內(nèi)部類
public static void main(String[] args) {
// 創(chuàng)建外部類的對(duì)象
HelloWorld mo = new HelloWorld();
// 調(diào)用外部類的方法
mo.show();
}
}```
注意:由于方法內(nèi)部類不能被外部訪問日杈,所以不能使用訪問修飾符