什么是内部类:static nested class 和 inner class类的不同
内部类就是定义在类内部的一个类,内部类内部不可以定义静态成员,因为静态成员是属于类的,不属于某一个实例,只是找一个容身之处,特意定在内部类中是没有意义的,内部类可以访问外部类的成员所以这样是没有意义的,没有意义的事情就应该被禁止
内部类的分类
按照定义的位置分:方法外、方法内 按照类型分:静态内部类和实例内部类(非静态内部类)
第一种: 在方法外部定义的实例内部类
可以添加访问权限public,protected,默认的,private等,相当于类的一个成员
创建内部类的实例:首先要创建外部类的实例,通过外部类的实例创建内部类的实例
class Outer{ public class Inner{ } } //创建内部类的实例 Outer out = new Outer(); out.Inner inner = out.new Outer();
内部类可以直接访问外部类的静态成员和非静态成员
外部类访问内部类的成员需要内部类的实例
第二种: 定义在方法外的静态内部类
静态内部类的访问权限可以是public,protected,默认的,private等 静态内部类类似于外部类的一个静态成员,内部类可以直接使用外部类的静态的资源 外部类访问内部类可以直接在外部类中使用内部类的名字访问内部类的静态资源,如果需要访问非静态资源需要实例化内部类对象
public class Outer { int a = 3; public int c = 5; static int b = 4; public void read() { System.out.println(Inner.a); } static class Inner{ static int a = 3; int b = 4; public void read() { System.out.println(b); } } } //访问内部类静态成员 class OuterTest{ public void test1(){ System.out.println(Outer.Inner.a); } }
第三种: 定义在方法内的实例内部类
类似于方法的一个局部变量,只有先实例化才可以使用 方法实例内部类不可以有访问修饰符,就好像局部变量一样不能有访问修饰符 方法实例内部类可以添加final 和abstract修饰符 方法内部类内部可以方法方法的局部变量,但是方法的局部变量必须添加final关键字修饰 方法内部类可以访问外部类的静态和 非静态成员 这种类对于其他类是不可访问的,但是这种内部类创建的实例可以传递给其他类,必须先定义在使用,就好像局部变量一样
public class Outer { int a = 3; public int c = 5; static int b = 4; public void read2() { class Inner2{ // 好像局部变量一样可以访问外部类的成员 int f = a; int e = b; public void doread() { System.out.println(a + " : " + b); } } // 方法内部类不能被外部类所实例,只能定义好后才可以 使用 new Inner2().doread(); } }
为了简化,可以使用匿名内部类,及定义了某一个接口和父类的子类的时候还创建了对象
public void test() { new Thread() { public void run() { super.run(); } }.start(); }
第四种:静态方法内定义的内部类,
这个内部类不可以加static关键字 与普通方法内定义的内部类相似,可以访问外部类的静态成员,但是不可以直接访问外部类的非静态成员 可以访问方法内的局部变量,但是必须是final修饰的
内部类可以访问包含它的类的成员吗?有什么限制
如果不是静态的内部类就是可以的 如果是静态的内部类,只可以访问静态的成员