内部类:
使用内部类减少了命名冲突。
一个内部类可以定义在一个类中,一个方法中甚至一个表达式中。
内部类分为四种:
静态内部类(static inner classes)
成员内部类(member inner classes)
局部内部类(local inner classes)
匿名内部类(anonymous inner classes)
1、静态内部类(static inner classes)
最简单的内部类。
只能访问外部类的静态成员变量与静态方法。
生成静态内部类对象的方法:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
1.1、相关使用例子:
静态内部类:
class StaticInner{
private static int a = 1;
public static class InnerClass{
private static int b = 1;
public void execute(){
System.out.println(a + b);
}
}
}
main方法中使用:
public static void main(String[] args) {
StaticInner.InnerClass innerClass = new StaticInner.InnerClass();
innerClass.execute();
}
2、成员内部类(member inner classes):
成员内部类可以访问外部类的静态与非静态的方法和成员变量。
生成成员内部类对象的方法:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
在局部内部类中访问外部类的成员变量的方法:
2.1、相关使用例子:
成员内部类:
class MemberInner{
private int a = 1;
public void execute(){
InnerClass innerClass = this.new InnerClass();
}
public class InnerClass{
private int a = 2;
public void execute(){
System.out.println(this.a);
System.out.println(MemberInner.this.a);
}
}
}
在main方法中使用:
public static void main(String[] args) {
MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
innerClass.execute();
}
3、局部内部类(local inner classes):
类似于局部变量,不能定义为public,protected,private或者static类型。
定义方法中,只能方法中声明为final类型的变量。
3.1、相关使用例子:
局部内部类:
class LocalInner{
public void execute(){
final int a = 1;
class InnerClass{
public void execute(){
System.out.println("LocalInner Class");
System.out.println(a);
}
}
new InnerClass().execute();
}
}
在main方法中使用:
public static void main(String[] args) {
LocalInner localInner = new LocalInner();
localInner.execute();
}
4、匿名内部类(anonymous inner classes):
匿名内部类没有类名,没有class关键字也没有extends和implements等关键字修饰。
匿名内部类会隐式地继承一个父类或实现一个接口。
4.1、相关使用例子:
public static void main(String[] args) {
AnonymousInnerClassTest test = new AnonymousInnerClassTest();
test.print(new Date(){
@Override
public String toString() {
return "Hello world.";
}
});
JButton button = new JButton();
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("使用匿名内部类实现ActionListener接口");
}
});
}
public void print(Date date){
System.out.println(date);
}