内部类

本文深入探讨了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);
}

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值