接口与内部类

接口

重难点总结:
1、接口中的所有方法自动地属于public,在接口声明方法时,不必提供关键字public,但是在实现接口 编写具体的接口方法时,需要加上public修饰符。

2、在接口中可以定义常量(默认就是用public static final修饰)。接口中绝对不能含有实例域或静态方法,也不能在接口中实现方法。

3、接口看成是没有实例域的抽象方法。

4、Java程序设计语言是一种强类型语言,在调用方法的时候,编译器将会检查这个方法是否存在。

5、不能构造接口的对象,却能声明接口的变量,接口变量必须引用实现了接口的类对象。

6、接口之间通过继承关系扩展接口。

克隆

对象的克隆是指创建一个新对象,且新对象的状态与原始对象的状态相同。当对克隆的新对象进行修改时,不会影响原始对象的状态。

接口与回调

回调可以指出某个特定事件发生时应该采取的动作,需要实现接口中的方法。

内部类

内部类

顾名思义在类中再定义一个类。

public class A{
int i = 100;
class innerClass{
int m = i;
}
}
  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
  • 内部类可以对同一个包中的其他类隐藏起来
  • 定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便携

值得注意的是,外围类的引用在构造器中设置。编译器修改了所有的内部类的构造器,添加一个外围类的引用参数。因此内部类的对象有一个隐式引用,它指向创建它的外部类对象。
所以内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域。

局部内部类

一个类的方法体中定义的类。

public class A{
int i = 100;
public void innerClass(){
class B{
int m = i;
}
}
}

局部类 不能用public或private访问说明符进行声明,他的作用域被限定在声明这个局部类的块中。
局部类有一个优势,即对外部世界可以完全隐藏起来。

匿名内部类

一个类在new 创建一个对象实例时,直接实现其中的接口方法

ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){...}
};

静态内部类

使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围对象。为此,可以将内部类声明为static,以便取消产生的引用。

public class A{
static int i = 100;
static class B{
int m = i;
}
}