Java Day16【第二十八章】内部类基本概念
【第二十八章】内部类基本概念
一.内部类的基本定义
范例:内部类
class Outer { private String msg = "www.mldn.cn"; public void fun() { Inner in = new Inner(); in.println(); } class Inner{ public void println() { System.out.println(Outer.this.msg); } } }
内部类的优势:轻松访问外部类的私有属性
二.内部类的相关说明:
现在已经清楚的认识到了内部类的优势以及结构,现在对内部类进行一些相关说明
1.外部类也可以轻松访问内部类中的私有属性。
范例:内部类实例化对象
外部类.内部类 内部类对象 = new 外部类().内部类();
在内部类编译完成之后会自动形成一个“Out$Inner.class”类文件,其中"$"这个符号换到程序之中就是”.“,所以内部类的全程就是外部类.内部类
内部类与外部类之间可以直接进行私有成员的访问,所以一点要保证外部类的实例化。
class Outer { private String msg = "www.mldn.cn"; class Inner{ public void println() { System.out.println(Outer.this.msg); } } } public class Main { public static void main(String[] args) { Outer.Inner in = new Outer().new Inner(); in.println(); } }
内部类结构也可以在抽象类或者接口之中使用
范例:定义内部接口
interface IChannel{ public void send(IMessage msg); interface IMessage{ public String getContent(); } } class ChannelImpl implements IChannel{ public void send(IMessage msg) { System.out.println("Send Message:"+msg.getContent()); } class MessageImpl implements IMessage{ public String getContent() { return "www.mldn.com"; } } } public class Main { public static void main(String[] args) { IChannel channel = new ChannelImpl(); channel.send(((ChannelImpl)channel).new MessageImpl()); } }
三.static定义内部类
范例:使用static定义内部类接口:
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.println("消息通道建立失败"); } } } class DefaultMessage implements IMessageWarp.IMessage{ public String getContent() { return "www.mldn.com"; } } class NetChannel implements IMessageWarp.IChannel{ public boolean connect(){ return true; } } public class Main{ public static void main(String[] args) { IMessageWarp.send(new DefaultMessage(), new NetChannel()); } }
之所以使用static定义内部接口,主要是因为这些操作是属于一组相关的定义,主要是可以明确的定义接口的功能。
四.方法中定义内部类
范例:在方法类中定义内部类
class Outer{ private String msg = "www"; 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 Main{ public static void main(String[] args) { new Outer().fun(121351L); } }
五.匿名内部类
匿名内部类是一种简化的内部类的处理形式,主要在抽象类和接口的子类上使用
范例:观察一个程序结构
interface IMessage{ public void send(String str); } class MessageImpl implements IMessage{ public void send(String str) { System.out.println(str); } } public class Main{ public static void main(String[] args) { IMessage msg = new MessageImpl(); msg.send("www"); } }
如果说IMessage接口中的子类只是用一次,那么没必要单独设置一个class
范例:使用匿名内部类
interface IMessage{ public void send(String str); } public class Main{ public static void main(String[] args) { IMessage msg = new IMessage(){ //匿名内部类对象 public void send(String str) { System.out.println(str); } }; msg.send("www"); } }