Java的内部类

Posted __NaCl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的内部类相关的知识,希望对你有一定的参考价值。

内部类的概念

内部类是定义在另一个类中的类。内部类的作用:

  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据,
  • 内部类可以对同一个包中的其他类隐藏起来
  • 当想要定义一个回调函数且不想编写大量的代码时,使用匿名内部类比较便捷。

使用内部类访问对象的状态

public class TalkClock{
    private int interval;
    private boolean beep;
    public TalkingClock(int interval,boolean beep){...}
    public void start();
    public class TimePrinter implements ActionListener
    //一个内部类
    {
        ...
    }
}

在上述代码中,TimePrinter是位于TalkingClock类的内部类。但不意味着每个TalkingClock都有一个TimerPrinter实例域。TimerPrinter是有TalkingClock类的方法构造。下面是TimerPrinter的具体代码

pubic class TimePrinter implements ActionLlistener{
    public void actionPerformed(ActionEvent event){
    System.out.println("At eht tone,the timer is"+new Data());
    if(beep)
    Tookit.getDefaultTookit().beep();
    }
    
}

在上面的代码中,TimePrinter的实例域中并没有beep这个变量。它引用的是外部类的TaikingClock对象的域。也就是说,内部类既可以访问自身的数据域,也可以访问创建他的外围类对象的数据域。
内部类的对象总有一个隐式引用,它指向了创建它的外部类对象。这个引用在内部类的定义中是不可见的。这里讲这个隐式引用成为outer。那么actionPerformed方法将等价于下列形式:

    public void actionPerformed(ActionEvent event){
    System.out.println("At eht tone,the time is"+new Data());
    if(out.beep)
    Toolkit.getDefaultTookit().beep();
    }

内部类对象的构造器可以入下写

outerObject.new InnerClass(construction parameters);
ActionListener listener= this.new TimePrinter();
在上述代码中,在构造TimePrinter对象的外围类的引用被设置为创建内部类对象中方法中this引用。

内部类的声明的所有的静态域必须是final。因为我们希望一份静态域只一个实例,对于每一个外部对象,会分别有一个单独的
内部类实例。如果这个域不是fianl,它可能不是唯一。

局部内部类

如果内部类在代码中只使用一次吗,那么可以将该内部类设计成局部内部类。具体的实现方法就是在该方法中实现该类

    public void start(){
    class TimePrinter actionPerfoemed(ActionEvent Event){
    if(beep)
    ...
    }

局部类不能使用private,public等修饰符来进行声明,他的作用怕域被限定在声明这个局部类的块中。

匿名内部类

匿名内部类是局部内部类的更深一层次。如果只创建这个类的一个对象,那么这个类就不用命名。
    public void start(int interval,boolean beep){
    ActionListener listener = new ActionListener(){
    System.out.println("...");
    if(beep){
    ....
    }
    };
    }

上述代码中,含义为创建一个实现了ActionListener接口的类的新对象,需要实现的方法actionPerformed定义在括号{}内。通常的语法格式为

    new SuperTyper(construction paramters){
    inner class method and data
    }

由于构造器必须和类名一样,而匿名类没有名字,故而也就没有构造器。所以构造器的参数都必须传递到超类构造器中。在内部类实现接口的时候,不能有任何构造参数。普通类和匿名内部类的构造区别在于。匿名类后面会有一个;
匿名内部类常用语实现时间监听器和其他回调。

静态内部类

如果使用内部类只是想把一个类隐藏于另一个类中,并不需要内部类引用外围类对象。那么完全可以将该类定义为静态内部类。




以上是关于Java的内部类的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

# Java 常用代码片段

为啥片段类应该是公开的?

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

elasticsearch代码片段,及工具类SearchEsUtil.java

ForegroundService没有从片段开始?