美文网首页
java - 内部类

java - 内部类

作者: 司鑫 | 来源:发表于2017-08-07 19:28 被阅读14次
    一 定义

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

    二 特性

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

    • 内部类可以用多个实例,每个实例都有自己的信息状态,并且与外围对象的信息相互独立
    • 在单个外围中,可以让多个内部类以不同的方式实现接口或继承不同的类(实现多继承)
    • 内部类并没有要迷人的 “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 - 内部类

          本文链接:https://www.haomeiwen.com/subject/cxbalxtx.html