博客
关于我
成员内部类、局部内部类、匿名内部类_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/

    你可能感兴趣的文章
    Objective-C实现Collatz 序列算法(附完整源码)
    查看>>
    Objective-C实现comb sort梳状排序算法(附完整源码)
    查看>>
    Objective-C实现combinationSum组合和算法(附完整源码)
    查看>>
    Objective-C实现combinations排列组合算法(附完整源码)
    查看>>
    Objective-C实现combine With Repetitions结合重复算法(附完整源码)
    查看>>
    Objective-C实现combine Without Repetitions不重复地结合算法(附完整源码)
    查看>>
    Objective-C实现conjugate gradient共轭梯度算法(附完整源码)
    查看>>
    Objective-C实现connected components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Connected Components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Convex hull凸包问题算法(附完整源码)
    查看>>
    Objective-C实现convolution neural network卷积神经网络算法(附完整源码)
    查看>>
    Objective-C实现convolve卷积算法(附完整源码)
    查看>>
    Objective-C实现coulombs law库仑定律算法(附完整源码)
    查看>>
    Objective-C实现counting sort计数排序算法(附完整源码)
    查看>>
    Objective-C实现countSetBits设置位的数量算法(附完整源码)
    查看>>
    Objective-C实现currency converter货币换算算法(附完整源码)
    查看>>
    Objective-C实现cycle sort循环排序算法(附完整源码)
    查看>>
    Objective-C实现data transformations数据转换算法(附完整源码)
    查看>>
    Objective-C实现datamatrix二维码识别 (附完整源码)
    查看>>
    Objective-C实现DateToDay 方法算法(附完整源码)
    查看>>