JAVA 内部类的整理记录| 参考JAVA核心卷一第五版

内部类

定义在类内部的类或方法中的类

优势:

  • 内部类方法可以访问该类所在作用于中的任何属性(包含private);

  • 同一包下的其他类无法访问到内部类;

  • 针对回调函数可以使用匿名内部类;

    public class demo3 {
        public static void main(String[] args) {
            User user = new User("a", 10);
            User.Inner inner = user.getInner();// new不出来
            System.out.println(user.toString());
            inner.setName("b");
            System.out.println(user.toString());
    
            }
    }
    
    class User implements Serializable {
        private String name;
        private transient Integer age;
        private Inner inner = new Inner();
    
        User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        public Inner getInner() {
            return inner;
        }
    
    
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        // User$Inner.class
        class Inner {
            private Integer id;
    
            // 形参换成name 就没办法了
            public void setName(String names) {
                name = names;
            }
        }
    }
    
  • 内部类中的静态域都是final。因为每个外部类实例都会有个内部类实例,如果这个内部类静态域不是final,每个内部类的静态域将不是唯一的(静态内部类可以有静态域和方法);

  • 内部类中不能有static方法;

  • 编译器将会把内部类翻译成用 $ (美元符号)分隔外部类名与内部类名的常规类文件, 而虚拟机则对此一无所知;

  • 内部类的修饰符决定了能否通过外部类.的方式访问,内部类中可以再定义内部类;public protected可以访问, private 不能访问, 不写应该是public

局部内部类

class User implements Serializable {
private String name;
private transient Integer age;
private Inner inner = new Inner();

User(String name, Integer age) {
    this.name = name;
    this.age = age;
}
public Inner getInner() {
    return inner;
}

@Override
public String toString() {
    return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

class Inner {
    private Integer id;

    // 形参换成name 就没办法了
    public void setName(String names) {
        class InMethod {
            public void setName(String names) {
                name = names;
            }
        }
        new InMethod().setName(names);
    }

    class InnerIn {
        public void setName1(String names) {
            name = names;
            id = 1;
            }
        }
    }
}
  • 局部类不能用 public 或 private 访问说明符进行声明。它的作用域被限定在声明这个局部类的块中;
  • 局部类有一个优势, 即对外部可以完全地隐藏起来;

匿名内部类

new SuperType(construction parameters) {
    inner class methods and data
}

你可能感兴趣的:(JAVA)