标记接口:普
通的接口的通常目的是保证类实现了某个或某组方法。而标记接口没有方法,像Cloneable 接口是Java提供的几个标记接口之一。使用标记接口的唯一目的是使得可以用instanceof进行 类型查询:
if(Obj instanceof Cloneable) ...
内部类: 分为:内部类、局部内部类、匿名内部类、静态内部类几种。
内部类:定
义在类的内部,可以用public、private访问指示符来修饰声明。如果是private级
别的话则属于外部类的私有内部类,只有这个外部类的方法才能生成内
部类的对象。
所以我们说只有内部类才是私有的,普通类总是具有包可见性或公有可见性。
内部类的方法可以访问它所在的外部类的实例字段,这是通过编译器添加的隐性的
字段来实现的。
eg:
class BankAccount{
public BankAccount (double
initBalance){
balance =
initBalance;
}
private double balance;
public void start(double rate){
ActionListener adder = new
InterestAdder(rate);
Timer t = new Timer(1000, adder);
t.start();
}
private class InterestAdder
implements ActionListener{
public InterestAdder (double aRate){
rate = aRate;
}
public void actionPerformed(ActionEvent
event){
double interest = balance * rate
/ 100;
balance += interest;
NumberFormat formatter
= NumberFormat.getCurrencyInstance();
System.out.println("balance=" +
formatter.format(balance));
}
private double rate;
}
}
在
内部类的方法中,有一个隐含的外部类引用,例如内部类中的actionPerformed的方
法中可以的显示的表示为:
double interest = BankAccount.this.balance * this.rate /100;
内部对象的构造器即可显示的表示为:
Outerobject.new InnerClass(Construction paramters);
即:
ActionListener adder = this.new InterestAdder(rate);
局部内部类:定义在方法内部的类,不用访问指示符来修饰。当只要在一个范围内使用该类的情
况下使用局部内部类。其好处在于对外界完全隐藏,仅有定义该类的方法能够使用
该类。可以访问外部类的实例字段,还可以访问该方法的局部变量。不过需要被访
问的局部变量必须被声明为final的。
匿名内部类:匿名内部类即局部内部类,不过我们仅仅需要一个类的对象,所以在定义的时候,
连类的名字都不必指定。
eg:
public
void start(final double rate){
ActionListener adder = new
ActionListener(){
public void actionPerformed(ActionEvent event){
double interest = balance * rate
/ 100;
balance += interest;
NumberFormat formatter
=
NumberFormat.getCurrencyInstance();
System.out.println("balance="+formatter.format(balance);
}
}
}
其中用于构造对象的任意参数都要放在超类型名字后的括号后,即:
new superclass(construction parameter)
这
里的超类型可以是接口,那么内部类实现这个接口;也可以是类,那么内部类扩
展这个类。
内部类没有构造器,如果内部类是扩展外部类,那么构造参数将被送到超类的构造
器中;如果内部类是用来实现接口,则没有任何构造参数,不过必须保留括号。
静态内部类:静
态内部类用于只为了隐藏某个类在另一类内部,而不需要内部类对外部类对象的
引用。这是可以把内部类生命为static的来去掉编译器添加的引用。除了没有对外
部类对象的引用,静态内部类同其他内部类都一样。而如果某个内部类对象是在静
态方法中构造的话,这个内部类也必须声明成静态内部类。
内部类总结:1、内部类对象能够访问创建它的对象的实现--包括那些私有数据。
2、内部类能够隐藏起来,不为同一包中的其他类所见。
3、匿名内部类可以方便地定义运行时回调。
4、使用内部类在编写事件驱动的程序使用起来很方便。
代理:(这个等等再看,看了再记。)