JAVA——内部类的那些事儿

183 阅读2分钟

  package innerClass;

  public class InnerClassTester {

  public static void main(String[] args) {

  //1 创建内部类对象

  Outer.Inner obj1 = new Outer().new Inner();

  obj1.func();

  //2 内部类私有:外部类提供public方法访问内部类方法

  Outer obj2 = new Outer();

  obj2.providePublicFunc();

  //3 静态内部类

  //3.1 访问静态内部类的非静态方法

  Outer.StaInner obj3 = new Outer.StaInner();

  obj3.func();

  //3.2 访问静态内部类的静态方法(通过类名访问)

  Outer.StaInner.staFunc();

  //4 局部内部类访问局部变量

  Outer obj4 = new Outer();

  obj4.local();

  //5 匿名内部类

  Outer obj5 = new Outer();

  obj5.anonymous();

  //6 匿名内部类作为参数

  asPara(new AbstractClass() {

  public void func() {

  System.out.println(匿名内部类作为参数);

  }

  });

  }

  public static void asPara(AbstractClass ac) {

  ac.func();

  }

  }

  //抽象类:作为匿名内部类存在的前提(前提:存在一个类(具体类或者抽象类)或者接口)

  abstract class AbstractClass{

  public abstract void func();

  }

  //外部类

  class Outer{

  private String hello = 内部类可以访问外部类数据成员(包括私有成员);

  //内部类------------------------------

  class Inner{

  public void func() {

  //内部类获取了外部类的引用Outer.this

  System.out.println(Outer.this.hello);

  System.out.println(hello);

  }

  }

  //内部类私有---------------------------

  private class PriInner{

  public void func() {

  System.out.println(内部类私有,外部类提供public方法访问);

  }

  }

  //外部类提供public方法访问

  public void providePublicFunc() {

  PriInner pi = new PriInner();

  pi.func();

  }

  //静态内部类--------------------------

  static class StaInner{

  //非静态方法

  public void func() {

  System.out.println(静态内部类的非静态方法);

  }

  //静态方法

  public static void staFunc() {

  System.out.println(静态内部类的静态方法);

  }

  }

  //局部内部类---------------------------

  //外部类中的成员方法local()

  public void local() {

  final String str = 局部内部类访问局部变量;

  class LocInner{

  public void func() {

  //访问的局部变量要用final修饰,但jdk1.8不用

  System.out.println(str);

  }

  }

  //局部内部类只能在方法中访问

  LocInner li = new LocInner();

  li.func();

  }

  /*匿名内部类(是一个内部类) 前提:存在一个类(具体类或者抽象类)或者接口

  * 本质:继承了该类或者实现该接口的一个子类匿名对象

  * */

  //外部类中的成员方法anonymous()

  public void anonymous(){

  new AbstractClass() {

  public void func() {

  System.out.println(重写抽象类中func()抽象方法);

  }

  }.func();

  /*

  相当于一个继承了AbstractClass的子类的一个对象obj,然后,obj.func();

  思考1:若AbstractClass中还有一个抽象方法func1(),怎么调用?

  方法:

  AbstractClass ac = new AbstractClass() {

  public void func() {

  System.out.println(重写抽象类中func()抽象方法);

  }

  public void func1(){

  System.out.println(重写抽象类中func1()抽象方法);

  }

  }

  ac.func();

  ac.func();

  思考2:若匿名内部类中有自己定义的方法myFunc(),how?

  思路:向下强转?but子类的类名是什么?

  所以,匿名内部类针对一个方法比较好

  * */

  }

  }

  运行结果:

  

图片描述