细说Java内部类
1. 内部类
内部类是指一个外部类在其内部再定义一个类,内部类是作为外部类的一个成员,并且依附于外部类而存在。
内部类主要分为:成员内部类、局部内部类、匿名内部类。
内部类存在有何意义
内部类之所以存在,是为了更好的解决Java中单继承的缺陷,因为内部类可以独立继承某个类或是接口,外部类的继承对于内部类没有任何影响。
2. 成员内部类
1. 非静态成员内部类
public class OuterClass {
private String outerA ;
public static String outerB = "OuterClass static property b ";
public OuterClass(){
this.outerA = "OuterClass property a" ;
}
//非静态内部类中不能有静态变量、静态方法
public class InnerClass{
private String innerA ;
public String innerB ;
public InnerClass(){
this.innerA = "InnerClass property private a " ;
this.innerB = "InnerClass property b " ;
}
//说明内部类可以访问外部类的所有属性和方法(包括静态方法)
public void print(){
System.out.println(outerA);
System.out.println(outerB);
OuterClass.this.print();
printStatic();
}
}
//方法内注释掉的都是报错的
//外部类的成员方法只能通过创建内部类对象来访问
public void print(){
InnerClass innerClass = new InnerClass() ;
// System.out.println(innerA);
// System.out.println(innerB);
System.out.println(innerClass.innerA);
System.out.println(innerClass.innerB);
}
//外部类的静态方法不能访问内部类
public static void printStatic(){
// InnerClass innerClass = new InnerClass() ;
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass() ;
// OuterClass.InnerClass innerClass = new InnerClass() ;
outerClass.print();
}
}
2. 静态成员内部类
静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。
public class OuterClass {
private String outerA ;
public static String outerB = "OuterClass static property b ";
public OuterClass(){
this.outerA = "OuterClass property a" ;
}
public static class InnerClass{
private String innerA ;
public String innerB ;
public InnerClass(){
this.innerA = "InnerClass property private a " ;
this.innerB = "InnerClass property b " ;
}
//静态内部类不能访问外部非静态方法
public void print(){
// System.out.println(outerA);
System.out.println(outerB);
// OuterClass.this.print();
printStatic();
}
public static void printInnerState(){
}
}
//访问静态内部类
public void print(){
InnerClass innerClass = new InnerClass() ;
// System.out.println(innerA);
// System.out.println(innerB);
System.out.println(innerClass.innerA);
System.out.println(innerClass.innerB);
}
//外部类的静态方法可以访问静态内部类的静态方法
public static void printStatic(){
InnerClass.printInnerState();
}
//静态内部类可以脱离外部类而使用
public static void main(String[] args) {
OuterClass outerClass = new OuterClass() ;
// OuterClass.InnerClass innerClass = new InnerClass() ;
InnerClass innerClass = new InnerClass() ;
outerClass.print();
}
}
2. 局部内部类
局部内部类是嵌套在方法体或者作用域中的,是为了解决一些比较复杂的问题,想要创建一个类,但是又不希望这个类被公用。
public class LocalInnerClassDemo {
//局部内部类的作用域只在此方法内
public static void main(String[] args) {
class Inner{
private String name ;
public Inner(String name) {
this.name = name;
}
}
Inner inner = new Inner("local inner class") ;
System.out.println(inner.name);
}
}
3. 匿名内部类
匿名内部类顾名思义,就是没有类名的一种类,这个在很多地方都是使用过。
一般定义的匿名内部类只使用一次。
public class AnonymousInnerClass {
public static void main(String[] args) {
//匿名内部类没有访问修饰符
//匿名内部类也没有构造方法,只是单纯的实现功能
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0 ; i<100 ; i++){
System.out.println(i);
}
}
}) ;
}
}