使用内部类的目的:可以轻松的访问外部类的私有属性和方法
普通内部类
- 外部类也可以轻松的访问内部类的私有成员和方法
- 创建方式:
外部类.内部类 内部类对象 = new 外部类().new 内部类()
- 编译完成后,内部类class文件为“Outer I n n e r . c l a s s ” , 其 中 Inner.class”,其中 Inner.class”,其中$就是“.”的意思
- 内部类创建之前,必须先创建外部类
- 如果内部类定义为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");
}
}