java内部类写法_Java学习-内部类
一、概念
內(nèi)部類(lèi):在一個(gè)類(lèi)的內(nèi)部定義的一個(gè)類(lèi);
分類(lèi): 可以分為 成員內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)、匿名內(nèi)部類(lèi)和靜態(tài)內(nèi)部類(lèi);
《Think in java》):
1、內(nèi)部類(lèi)可以用多個(gè)實(shí)例,每個(gè)實(shí)例都有自己的狀態(tài)信息,并且與其他外圍對(duì)象的信息相互獨(dú)立。
2、在單個(gè)外圍類(lèi)中,可以讓多個(gè)內(nèi)部類(lèi)以不同的方式實(shí)現(xiàn)同一個(gè)接口,或者繼承同一個(gè)類(lèi)。
3、創(chuàng)建內(nèi)部類(lèi)對(duì)象的時(shí)刻并不依賴(lài)于外圍類(lèi)對(duì)象的創(chuàng)建。
4、內(nèi)部類(lèi)并沒(méi)有令人迷惑的“is-a”關(guān)系,他就是一個(gè)獨(dú)立的實(shí)體。
5、內(nèi)部類(lèi)提供了更好的封裝,除了該外圍類(lèi),其他類(lèi)都不能訪(fǎng)問(wèn)。
二、各種內(nèi)部類(lèi)的介紹
1.成員內(nèi)部類(lèi)
特點(diǎn):
1.成員內(nèi)部類(lèi)可以直接訪(fǎng)問(wèn)外部類(lèi)的成員(包括private定義的成員),而外部類(lèi)不能直接訪(fǎng)問(wèn)內(nèi)部類(lèi)的成員屬性和方法。
2.成員內(nèi)部類(lèi)是依附在外部類(lèi),需要先創(chuàng)建外部類(lèi)對(duì)象才能創(chuàng)建內(nèi)部類(lèi)對(duì)象;
3.成員內(nèi)部類(lèi)區(qū)別于靜態(tài)內(nèi)部類(lèi),成員內(nèi)部類(lèi)中不能存在static的成員和方法;
//相對(duì)于內(nèi)部類(lèi),這是外部類(lèi)
public class Outer {
private int out = 1;//private的外部類(lèi)變量
public void OutPrint() {
System.out.println("Out:"+out);
}
//內(nèi)部類(lèi)
public class Inner {
int inn;
public void InPrint() {
System.out.println("In中的Out:"+out);//可以使用外部類(lèi)的成員變量
OutPrint();//可以使用外部類(lèi)的方法
}
}
//
}
public class Show {
public static void main(String[] args) {
Outer o = new Outer();//1.外部類(lèi)創(chuàng)建對(duì)象
Outer.Inner i = o.new Inner();//2.外部類(lèi)的對(duì)象創(chuàng)建后,創(chuàng)建內(nèi)部類(lèi)對(duì)象
//Inner i = new Inner();不會(huì)報(bào)錯(cuò)但是是無(wú)效定義方式
//Outer.Inner j = new Outer().new Inner();//結(jié)合1和2直接創(chuàng)建也是可行的
i.InPrint();
}
}
console結(jié)果:
In中的Out:1
Out:1
2.局部?jī)?nèi)部類(lèi)
概念: 定義在外部類(lèi)方法或作用域內(nèi)的類(lèi)
特點(diǎn):
1.局部?jī)?nèi)部類(lèi)可以直接訪(fǎng)問(wèn)外部類(lèi)的成員;
2.在局部位置可以創(chuàng)建局部?jī)?nèi)部類(lèi)對(duì)象,通過(guò)對(duì)象調(diào)用成員;
3. 局部?jī)?nèi)部類(lèi)在訪(fǎng)問(wèn)局部變量時(shí),被訪(fǎng)問(wèn)的變量必須用 final 修飾;
3.匿名內(nèi)部類(lèi)
簡(jiǎn)單寫(xiě)法:
new 父類(lèi)(){
重寫(xiě)方法;
};
new 接口(){
實(shí)現(xiàn)方法;
};
特點(diǎn):
1.匿名內(nèi)部類(lèi)我們必須是繼承一個(gè)父類(lèi)或者實(shí)現(xiàn)一個(gè)接口,不能是抽象的;
2.匿名內(nèi)部類(lèi)僅能被使用一次因?yàn)槟涿麅?nèi)部類(lèi)是直接使用new來(lái)生成一個(gè)對(duì)象的引用,該類(lèi)的定義會(huì)立即消失;
3.匿名內(nèi)部類(lèi)中是不能定義構(gòu)造函數(shù)的,匿名內(nèi)部類(lèi)中不能存在任何的靜態(tài)成員變量和靜態(tài)方法;
4.匿名對(duì)象可以作為實(shí)際參數(shù)傳遞;
5.如果定義了一個(gè)匿名內(nèi)部類(lèi),并且希望它使用一個(gè)其外部定義的參數(shù),那么編譯器會(huì)要求該參數(shù)引用是final的;
使用時(shí)機(jī): 當(dāng)一個(gè)對(duì)象只需要使用一次可以使用,匿名對(duì)象使用完畢就變成垃圾被回收;
//抽象類(lèi)
public abstract class Person {
String name;
int age;
public abstract void Print();
}
//接口
public interface PlayBall {
public abstract void Play();
}
//
public class Show {
//定義一個(gè)測(cè)試匿名類(lèi)對(duì)象可以作為形參傳遞的方法
public static void Test(Person pp) {
pp.Print();
}
public static void main(String[] args) {
//創(chuàng)建抽象類(lèi)的匿名內(nèi)部類(lèi)
new Person() {
public void Print() {
System.out.println("hello");
}
};
//使用new創(chuàng)建匿名內(nèi)部類(lèi)后,直接引用其成員
new Person() {
public void Print() {
System.out.println("hello");
}
}.Print();
//通過(guò)多態(tài)創(chuàng)建對(duì)象
Person a= new Person() {
public void Print() {
System.out.println("hello");
}
};
a.Print();
//匿名類(lèi)對(duì)象作為形參
Show.Test( new Person() {
public void Print() {
System.out.println("hello");
}
});
//創(chuàng)建接口的內(nèi)部類(lèi),同樣道理,可以通過(guò)多態(tài)創(chuàng)建對(duì)象
PlayBall p = new PlayBall() {
public void Play() {
System.out.println("踢足球");
}
};
p.Play();
}
}
console結(jié)果:
hello
hello
hello
踢足球
4.靜態(tài)內(nèi)部類(lèi)
使用static修飾的內(nèi)部類(lèi)
特點(diǎn):
1.不能訪(fǎng)問(wèn)任何外部類(lèi)的非static成員變量和方法
2.靜態(tài)內(nèi)部類(lèi)可以直接創(chuàng)建實(shí)例不需要依賴(lài)于外圍類(lèi)
總結(jié)
以上是生活随笔為你收集整理的java内部类写法_Java学习-内部类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java将日期作为文件名_获取当前时间作
- 下一篇: html 自定义标签解析,Java解析H