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); } }