tags:
- 内部类
- Java编程思想
categories: - Java
author: Jang
title: 内部类
date: 2019-01-06 11:26:00
什么是内部类
把一个类的定义放在另一个类的定义内部,这个类就是内部类。
内部类可以访问外围类的所有成员。
在创建内部类实例对象时,首先要获得一个外部类的引用,然后通过.new的方式来创建:Out.Inner in = out.new Inner();
成员内部类
在一个类中以成员的形式定义一个内部类,就是最基础的内部类
1 | public class Outer{ |
上面的代码就是一个最简单的内部类的使用。总接一下内部类的使用要点:
- 内部类可以访问外部内的所有变量
- 在外部类中使用内部类,需要通过 new 关键字创建一个实例对象。并且外部类可以访问到内部类所有的变量和方法。
- 在其他类中创建内部类对象需要使用这样的形式:
OuterClass.InnerClass inner = new OuterClass.new InnerClass()
。并且在其他类是不能访问内部类的四私有方法和对象的。 - 内部类通过
.this
的方式可以获得外部类的引用。
静态内部类
在定义内部类的时候,用 static 关键字修饰
1 | public class Outer { |
通过上面的代码,可以看出来静态内部类有以下特点:
- 静态内部类中可以定义静态的成员变量,也可以定义非静态的成员变量。
- 在静态内部类中只能访问外部类的静态变量和方法,不能访问非静态的变量和方法。
- 静态内部类的静态方法可以在其他类中通过,OuterClass.InnerClass.StaticMethod 这样的方式调用。
- 在其他类中,静态内部类是不能通过 new OuterClass.new InnerClass() 这样的方式获得。但是在外部类中可以通过 new 获得一个静态内部类的实例对象。
- 静态内部类中不能使用 .this 来获得外部类的引用。
局部内部类
局部内部类是在一个方法或者任意作用域中定义的内部类。在有些情况下,需要一个类来辅助解决问题,但是又不希望这个类是公共可用的,这个时候可以用局部内部类来解决问题。
在方法中定义的类
1 | public class Animal { |
这样在 Run
方法执行的时候,内部类才会存在,当 Run
方法执行结束。内部类就无法使用了。
在任意作用域中嵌入内部类
1 | public class Add { |
这样的内部类只能在 (num > 5)
这个作用域范围内生效。
匿名内部类
匿名内部类主要适用于对于一个接口的隐式实现。
JDK1.8 以前如果在匿名内部类中引用外部的定义的对象,这对象必须是final的。
1 | class OuterClass { |
匿名内部类的使用要点:
- 匿名内部类是没有访问修饰符的,且其中不能存在任何静态成员变量或者是静态方法。
- 匿名内部是不能包含构造器的,可以通过构造代码来模拟构造器。