java - 内部类

一 定义

内部类就是将一个类的定义放在另一个类的定义内部。

二 特性

内部类最大的一个优点就是每个内部类都能独立的继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

  • 内部类可以用多个实例,每个实例都有自己的信息状态,并且与外围对象的信息相互独立
  • 在单个外围中,可以让多个内部类以不同的方式实现接口或继承不同的类(实现多继承)
  • 内部类并没有要迷人的 “is-a” 关系,它就是一个独立的实体
  • 内部类的创建不需要依赖外部类的创建
  • 内部类提供了更好的封装,除了外围类其它类都不可以进行访问
三 内部类的创建

外围类中的内部类可以无限的访问外围类的属性和方法,内部类只有在编译期中存在,当编译成功后,那么内部类便会和外围类分离,生成两个类OutterClass.classOuterClass$InnerClass.class

public class OuterClass {
    private String name ;
    private int age;

    /**省略getter和setter方法**/
    
    public class InnerClass{
        public InnerClass(){
            name = "小毛毛";
            age = 20;
        }
        
        public void display(){
            System.out.println("name:" + getName() +"   ;age:" + getAge());
        }
    }
    
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass(); //创建一个内部类
        innerClass.display();
    }
}
四 内部类的种类

  • 成员内部类
    成员内部类是最简单的内部类,它相当于是外围类的一个成员,可以随意的访问外围了的任何属性和方法(包括 private 修饰的),但如果外围类要访问内部类的话,就需要使用内部类的实例来访问。
    在成员内部类中需要注意:

    1. 成员内部类中不可以有 static 修饰的属性和方法
    2. 创建内部类前需要先创建外部类
  • 局部内部类
    局部内部类存在与外围类的方法或作用域中,它只能在该方法或作用域中被使用,出了该范围便不能被访问。

public class Parcel5 {
    public Destionation destionation(String str){
        class PDestionation implements Destionation{
            private String label;
            private PDestionation(String whereTo){
                label = whereTo;
            }
            public String readLabel(){
                return label;
            }
        }
        return new PDestionation(str);
    }
    
    public static void main(String[] args) {
        Parcel5 parcel5 = new Parcel5();
        Destionation d = parcel5.destionation("小毛毛");
    }
}
  • 静态内部类
    一个被 static 修饰的内部类被称为是静态内部类,也被称为是嵌套内部类。被 static 修饰也就是意味着:

    1. 静态内部类的创建并不依赖与外围类的创建
    2. 它不能访问外围类的任何非 static 修饰的变量或方法
  • 匿名内部类
    匿名内部类也就是没有名字的内部类,在 swing 编程中我们使用的比较多。

public class OuterClass {
    public InnerClass getInnerClass(final int num,String str2){
        return new InnerClass(){
            int number = num + 1;
            public int getNumber(){
                return number;
            }
        };   
    }
    
    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        InnerClass inner = out.getInnerClass(2, "小毛毛");
        System.out.println(inner.getNumber());
    }
}

interface InnerClass {
    int getNumber();
}

对于匿名内部类来说

  • 不需要任何修饰符
  • 如果在匿名内部类中使用了非该类中的属性或方法,那么被使用的属性或方法就必须要被设置为 final
  • 匿名内部类不存在构造方法

你可能感兴趣的:(java - 内部类)