Java内部类
1.成员(普通)内部类
-
public class Outer{ public class Inner{} }
-
依赖外部类对象而存在
-
成员内部类中,不能定义静态成员
1.1外部类调用内部类
//怎样调用成员变量,就可以怎样调用成员内部类, //(是指,非静态可以直接调用静态,静态不可直接调用非静态这方面) public class Outer{ //成员内部类 public class Inner{public void in();} //外部类的非静态方法,访问成员内部类 public void out(){ Inner inner=new Inner(); inner.in(); } //外部类的静态方法,访问成员内部类 public static void outSta(){ Outer out=new Outer(); Inner inner=out.new Inner(); inner.in(); } }
1.2内部类调用外部类
public class Outer{ private int id=10; public void out(){System.out.println("这是外部类的方法");} public class Inner{ public void in(){System.out.println("这是内部类的方法");} //获得外部类的私有属性 public void getId(){ System.out.println(id);//10 } //调用外部类的方法 Outer.this.out(); } }
2.静态内部类
-
public class Outer{ static class Inner{} }
-
不需要依赖其外部类对象
-
静态内部类中也无法访问外部类的非静态成员
-
静态内部类可以用public,protected,private修饰
-
外部类可以访问内部类对象所有访问权限的成员
-
详解:外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员,和普通内部类相同。
2.1外部类调用内部类
//静态内部类 public static class Inner{public void in();} //能怎样调用静态属性就能怎样调用静态内部类 new Outer.Inner().in();//类. 调用方式
2.2内部类调用外部类
public static class Inner{} //此时,System.out.println(id),获取不到id,解决方法,id修改为静态
3.局部内部类
-
public class Outer{ public void out(){ public class Inner{} } }
-
其声明在一个方法体 / 一段代码块的内部,
-
在局部内部类前不加修饰符public和private,其范围为定义它的
代码块
-
不在定义类的定义域之内便无法使用,只能在out()方法中使用
-
可以任意访问该方法out()内的局部变量
-
其提供的功能使用匿名内部类都可以实现,而本身匿名内部类可以写得比它更简洁,
-
因此局部内部类用的比较少
4.匿名内部类
-
是局部内部类的简要写法,可以在不声明类名的情况下,继承其他类并创建对象
-
作用范围和局部内部类完全一致
-
有多种形式,其中最常见的一种形式莫过于在方法参数中新建一个接口对象 / 类对象,并且实现这个接口声明 / 类中原有的方法了
-
// 1自定义接口 interface Inner { void in(int i); } private void demo() { // 在这个过程中会新建一个匿名内部类对象, // 这个匿名内部类实现了Inner 接口并重写 in 方法 Inner inner = new Inner() { // 可以在内部类中定义属性,但是只能在当前内部类中使用, // 无法在外部类中使用,因为外部类无法获取当前匿名内部类的类名, // 也就无法创建匿名内部类的对象 public void in(int i){ System.out.println("demo") } }
-
//2新建一个类对象 // new Object() 过程会新建一个匿名内部类,继承于 Object 类, // 并重写了 toString() 方法 clickListener.onClick(new Object() { @Override public String toString() { return "hhh"; } });
5.总结
-
静态内部类,作用范围,就像静态变量一样
- 成员内部类,作用范围,就像成员变量一样
- 局部、匿名内部类,作用范围,就像局部变量一样
-
访问范围可以由内而外,不可,由外而内
-
局部内部类,可以访问,静态属性、静态内部类
-
静态内部类,访问不了,局部内部类
-
6.使用情况
当不想让这个类,被外部访问时,可以使用内部类。对内,想要访问某些内部数据时,就得用到内部类,比如一些类的私有属性。
- 只想让类内部使用,就可以定义一个静态内部类
- 只是某个方法需要用到,就可以使用匿名内部类
在实际开发中,用的最多的就是静态内部类、匿名内部类。
Java8可以将匿名内部类写成lambda表达式,能够极大简化代码。