看我72变-多变的内部类 | 带你学《Java面向对象编程》之八十五

上一篇:内部类的“独立”-static内部类 | 带你学《Java面向对象编程》之八十四
【本节目标】
通过阅读本节内容,你将了解到内部类的其他定义方式,并掌握内部类的定义方法,学会在复杂的开发过程中以正确的方式定义内部类。

方法中定义内部类

内部类可以在任意的结构中进行定义,这就包括了:类中、方法中、代码块中,但是从实际的开发来讲在方法中定义内部类的形式较多。
范例:观察在方法中定义的内部类

class Outer {
    private String msg = "www.mldn.cn" ;
    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(2390239023L) ;
    }
}

执行结果:
www.mldn.cn
2390239023

此时在fun()方法内部提供有Inner内部类的定义,并且可以发现内部类可以直接访问外部类中的私有属性,也可以直接访问方法中的参数,但是对于方法中的参数直接访问是从JDK1.8开始支持的。而在JDK1.8之前,如果方法中定义的内部类要想访问方法中的参数,则参数前必须追加final。
范例:在JDK1.8以前的程序结构

class Outer {
    private String msg = "www.mldn.cn" ;
    public void fun(final long time) {
        final String info = "我很好" ;
        class Inner {          //内部类
            public void print() {
                System.out.println(Outer.this.msg) ;
                System.out.println(time) ;
                System.out.println(info) ;
            }
        }
        new Inner().print() ;        //方法中直接实例化内部类对象
    }
}

执行结果:
www.mldn.cn
2390239023
我很好

之所以取消这样的限制,主要是为了其扩展的函数式编程准备的功能。

匿名内部类

匿名内部类是一种简化的内部类的处理形式,其主要是在抽象类和接口的子类上使用的。
范例:观察一个基本的程序结构

interface IMessage {
    public void send(String str) ;
}
class MessageImpl implements IMessage {
    public void send(String str) {
        System.out.println(str) ;     //www.mldn.cn
    }
}
public class JavaDemo{
    public static void main(String args[])  {
        IMessage msg = new MessageImpl() ;
        msg.send("www.mldn.cn") ;
    }
}  

如果现在IMessage接口中的MessageImpl子类只使用唯一的一次,那么是否还有必要将其定义为单独的类,那么在这样的要求下就发现这个时候定义的子类是有些多余了,所以就可以利用匿名内部类的形式来解决此问题。
范例:使用匿名内部类

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.println(str) ;   //www.mldn.cn
              }
        } ;
        msg.send("www.mldn.cn") ;
    }
}

有些时候为了更加方便的体现出匿名内部类的使用,往往可以利用静态方法做一个内部的匿名内部类的实现。
范例:在接口中直接定义匿名内部类

interface IMessage {
    public void send(String str) ;
    public static IMessage getInstance() {
         return new IMessage() {
              public void send(String str) {
                  System.out.println(str) ;      //www.mldn.cn
              }
         } ;
     }
}
public class JavaDemo{
     public static void main(String args[])  {
         IMessage.getInstance.send("www.mldn.cn") ;
     }
}

与内部类相比,匿名内部类只是一个没有名字的只能够使用一次的,并且结构固定的一个子类操作。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:教你利用Lambda将代码化繁为简 | 带你学《Java面向对象编程》之八十六
更多Java面向对象编程文章查看此处

上一篇:dpkg: error processing mysql-server (--configure): dependency problems - leaving unconfigured


下一篇:jQuery上传插件Uploadify 3.2在.NET下的使用