`

内部类

    博客分类:
  • java
阅读更多
package InnerClass;
//内部类可以继承其他的类,也可以作为一个接口,由另一个内部类实现
//但匿名内部类(没有名字的类)不能继承其他的类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

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


public class InnerClassTest{
	public static void main(String[] args) {
		BankAccount account = new BankAccount(10000);
		account.start(10);
		
		JOptionPane.showMessageDialog(null, "Quit programe");
		System.exit(0);
	}
}

class BankAccount {

	private double balance;
	
	public BankAccount(double initialBanlance){
		balance = initialBanlance;
	}
	
	public void start(double rate){
		ActionListener adder = new InterestAdder(rate);
		//在指定时间间隔触发一个或多个 ActionEvent
		Timer t = new Timer(1000, adder);
		t.start();		
	}
	
	/**
	 * 内部类的定义:
	 * 内部类具有外部类的引用
	 * @author Administrator	 *
	 */
	public class InterestAdder implements ActionListener{
		
		private double rate;
		
		public InterestAdder(double aRate){
			rate = aRate;
		}

		public void actionPerformed(ActionEvent e) {
			//balance是外部类的属性
			double interest = balance * rate /100;
			balance += interest;
			
			NumberFormat formatter = NumberFormat.getCurrencyInstance();
			System.out.println("balance=" + formatter.format(balance));
		}
	}
	
}



package InnerClass;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

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


public class LocalInnerClassTest{
	public static void main(String[] args) {
		BankAccount account = new BankAccount(10000);
		account.start(10);
		
		JOptionPane.showMessageDialog(null, "Quit programe");
		System.exit(0);
	}
}

class BankAccount2 {

	private double balance;
	
	public BankAccount2(double initialBanlance){
		balance = initialBanlance;
	}
	
	public void start(final double rate){
		//局部内部类的定义,局部内部类不适用访问修饰符来声明
		//局部内部类不仅能访问外部类的字段,甚至还可以访问局部变量!不过,哪些局部变量必须要被声明为final的
		class InterestAdder implements ActionListener{
			
//			private double rate;

			public void actionPerformed(ActionEvent e) {
				//balance是外部类的属性
				double interest = balance * rate /100;
				balance += interest;
				
				NumberFormat formatter = NumberFormat.getCurrencyInstance();
				System.out.println("balance=" + formatter.format(balance));
			}
		}
		
		ActionListener adder = new InterestAdder();
		//在指定时间间隔触发一个或多个 ActionEvent
		Timer t = new Timer(1000, adder);
		t.start();		
	}
	
	//匿名内部类:
//	 在使用匿名内部类时,要记住以下几个原则: 
//	  匿名内部类不能有构造方法。   
//	   匿名内部类不能定义任何静态成员、方法和类。   
//	  匿名内部类不能是public,protected,private,static。   
//	  只能创建匿名内部类的一个实例。 
//	    一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。   
//	  因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
	/*
	 public void start(final double rate){
	 
		ActionListener adder = new ActionListener(){
		
			public void actionPerformed(ActionEvent e) {
				//balance是外部类的属性
				double interest = balance * rate /100;
				balance += interest;
				
				NumberFormat formatter = NumberFormat.getCurrencyInstance();
				System.out.println("balance=" + formatter.format(balance));
			}
		};
		//在指定时间间隔触发一个或多个 ActionEvent
		Timer t = new Timer(1000, adder);
		t.start();		
	}
	 
	 *
	 */
	
}



package InnerClass;

//有时候,使用内部类只是为了把一个类隐藏在另一个类中,并不需要内部类具有对外部类对象的引用。
//这种情况下,可以把内部类声明为static的以去掉生成的引用
public class StaticInnerClassTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		double [] d  = new double[20];
		for(int i=0; i<d.length ; i++){
			d[i] = 100*Math.random();
		}
		//可以通过OutClass.innerClass来使用内部类
		ArrayAlg.Pair p = ArrayAlg.minmax(d);
		System.out.println("min==" + p.getFirst());
		System.out.println("min==" + p.getSecond());

	}
}

class ArrayAlg{

	public static class Pair{

		private double first;
		private double second;

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

		public double getFirst(){
			return first;
		}

		public double getSecond(){
			return second;
		}
	}

	public static Pair minmax(double[] d){
		if(d.length == 0 ) return new Pair(0,0);
		double min = d[0];
		double max = d[0];
		for(int i=0; i<d.length ; i++){
			if(min > d[i]) min = d[i];
			if(max < d[i]) max = d[i];
		}
		return new Pair(min,max);
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics