基本定义:
在一个类的内部除了属性和方法之外,还有别的类。
代码如下:
从整体的代码结构来说,内部类并不合理,所以内部类本身最大的缺陷在于破坏类的内部结构。
内部类的优点:轻松的访问外部类的私有属性。
内部类的相关说明
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{
@Override
public String getContent() {
// TODO Auto-generated method stub
return "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类只是用唯一的一次,那么将其定义为单独的类就有些多余。可以利用匿名内部类解决问题。
最终形式: