基本定义:
在一个类的内部除了属性和方法之外,还有别的类。
代码如下:
从整体的代码结构来说,内部类并不合理,所以内部类本身最大的缺陷在于破坏类的内部结构。
内部类的优点:轻松的访问外部类的私有属性。
内部类的相关说明
1.使用内部类之后,内部类与外部类之间的私有操作可以直接访问。
2.内部类本身是一个类,外部可以直接创建新的内部类对象:
外部类.内部类 类名 = new 外部类().内部类();
3.如果内部类只想让外部类定义,可以添加private关键字。此时的内部类无法在外部使用。
static内部类
如果说在内部类使用了static定义,那么这个内部类就变味了“外部类”,相当于一个独立的程序类了。
package com.test;class Outer{public static final String MSG = "test";static class Inner{public void print() {System.out.println(Outer.MSG);}}}public class Demo {public static void main(String[] args) {Outer.Inner in = new Outer.Inner();in.print();}}
static定义内部类并不常用,定义内部接口较为常用。
package com.test;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{@Overridepublic String getContent() {// TODO Auto-generated method stubreturn "test";}}class NetChannel implements IMessageWarp.IChannel{public boolean connect() {return true;}}public class Demo {public static void main(String[] args) {IMessageWarp.send(new DefaultMessage(), new NetChannel());}}
之所以使用static定义内部接口,主要是因为这些操作属于一组相关的定义,有了外部接口之后可以更加明确的描述出这些接口的主要功能。
方法中定义内部类

此时在fun()方法内部提供有Inner内部类的定义,并且可以直接访问外部类和方法中的参数,但是对于方法中的参数直接访问是从JDK1.8开始支持的。在JDK1.8之前想要访问,方法中的参数前必须追加final。
匿名内部类
匿名内部类是一种简化的内部类处理形式,其主要实在抽象类和接口的子类上使用的。
如果MessageImpl类只是用唯一的一次,那么将其定义为单独的类就有些多余。可以利用匿名内部类解决问题。
最终形式:
