Java内部类使用总结

1.什么是内部类?
  定义在类内部的类,称之为内部类

public class Out{   class In{ //此时In就是内部类   } }

2.为什么要使用内部类?
  1),增强封装,把内部类隐藏在外部类中,不允许其他类来访问内部类
  2),内部类能提高代码的可读性和可维护性

3.内部类的分类
  对于内部类的分类,可以对比于成员变量的分类.
  我们可以根据不同的修饰符或者定义的不同位置把成员变量,可以细分为:类成员变量,实例成员变量,局部变量.
  内部类看做是外部类的一个成员,那么内部类可以使用public/缺省/protected/private修饰.还可以是static修饰.
  同理,内部类也根据使用不同的修饰符或者定义的不同位置,将其分成4类:

  1),实例内部类:内部类没有使用static修饰
  2),静态内部类:内部类使用static修饰
  3),局部内部类:在方法中定义的内部类
  4),匿名内部类:只能使用一次,属于内部类的一种特殊情况

3.1实例内部类:
  1)定义:实例内部类,即没有使用static修饰的内部类.这说明,实例内部类属于外部类的对象,不属于外部类本身(类比字段).
  2)创建实例内部类

//外部类 class Outter { // 实例内部类:没有使用static修饰 class Inner { } } public class InnerDemo1 { public static void main(String[] args) { // 创建实例内部类,没有使用static修饰,属于外部类的对象,因此,创建实例内部类前,必须存在外部类对象 Outter out = new Outter(); // 通过外部类对象创建内部类对象 Outter.Inner in = out.new Inner(); } }

  3)特点:

    a.由创建实例内部类的过程可知,当存在内部类对象时,一定存在外部类对象.

    b.实例内部类的实例自动持有外部类的实例的引用,实例内部类可以无条件访问外部类的所有字段和方法

    注意:当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象

    c.外部类中不能直接访问内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问

//外部类 class Outter { private String name = "out"; private Integer age = 17; // 实例内部类:没有使用static修饰 class Inner { private Integer age = 18; // 隐藏现象,隐藏了外部类的age Inner() { // 特点:1.实例内部类能直接访问外部类成员 // 2.当实例内部类和外部类有同名的字段或者方法时,会发生隐藏现象 System.out.println(name + this.age);// 输出out18 // 此时若需要使用外部类的age,语法:外部类.this.age System.out.println(Outter.this.age);// 输出17 } } }

总结:简单来说,就是看变量的作用域,外部类成员变量的作用域是整个外部类,而内部类在外部类中(可以看做外部类的字段),内部类自然就可以访问外部类.而外部类要去访问内部类的成员,可以这样理解:内部类的成员属于内部类,在内部类中有效,内部类都不存在,其中的成员变量也不会存在,所以,外部类中不能直接访问内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问.

3.2静态内部类

  1)定义:使用static修饰的内部类.所以,该内部类属于外部类本身,而不属于外部类的对象

  2)创建静态内部类

//外部类 class Outter { // 静态内部类:使用static修饰 static class Inner { } } public class InnerDemo2 { public static void main(String[] args) { // 因为静态内部类属于外部类本身,可以直接通过外部类类名来访问(类比字段) Outter.Inner in = new Outter.Inner(); } }

  3)特点:

    a.在创建内部类的实例时,不必创建外部类的实例.

    b.静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,必须通过外部类的实例去访问.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e77ea62c6d9c59342e58a91cd19f1911.html