zoukankan      html  css  js  c++  java
  • 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
    	}
    

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

    静态内部类

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

  • 相关阅读:
    HTML5_音视频标签 <audio> 和 <video>
    HTML5_提供的 新功能_less 编译_
    HTML5_新标签
    CSS3_综合案例
    CSS3_元素拖曳原理_设置全局点击捕获_九宫格碰撞检测_自定义滚动条
    CSS3_移动端_开机动画
    CSS3_动画 animation
    剑指Offer-2.替换空格(C++/Java)
    MySQL学习笔记4——DQL
    MySQL学习笔记3——DCL
  • 原文地址:https://www.cnblogs.com/NaCl/p/10225411.html
Copyright © 2011-2022 走看看