博客
关于我
成员内部类、局部内部类、匿名内部类_hehe.base.11.3_over
阅读量:393 次
发布时间:2019-03-05

本文共 3555 字,大约阅读时间需要 11 分钟。

Java 内部类详解

Java 内部类是一种在现有类内部定义新类的方式,支持成员内部类、局部内部类以及匿名内部类等多种形式。本文将详细探讨Java 内部类的概念、分类、使用方法以及具体实现细节。

一、内部类的分类

Java 内部类主要分为以下几种类型:

  • 成员内部类

    成员内部类是定义在外部类的成员位置(如方法、字段)内部的类。与外部类具有“所属关系”,可以直接访问外部类的成员变量和方法。

  • 局部内部类

    定义在方法或块内部的类。只能在定义它的方法或块中使用,方法结束后该类将失去作用。

    • 局部内部类可以进一步分为匿名内部类(匿名类),用于接口实现或其他特定场景。
  • 匿名内部类

    没有名字的内部类,通常用于实现接口或其他只需一次使用的类。其定义方式简洁,省略了类名的声明。

  • 二、成员内部类的定义格式

    成员内部类的定义语法如下:

    修饰符 class 外部类名称 {    修饰符 class 内部类名称 {        // 内部类的方法和字段    }}

    以下示例展示了成员内部类的使用场景:

    public class Body {    public class Heart {        public void beat() {            System.out.println("内部类方法");            System.out.println(name); // 内部类使用外部类成员变量            method(); // 内部类调用外部类成员方法        }    }    private String name;    public void method() {        System.out.println("外部类方法");        new Heart().beat(); // 外部类调用内部类方法    }}

    三、成员内部类的使用方式

    调用成员内部类有两种方式:

  • 间接方式
    在外部类的方法中间接调用内部类。通过外部类对象调用内部类的方法:
  • public class Body {    private String name;    public void method() {        System.out.println("外部类方法");        new Heart().beat(); // 间接方式调用内部类    }    public static void main(String[] args) {        Body body = new Body();        body.method(); // 通过外部类对象调用    }}
    1. 直接方式
      通过外部类名称直接调用内部类:
    2. public class Body {    public class Heart {        public void beat() {            System.out.println("内部类方法");        }    }    public static void main(String[] args) {        Body.Heart heart = new Body().new Heart(); // 直接方式创建内部类对象        heart.beat();    }}

      四、内部类的同名变量访问

      当内部类和外部类拥有同名变量时,如何正确访问?可以使用 外部类名称.this 来区分:

      public class Out {    int num = 10; // 外部类成员变量    public class inner {        int num = 20; // 内部类成员变量        public void method() {            int num = 30; // 局部变量            System.out.println(num); // 局部变量:30            System.out.println(this.num); // 内部类成员变量:20            System.out.println(Out.this.num); // 外部类成员变量:10        }    }}

      五、局部内部类的定义与使用

      局部内部类定义在方法或块内部,仅在该方法或块中可用:

      public class Outer {    public void method() {        class Iner {            public void methodIner() {                System.out.println("局部内部类方法");            }        }        Iner iner = new Iner();        iner.methodIner();    }}

      六、局部内部类的 final 关键字

      若局部内部类需要访问所在方法的局部变量,则该变量必须为 final

      public class MyOuter {    public void methodOuter() {        final int num = 10; // 所在方法的局部变量        class MyInner {            public void methodInner() {                System.out.println(num);            }        }    }}

      从 Java 8 开始,若局部变量事实不变,可以省略 final 关键字。

      七、匿名内部类的定义与使用

      匿名内部类适用于需要一次实现接口或子类的场景:

      public class Demo02N {    public static void main(String[] args) {        MyInterface obj = new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        obj.method();    }}

      匿名内部类的优点是简洁,但需要注意以下几点:

    3. 格式解析new 接口名称() {} 中的 new 创建对象,接口名称 为实现接口,{} 为匿名类内容。
    4. 唯一性限制:匿名内部类只能使用一次。
    5. 方法调用限制:匿名对象只能调用一次方法。
    6. 以下示例展示了匿名内部类的多次使用:

      public class Demo02N {    public static void main(String[] args) {        MyInterface obja = new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        obja.method();        MyInterface objb = new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        objb.method();        new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        }.method();    }}

      八、匿名内部类的注意事项

      • 匿名内部类只能用于实现接口或扩展父类。
      • 不能有构造器(因为没有类名)。
      • 不能继承其他类(除非实现接口)。
      • 匿名内部类的生命周期与其引用对象的生命周期相同。

    转载地址:http://trrwz.baihongyu.com/

    你可能感兴趣的文章
    OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
    查看>>
    openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    openpyxl 模块的使用
    查看>>
    OpenResty(nginx扩展)实现防cc攻击
    查看>>
    Openresty框架入门详解
    查看>>
    OpenResty(1):openresty介绍
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    OpenResty(3):OpenResty快速入门之安装lua
    查看>>
    OpenResty(4):OpenResty快速入门
    查看>>
    OpenResty(5):Openresty 模板渲染
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    OpenSLL
    查看>>
    OpenSSL 引入了新的治理模式和项目,来增强社区参与和决策
    查看>>
    openssl安装
    查看>>
    OpenStack 上部署 Kubernetes 方案对比
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>
    OpenStack 存储服务详解
    查看>>