java内部类总结

1.内部类相关

匿名内部类特征:

  • 没有类名
  • 没有构造函数
  • 只能使用一次
  • 必须继承一个父类或者实现一个接口
    为什么匿名内部类中访问方法形参要设置成final## 标题
    原因:因为内部类和外部类会编译成不同的class文件,访问形参时,内部类对属性的修改,并不会影响到外部的形参,所以为了保证数据一致性,需要定义成final类型,防止内部类修改
内部类分类:
  • 内部类对象不仅指向该内部类,还指向实例化该内部类的外部类对象 的内存。
  • 内部类和普通类一样可以重写Object类的方法,如toString方法;并 且有构造函数,执行顺序依旧是先初始化属性,再执行构造函数
  • 在编译完之后,会出现(外部类.class)和(外部类$内部类.class) 两个类文件名。
  • 内部类可以被修饰为private,只能被外部类所访问。事实上一般也都 是如此书写。
  • 内部类可以被写在外部类的任意位置,如成员位置,方法内
成员内部类

该内部类相当于位于外部类的成员的位置。该内部类可以
访问外部类的所有成员和方法,即使是private

public class Outer {
    public class Inner {
        public void print(String str) {
            System.out.println(str);
        }
    }
}

创建内部类对象方式

Outer outer = new Outer(); 
Outer.Inner inner = outer.new Inner();
静态内部类

该类被修饰为static。同时作为静态内部类,他不能访问外部类非静态 的成员或方法。

public class Outer {
    public static void outer(){
    }
    public void outer1(){
    }
    static class Inner {
        public void inner() {
            outer();
            outer1();//会报错,不能直接访问
        }
    }
}

创建内部类对象方式:

Inner inner=new Outer.Inner();
方法内部类
  • 可以访问外部类中的成员
  • 不能被static private 修饰,因为他不再是成员位置,只有成员才能被
    修饰为static…
  • 因此内部类不能有静态成员
  • 内部类要访问外部方法中的局部变量时,该局部变量需要被修饰成
    nal。
public class Outer {
    private int a=0;
    public static void outer(){
    }
    public void outer1(){
        final int a=0;
        class Inner{
            public void inner(){
                outer1();
                outer();
                System.out.println(a);
            }
        }
    }
}

内部类的访问

  • 静态时,静态内部类只能访问外部类静态成员;非静态内部类都可以直 接访问。(原因是:内部类有一个外部类名.this的指引)当访问外部 类静态成员出现重名时,通过(外部类名.静态成员变量名)访问。如,
    Out.show();
  • 重名情况下,非静态时,内部类访问自己内部类通过this.变量名。访
    问外部类通过(外部类名.this.变量名)访问 。如 Out.this.show();
  • 在没有重名的情况下,无论静态非静态,内部类直接通过变量名访问
    Out outer = new Out();
    Out.In inner = outer.new In(); //第一个Out是为了说 明该内部类到底属于哪个外部类
    外部成员变量。

外部类的访问

  • 内部类为非静态时,外部类访问内部类,必须建立内部类对象。建立 对象方法,如前所述。
  • 内部类为静态时, 外部类访问非静态成员,通过(外部类对象名.内 部类名.方法名)访问,如new Out().In.function();
  • 内部类为静态时,外部类访问静态成员时,直接通过(外部类名.内部 类名.方法名) ,如 Out.In.funchtion();

你可能感兴趣的:(java学习,面试总结,java)