使用內部類的目的:可以輕鬆的訪問外部類的私有屬性和方法
普通內部類
- 外部類也可以輕鬆的訪問內部類的私有成員和方法
- 創建方式:
外部類.內部類 內部類對象 = new 外部類().new 內部類()
- 編譯完成後,內部類class文件爲“Outer$就是“.”的意思
- 內部類創建之前,必須先創建外部類
- 如果內部類定義爲private,那麼外部將無法創建內部類,也就無法使用內部類
接口中的內部類
- 抽象方法和接口,也可以定義內部結構
// 內部接口
interface IChannel{
public void send(IMessage msg);
interface IMessage{
public String getContent();//獲得消息
}
}
class ChannelImpl implements IChannel{
public void send(IMessage msg){
System.out.println("發送消息" + msg.getContent());
}
class MessageImpl implements IMessage{
public String getContent(){
return "www.mldn.cn";
}
}
}
public class JavaDemo{
public static void main(String args[]){
IChannel channel = new ChannelImpl();
channel.send(((ChannelImpl)channel).new MessageImpl());
}
}
- 內部抽象類
interface IChannel{
public void send(IMessage msg);
abstract class AbstractMessage{
public abstract String getContent();//獲得消息
}
}
class ChannelImpl implements IChannel{
public void send(IMessage msg){
AbstractMessage msg = new MessageImpl ();
System.out.println("發送消息" + msg.getContent());
}
class MessageImpl extends AbstractMessage{
public String getContent(){
return "www.mldn.cn";
}
}
}
public class JavaDemo{
public static void main(String args[]){
IChannel channel = new ChannelImpl();
channel.send(((ChannelImpl)channel).new MessageImpl());
}
}
- 我們還可以在接口內部定義一個類實現該接口
interface IChannel{
public void send();
class ChannelImpl implements IChannel{
public void send(){
System.out.println("www.mldn.cn");
}
public static IChannel getInstance(){
return new ChannelImpl();
}
}
}
public class JavaDemo{
public static void main(String args[]){
IChannel channel = new IChannel.getInstance();
channel.send(;
}
}
static定義的內部類
- 其實就是外部類,只是放在程序類的內部而已
class Outer{
private static final String MSG = "bridge";
static class Inner{
public void print(){
System.out.println(Outer.MSG);
}
}
}
public class JavaDemo{
public static void main(String args[]){
Outer.Inner in = new Outer.Inner();
in.print()
}
}
- 創建:外部類.內部類 內部類對象 = new 外部類.內部類()
- 接口靜態內部類,軟件設計中比較常用
interface IMessageWarp{
static interface IMessage {
public String getContent();
}
static interface IChannel{
public boolean connect();
}
public static void send(IMessage msg,IChannel channel){
if(channel.connect()){
System.out.println(msg.getContent());
} else {
System.out.print("消息通道無法建立")
}
}
class DefaultMessage implements IMessageWarp.IMessage{
public String getContent(){
return "bridge";
}
}
class NetChannel implements IMessageWarp.IChannel{
public boolean connect(){
return true;
}
}
public class JavaDemo{
public static void main(String args[]){
IMessageWarp.send(new DefaultMessage(), new NetChannel());
}
}
方法的內部類
- 內部類可以直接訪問方法參數time,但是jdk1.8之前需要加final
- 內部類可以直接訪問類中的屬性
class Outer{
private String msg = "bridge";
public void fun(long time){
class Inner{
public void print(){
System.out.println(Outer.this.msg);
System.out.println(time);
}
};
new Inner().print();
}
}
public class JavaDemo{
public static void main(String args[]){
new Outer().fun(1252323L);
}
}
匿名內部類
- 如果內部類只使用一次,我們就可以使用匿名內部類
interface IMessage{
public void send(String str);
}
public class JavaDemo{
public static void main(String args[]){
IMessage msg = new IMessage(){
public void send(String str){
System.out.print(str);
}
};
msg.send("bridge");
}
}
接口方法中的靜態內部類
interface IMessage{
public void send(String str);
public static IMessage getInstance(){
return new IMessage(){
public void send(String str){
System.out.println(str);
}
};
}
}
public class JavaDemo{
public static void main(String args[]){
IMessage.getInstance().send("bridge");
}
}