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

相关文章
|
4月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
42 7
|
4月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
49 5
|
4月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
2月前
|
Java 编译器
【Java】内部类
【Java】内部类
22 0
|
4月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
39 5
|
4月前
|
存储 前端开发 JavaScript
【前端学java】面向对象编程基础-类的使用(4)
【8月更文挑战第9天】面向对象编程基础-类的使用
25 0
【前端学java】面向对象编程基础-类的使用(4)
|
4月前
|
Java 程序员 开发者
Java的面向对象编程:从基础到深入
【8月更文挑战第21天】在本文中,我们将探讨Java的面向对象编程(OOP)的核心概念,包括类、对象、继承、多态和封装。我们将通过实例和比喻,以通俗易懂的方式,深入理解这些概念的内涵和意义,以及它们如何影响我们的编程思维和实践。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更深入地理解Java的OOP,并启发你思考如何在你的项目中应用这些概念。
|
5月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
39 6
|
4月前
|
Java
【Java】内部类、枚举、泛型
【Java】内部类、枚举、泛型