Java中的内部类

2017-10-17  本文已影响0人  Enigmaaaaa

#内部类的定义

Java中允许在类中定义另一个类,这个定义在其他类内部的类就是内部类(嵌套类),包含内部类的类也被称为宿主类

#内部类的作用

1.内部类提供更好的封装。内部类不允许同一个包中的其他类访问该类。
2.非静态内部类可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节(比如内部类的成员变量)。
3.匿名内部类适用于创建那些仅需要一次使用的类。

#内部类与外部类定义的语法区别

tip:外部类的修饰符只有两个:public和default。

#内部类的种类

tip:类成员有:成员变量,方法,构造器和初始化块。

1.成员内部类

public class Outer{
  private int outProp=9;

  class Inner{
    private int inProp=5;
    public void acessOuterProp(){
      //非静态内部类可以直接访问外部类的私有成员
      System.out.println("外部类的outProp值:"+outProp);
    }
  }

  public void accessInnerProp(){
    //外部类不能直接访问内部类的私有成员
    //若要访问必须显式创建内部类对象
    System.out.println("内部类的InProp"+new Inner().inProp);
  }

  public static void main(String[] args){
      Outer out=new Outer();
      out.accessInnerProp();
  }
}
  1. 外部类的静态方法和静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量和创建实例。

2.局部内部类

tip:所有局部变量和局部内部类的上一级程序单元都是方法,所以没有访问控制符和static修饰。

3.匿名内部类

tip:通过继承父类创建的匿名内部类的无参构造方法是父类的构造方法。

tip:局部变量离开方法后就会失效,但匿名内部类不会,所以需要使用final修饰变量。用final修饰局部变量会使局部变量生命周期跟这个类一样。所以用final修饰后就不会出现匿名内部类想要用局部变量时局部变量被GC回收的尴尬情况。

#使用内部类

1.在外部类中使用内部类。
与平常使用类没有太大区别,注意不要在静态成员中使用非静态内部类即可。
2.在外部类外使用非静态内部类。

tip:非静态内部类的构造器必须由外部类的对象调用。

public class SubClass extends Out.In{
  //构造器 
  public SubClass(Out out){
    //这里super是SubClass的父类,所以是Out.In类
    //通过外部类的对象out调用内部类的构造器
    out.super();
  } 
}

3.在外部类外使用静态内部类

tip:静态内部类的构造器不需要外部类对象调用。

#总结

为什么Java要引入内部类的概念呢?

那是因为内部类具有一般类不具备的优点。

  1. 内部类提供更好的封装。内部类可以使用private或protected修饰而外部类不行。
  2. 内部类可以实现多继承。Java不像C++允许多继承,但是用内部类可以实现Java中的多继承。在一个类中可以用两个或多个内部类继承不同的父类实现多继承。

通过以上学习,我们对Java中内部类有了一些了解,这对以后我们学习Java8新增的Lambda表达式有一些概念性的铺垫,关于Java中的Lambda表达式我以后会更新。希望这篇文章能对学习内部类的你们有一些小帮助。

上一篇下一篇

猜你喜欢

热点阅读