基本定义:

在一个类的内部除了属性和方法之外,还有别的类。
代码如下:
image.png

从整体的代码结构来说,内部类并不合理,所以内部类本身最大的缺陷在于破坏类的内部结构。
内部类的优点:轻松的访问外部类的私有属性。

内部类的相关说明

1.使用内部类之后,内部类与外部类之间的私有操作可以直接访问。
2.内部类本身是一个类,外部可以直接创建新的内部类对象:
外部类.内部类 类名 = new 外部类().内部类();
3.如果内部类只想让外部类定义,可以添加private关键字。此时的内部类无法在外部使用。

static内部类

如果说在内部类使用了static定义,那么这个内部类就变味了“外部类”,相当于一个独立的程序类了。

  1. package com.test;
  2. class Outer{
  3. public static final String MSG = "test";
  4. static class Inner{
  5. public void print() {
  6. System.out.println(Outer.MSG);
  7. }
  8. }
  9. }
  10. public class Demo {
  11. public static void main(String[] args) {
  12. Outer.Inner in = new Outer.Inner();
  13. in.print();
  14. }
  15. }

static定义内部类并不常用,定义内部接口较为常用。

  1. package com.test;
  2. interface IMessageWarp{//消息包装
  3. static interface IMessage{
  4. public String getContent();
  5. }
  6. static interface IChannel{
  7. public boolean connect();//消息发送通道
  8. }
  9. public static void send(IMessage msg,IChannel channel) {
  10. if(channel.connect()) {
  11. System.out.println(msg.getContent());
  12. }
  13. else {
  14. System.out.println("消息通道无法建立,消息发送失败");
  15. }
  16. }//消息发送
  17. }
  18. class DefaultMessage implements IMessageWarp.IMessage{
  19. @Override
  20. public String getContent() {
  21. // TODO Auto-generated method stub
  22. return "test";
  23. }
  24. }
  25. class NetChannel implements IMessageWarp.IChannel{
  26. public boolean connect() {
  27. return true;
  28. }
  29. }
  30. public class Demo {
  31. public static void main(String[] args) {
  32. IMessageWarp.send(new DefaultMessage(), new NetChannel());
  33. }
  34. }

之所以使用static定义内部接口,主要是因为这些操作属于一组相关的定义,有了外部接口之后可以更加明确的描述出这些接口的主要功能。

方法中定义内部类

image.png
此时在fun()方法内部提供有Inner内部类的定义,并且可以直接访问外部类和方法中的参数,但是对于方法中的参数直接访问是从JDK1.8开始支持的。在JDK1.8之前想要访问,方法中的参数前必须追加final。
image.png

匿名内部类

匿名内部类是一种简化的内部类处理形式,其主要实在抽象类和接口的子类上使用的。
image.png
如果MessageImpl类只是用唯一的一次,那么将其定义为单独的类就有些多余。可以利用匿名内部类解决问题。
image.png
最终形式:
image.png