码迷,mamicode.com
首页 > 编程语言 > 详细

Java的内部类

时间:2019-01-05 19:46:46      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:内部类   efault   The   变量   imp   数据   不用   为我   new   

内部类的概念

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

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

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

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的内部类

标签:内部类   efault   The   变量   imp   数据   不用   为我   new   

原文地址:https://www.cnblogs.com/NaCl/p/10225411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!