Java的内部类

313 阅读3分钟

内部类定义

把一个类放到另一个的定义称为内部类

内部类的作用

*内部类提供了更好的封装,只能由外部类直接访问,不能由同一个包中的其他类访问

*内部类可以直接访问外部类的私有属性,内部类被当成外部类的成员。

*外部类不能访问内部类的内部属性

内部类的使用场景

由于内部类使用了更好的封装性,并且可以很方便的访问到外部类的属性,所以通常情况下内部类只在为为外部类提供服务的情况下优先使用

内部类的分类

*成员内部类(可以使用public、procted、private进行修饰)

  • 成员内部类中不能存在任何static变量和方法
  • 成员内部类依附于外部类,只有先创建了外部类才能创建内部类

*方法内部类

  • 方法内部类定义在外部类的方法中,局部内部类和成员内部类基本一致,只是它们的作用域不同,方法内部类只能在该方法中被使用,出了该方法就会失效。

*匿名内部类 (匿名内部类其实就是一个没有名字的方法内部类,所以它符合方法内部类的所有约束)

  • 匿名内部类是没有访问修饰符的。
  • 匿名内部类必须继承一个抽象类或者实现一个接口
  • 匿名内部类中不能存在任何静态成员或方法
  • 匿名内部类是没有构造方法的,因为它没有类名。

#匿名内部代码实例:

public class Button {

public void click(){
    //匿名内部类,实现的是ActionListener接口
    new ActionListener(){
        public void onAction(){
            System.out.println("click action...");
        }
    }.onAction();
}
//匿名内部类必须继承或实现一个已有的接口
public interface ActionListener{
    public void onAction();
}

public static void main(String[] args) {
    Button button=new Button();
    button.click();
}

}

*静态内部类(关键字static可以修饰成员变量、方法、代码块,其实它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类)

  • 静态内部类的创建是不需要依赖于外围类,可以直接创建
  • 静态内部类不可以使用任何外围类的非static成员变量和方法,而内部类则都可以

#静态内部类代码实例:

public class OuterClass {

private static String outerName;
public  int age;

static class InnerClass1{
    /* 在静态内部类中可以存在静态成员 */
    public static String _innerName = "static variable";
    public void display(){
        /*
         * 静态内部类只能访问外部类的静态成员变量和方法
         * 不能访问外部类的非静态成员变量和方法
         */
        System.out.println("OutClass name :" + outerName);
    }
}
class InnerClass2{
    /* 非静态内部类中不能存在静态成员 */
    public String _innerName = "no static variable";
    /* 非静态内部类中可以调用外部类的任何成员,不管是静态的还是非静态的 */
    public void display(){
        System.out.println("OuterClass name:" + outerName);
        System.out.println("OuterClass age:" + age);
    }
}
public void display(){
    /* 外部类能直接访问静态内部类静态元素 */
    System.out.println(InnerClass1._innerName);
    /* 静态内部类可以直接创建实例不需要依赖于外部类 */
    new InnerClass1().display();
    /* 非静态内部的创建需要依赖于外部类 */
    OuterClass.InnerClass2 inner2 = new OuterClass().new InnerClass2();
    /* 非静态内部类的成员需要使用非静态内部类的实例访问 */
    System.out.println(inner2._innerName);
    inner2.display();
}

public static void main(String[] args) {
    OuterClass outer = new OuterClass();
    outer.display();
}

}