內(nèi)部類是什么?
字面意思,在類的內(nèi)部編寫的類就叫內(nèi)部類!即一個(gè)類的內(nèi)部又完整的嵌套了另一個(gè)類結(jié)構(gòu),被嵌套的類稱為內(nèi)部類(inner class),嵌套其他類的類稱為外部類(outer class)。
內(nèi)部類是類的第五大成員→【提示:類的五大成員是哪些?[屬性、方法、構(gòu)造器、代碼塊、內(nèi)部類]】
內(nèi)部類一般來說包括這四種:成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類和靜態(tài)內(nèi)部類。
官方給的內(nèi)部類優(yōu)點(diǎn)如下:
1.每個(gè)內(nèi)部類都能獨(dú)立的繼承一個(gè)接口的實(shí)現(xiàn),所以無論外部類是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類都沒有影響。內(nèi)部類使得多繼承的解決方案變得完整;
2.方便將存在一定邏輯關(guān)系的類組織在一起,又可以對(duì)外界隱藏;
3.方便編寫事件驅(qū)動(dòng)程序;
4.方便編寫線程代碼。
注意:內(nèi)部類是學(xué)習(xí)的難點(diǎn),同時(shí)也是重點(diǎn),后面看底層源碼時(shí),有大量的內(nèi)部類。
一、成員內(nèi)部類:(在類的內(nèi)部方法的外部編寫的類就是成員內(nèi)部類)
成員內(nèi)部類特點(diǎn):
1.成員內(nèi)部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態(tài)成員);
2.同名的屬性名/方法名訪問外部類時(shí) → 外部類.this.成員名
Outer.this.name
成員內(nèi)部類是依附外部類而存在的,也就是說,如果要?jiǎng)?chuàng)建成員內(nèi)部類的對(duì)象,前提是必須存在一個(gè)外部類的對(duì)象。所以在外部類訪問內(nèi)部類的時(shí)候必須先實(shí)例化外部類對(duì)象
Outer outer= new outer();
Inner inner = outer.new Inner();
//或者如下一句代碼:
Outer.Inner inner = new Outer().new Inner();
注意:
1.成員內(nèi)部類可以使用四種權(quán)限修飾符進(jìn)行修飾(四種權(quán)限修飾符:public(公有的) >protected(受保護(hù)的) > (default)(缺省/默認(rèn)的) > private(私有的));
2.成員內(nèi)部類中不能書寫靜態(tài)變量和方法。
詳見案例演示:
public class Outer {
String name = "外部類的類名";
static String type = "外部類的type屬性";
private int item = 1;
public static void show() {
System.out.println("掉用外部類中的show方法");
}
public void print() {
System.out.println("調(diào)用外部類中的打印方法");
}
//成員內(nèi)部類 可以使用權(quán)限修飾符進(jìn)行修飾
public class Inner{
//static double weight = 1.8; //成員內(nèi)部類中不能使用static修飾變量和方法
String name = "內(nèi)部類的類名";
public void innerShow(){
//成員內(nèi)部類可以直接訪問外部類的屬性和方法
show();
print();
System.out.println(type);
System.out.println(item);
System.out.println("我是:" + name);
//進(jìn)行特指訪問時(shí) 使用類名.this.變量名進(jìn)行訪問
System.out.println("我是:" + Outer.this.name);
}
}
public static void main(String[] args) {
//成員內(nèi)部類對(duì)象的創(chuàng)建步驟
//1.第一步需要實(shí)例化外部類對(duì)象
//2.第二步正常實(shí)例化內(nèi)部類對(duì)象 但是new關(guān)鍵字要改成 外部類對(duì)象名.new
/*Outer outer = new Outer();
Inner inner = outer.new Inner();*/
//或者這樣創(chuàng)建
Outer.Inner inner = new Outer().new Inner();
inner.innerShow();
}
}
二、局部內(nèi)部類 (編寫在方法的內(nèi)部的類稱之為局部內(nèi)部類,也可以稱為方法內(nèi)部類)
局部內(nèi)部類的特點(diǎn)
1.局部內(nèi)部類是定義在一個(gè)方法或者一個(gè)作用域里面的類,它和成員內(nèi)部類的區(qū)別在于局部內(nèi)部類的訪問僅限于方法內(nèi)或者該作用域內(nèi);
2.局部內(nèi)部類不可使用權(quán)限修飾符 靜態(tài)(static)修飾符進(jìn)行修飾 同局部變量相同;
3.局部內(nèi)部類可以直接訪問方法中的屬性;
4.局部內(nèi)部類 可以直接訪問方法外部類中屬性和方法;
5.局部內(nèi)部類 創(chuàng)建對(duì)象 要在方法內(nèi)部 局部內(nèi)部類的外部聲明。
詳見案例演示:
public class Partial {
String name = "外部類的類名";
String type = "外部類的type屬性";
private int item = 1;
public static void show() {
System.out.println("掉用外部類中的show方法");
}
public void print() {
System.out.println("調(diào)用外部類中的打印方法");
}
public void demo(){
String name = "外部類方法deme()內(nèi)部的方法名";
String type = "外部類方法deme()內(nèi)部的type屬性";
/*編寫在方法的內(nèi)部的類稱之為局部內(nèi)部類
局部內(nèi)部類不可使用權(quán)限修飾符 靜態(tài)修飾符進(jìn)行修飾 同局部變量相同
局部內(nèi)部類與局部變量使用范圍一樣 在此方法內(nèi)部
局部內(nèi)部類可以直接訪問方法中的屬性 重名時(shí)使用參數(shù)傳遞完成訪問*/
class Inner{
//局部內(nèi)部類 可以訪問方法外部類中屬性和方法
String name = "局部類的類名";
public void showInner(String name){
show();
print();
System.out.println("我是:"+ type);
System.out.println("我是:"+ Partial.this.type);
System.out.println(item);
System.out.println("我是:" + this.name);
System.out.println("我是:" + name);
System.out.println("我是:" + Partial.this.name);
}
}
//局部內(nèi)部類 創(chuàng)建對(duì)象 要在方法內(nèi)部 局部內(nèi)部類的外部聲明
Inner inner = new Inner();
inner.showInner(name);
}
public static void main(String[] args) {
Partial partial = new Partial();
partial.demo();
}
}
三、匿名內(nèi)部類(注意:匿名內(nèi)部類只是沒有類名,其他的都是具備的)
匿名內(nèi)部類特點(diǎn)
匿名內(nèi)部類不能定義任何靜態(tài)成員、方法和類,只能創(chuàng)建匿名內(nèi)部類的一個(gè)實(shí)例。一個(gè)匿名內(nèi)部類一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類。
詳見案例演示:
// 實(shí)現(xiàn)關(guān)系下的匿名內(nèi)部類:
interface Dao {
void show();
}
public class AnonymousDemo {
//編寫回調(diào)方法 :callInner
public void callInner(){
// 接口關(guān)系下的匿名內(nèi)部類
new Dao(){
//實(shí)現(xiàn)子類 但是沒有名字 所以叫匿名內(nèi)部類
@Override
public void show() {
System.out.println("接口方法...");
}
}.show();
}
}
// 測試:
public class Demo {
public static void main(String[] args) {
AnonymousDemo anonymousDemo = new AnonymousDemo();
anonymousDemo.callInner();
}
}
匿名內(nèi)部類可用于給方法傳遞實(shí)參,演示如下:
interface Dao {
void show();
}
public class AnonymousDemo {
//編寫回調(diào)方法:callInner 參數(shù)類型為接口Dao
private static void callInner(Dao d) {
d.show();
}
public static void main(String[] args) {
callInner(new Dao() {//接口回調(diào)
//實(shí)現(xiàn)子類 但是沒有名字 所以叫匿名內(nèi)部類
@Override
public void show() {
System.out.println("匿名內(nèi)部類用于給方法傳遞實(shí)參");
}
});
}
}
或許有些難以理解,其實(shí)過程并不復(fù)雜。
說明:首先有一個(gè)接口,然后在使用的類中編寫了一個(gè)方法(參數(shù)類型是接口對(duì)象),并使用接口中未實(shí)現(xiàn)的方法。
我們調(diào)用此方法直接構(gòu)造一個(gè)接口對(duì)象傳入,此時(shí)會(huì)自動(dòng)生成一個(gè)此接口的子類(匿名內(nèi)部類)實(shí)現(xiàn)接口中的方法。本質(zhì)傳入的類便是此時(shí)的匿名內(nèi)部類。
四、靜態(tài)內(nèi)部類(在類中編寫的以static修飾的類稱為靜態(tài)內(nèi)部類)
靜態(tài)內(nèi)部類特點(diǎn)
1.靜態(tài)內(nèi)部類也是定義在另一個(gè)類里面的類,只不過在類的前面多了一個(gè)關(guān)鍵字static;
2.靜態(tài)內(nèi)部類是不需要依賴于外部類的,這點(diǎn)和類的靜態(tài)成員屬性有點(diǎn)類似,并且它不能使用外部類的非static成員變量或者方法;
3.靜態(tài)內(nèi)部類中即能聲明靜態(tài)成員也可以聲明非靜態(tài)成員。
詳見案例演示:
public class Static {
static String name = "外部類的類名";
//靜態(tài)內(nèi)部類中不能訪問外部類非靜態(tài)成員
String type = "外部類的type屬性";
public static class Inner{
//四種權(quán)限修飾符可以修飾靜態(tài)內(nèi)部類
public String name = "靜態(tài)內(nèi)部類的類名";
static double weight = 1.8;
String type = "靜態(tài)內(nèi)部類的type屬性";
public void show(){
System.out.println("我是:" + weight);
System.out.println("我是:" + type);
System.out.println("我是:" + name);
//System.out.println("我是:" + Static.type);//靜態(tài)內(nèi)部類中不能訪問外部類非靜態(tài)成員
System.out.println("我是:" + Static.name);
}
}
public static void main(String[] args) {
//靜態(tài)內(nèi)部類可以直接實(shí)例化 不需要依附于外部類
Inner inner = new Inner();
inner.show();
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-856664.html
有問題大家一起提出,我們共同學(xué)習(xí)、共同成長?。。?br> 歡迎評(píng)論區(qū)留言***?文章來源地址http://www.zghlxwxcb.cn/news/detail-856664.html
到了這里,關(guān)于Java內(nèi)部類詳解(含:成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類、靜態(tài)內(nèi)部類)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!