看我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面向对象编程文章查看此处

相关文章
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
95 7
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
103 5
|
11月前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
304 63
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
9月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
466 15
|
9月前
|
Java 数据安全/隐私保护 开发者
【潜意识Java】深入理解 Java 面向对象编程(OOP)
本文介绍了Java中的面向对象编程(OOP)核心概念,包括封装、继承、多态和抽象。封装通过访问控制保护数据,提高安全性;继承支持代码复用,减少冗余;多态实现灵活的行为调用;抽象则隐藏细节,简化接口设计。掌握这些概念有助于编写高效、灵活且易于维护的代码。文章通过实例详细讲解了每个概念在Java中的应用,并总结了它们的优势。
360 3
|
12月前
|
Java 编译器
【Java】内部类
【Java】内部类
77 0
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
108 5
|
存储 前端开发 JavaScript
【前端学java】面向对象编程基础-类的使用(4)
【8月更文挑战第9天】面向对象编程基础-类的使用
93 0
【前端学java】面向对象编程基础-类的使用(4)