内部类是定义在类中的类,主要的作用:
- 内部类可以访问类中的数据,包括私有数据
- 可以对包中的其他类隐藏起来
- 定义一个回调函数时,使用匿名内部类可以很便捷
局部内部类
public class InnerClassDemo2 {
public static void main(String[] args) {
new OutClass().f();
}
}
class OutClass{
private int a =9;
final int f = 4;
static final int sf = 5;
static int s = 3;
public void f() {
int ii = 4;
final int ff =3;
class InnerClass{
int inin = 4;
void f() {
System.out.println(ff);
// System.out.println(ii);
System.out.println(a);
System.out.println(f);
System.out.println(s);
}
}
new InnerClass().f();
ii+=1;
}
}
对于局部内部类,
- 访问的变量:可以访问外部类的所有属性,不可以访问局部变量,除了局部常量(在jdk8以后没有加final关键字,会自动加上final,表示常量,理由,局部变量的生命周期可能没有局部内部类长)
- 定义属性:不可以是静态属性,但可以被final修饰再被static修饰表示静态常量
- 内部类的修饰符:不能被访问权限修饰符修饰和static,可以是abstract,final,可以被继承和实现
- 只有在本方法内知道有这么个内部类,其他地方无法访问。
成员内部类
public class InnerClassDemo2 {
public static void main(String[] args) {
new OutClass().new InnerClass().f();
}
}
class OutClass{
private int a =9;
final int f = 4;
static final int sf = 5;
static int s = 3;
public class InnerClass{
private int aa =9;
final int fa = 4;
static final int sfa = 5;
// static int sa = 3;
public void f() {
System.out.println(a);
System.out.println(f);
System.out.println(s);
}
}
}
对于普通成员内部类
- 可以被访问权限符和static修饰,可以被abstract,final修饰
- 不可以定义静态属性和方法,但可以定义静态常量属性
- 可以访问外部类的所有属性
- 被public修饰符修饰就可以按什么规则被其他类访问,创建方式为new Outclass().new Innerclass()
public class InnerClassDemo2 {
public static void main(String[] args) {
OutClass.InnerClass innerClass = new OutClass.InnerClass();
innerClass.f();
}
}
class OutClass{
private int a =9;
final int f = 4;
static final int sf = 5;
static int s = 3;
static class InnerClass{
private int aa =9;
final int fa = 4;
static final int sfa = 5;
static int sa = 3;
static void f() {
// System.out.println(a);
// System.out.println(f);
System.out.println(s);
}
}
}
对于静态成员内部类
- 可以定义静态属性和方法
- 只能拿到外部类的静态属性和方法
- 可以被访问权限修饰符修饰,可以被abstract,final修饰
- 被public修饰符修饰就可以按什么规则被其他类访问,创建方式为new Outclass.Innerclass()注意这里Outclass没有括号
匿名内部类
public class InnerClassDemo2 {
public static void main(String[] args) {
// OutClass.InnerClass innerClass = new OutClass.InnerClass();
// innerClass.f();
// OutClass.InnerClass.f();
int a = 9;
new Inner() {
@Override
public void f(int aa) {
System.out.println(a);
// a++;
}
}.f(6);;
}
}
interface Inner{
void f(int a);
}
对于匿名内部类
- 本质在进行方法的重写,final修饰的类没有匿名内部类;
- 对于其内的属性和方法看其位置在哪;在方法内和方法内部类一致,在成员变量中和成员内部类一致
其他
-
接口内部类
都是静态成员内部类 -
内部接口
可以在类中,接口中。都是静态的,基本不用