Java InnerClass(内部类)

示例代码--测试内部类、局部内部类、匿名内部类:


package CoreJava;

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JOptionPane;
import javax.swing.Timer;

/**
 * 内部类--既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域
 * 内部类--总有一个隐式引用(outerClass.this),它指向创建它的外部对象
 * @author xqh
 *
 */
public class InnerClassTest {
	public static void main(String[] args) {
		TalkingClock clock = new TalkingClock(1000, true);
		clock.start();

		JOptionPane.showMessageDialog(null, "Quit program?");
		System.exit(0);
	}
}

class TalkingClock { // outerClass
	private int interval;
	private boolean beep;

	public TalkingClock(int interval, boolean beep) {
		this.interval = interval;
		this.beep = beep;
	}

	/*public void start() {
		ActionListener listener = new TimerPrinter();
		Timer t = new Timer(interval, listener);
		t.start();
	}*/

	public void start() { 
		class TimerPrinter implements ActionListener { // 局部内部类--不能用public或pirvate修饰,作用域被限定在声明这个局部内部类的块中

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				Date now = new Date();
				System.out.println("At the tone, the time is " + now);
				if (beep) // 访问outer.beep 相当于TalkingClock.this.beep
					Toolkit.getDefaultToolkit().beep();
				//if (TalkingClock.this.beep)
				//	Toolkit.getDefaultToolkit().beep();
			}

		}
		ActionListener listener = new TimerPrinter();
		Timer t = new Timer(interval, listener);
		t.start();
	}
	
	/*public class TimerPrinter implements ActionListener { //innerClass

		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			Date now = new Date();
			System.out.println("At the tone, the time is " + now);
			if (beep) // 访问outer.beep 相当于TalkingClock.this.beep
				Toolkit.getDefaultToolkit().beep();
			//if (TalkingClock.this.beep)
			//	Toolkit.getDefaultToolkit().beep();
		}

	}*/
	
	public void start(int interval, final boolean beep) { //匿名内部类
		ActionListener listener = new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				Date now = new Date();
				System.out.println("At the tone ,the time is " + now);
				if (beep) Toolkit.getDefaultToolkit().beep();
			}
			
		};
		Timer t = new Timer(interval, listener);
		t.start();
	}
	
}

示例代码--测试静态内部类:

package CoreJava;

/**
 * StaticInnerClass--使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围对象。为此,可以将内部类声明为static,以便取消产生的引用
 * StaticInnerClass的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
 * @author xqh
 *
 */
public class StaticInnerClassTest {
	public static void main(String[] args) {
		double[] d = new double[20];
		for (int i = 0; i < d.length; i++) {
			d[i] = 100 * Math.random();
		}
		ArrayAlg.Pair p = ArrayAlg.minmax(d);
		System.out.println("min = " + p.getFirst());
		System.out.println("max = " + p.getSecond());
	}
}

class ArrayAlg {
	
	public static class Pair { //StaticInnerClass--不需要访问外围类对象的时候,应该使用静态内部类
		private double first;
		private double second;
		
		public double getFirst() {
			return first;
		}

		public void setFirst(double first) {
			this.first = first;
		}

		public double getSecond() {
			return second;
		}

		public void setSecond(double second) {
			this.second = second;
		}

		public Pair(double f, double s) {
			first = f;
			second = s;
		}

	}
	
	public static Pair minmax(double[] values) {
		double min = Double.MIN_VALUE;
		double max = Double.MAX_VALUE;
		
		for (double v : values) {
			if (min > v) min = v;
			if (max < v) max = v;
		}
		
		return new Pair(min, max);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值