内部类
内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类
1、成员内部类: 成员内部类类似于成员变量,定义在类中,和属性|方法对齐。
//外部类类名.内部类类名 内部类对象名 = 外部类对象名.new 内部类类名();
class Inner{
private String inner_field = "内部类的成员变量";
int a = 100;//内部类成员变量
//static int c;//成员内部类中不能定义静态成员
public void inner_method() {
int a = 10;//局部变量
System.out.println(a);//局部变量
System.out.println(this.a);//内部类的同名成员变量
System.out.println(Outer.this.a);//外部类的同名成员变量
System.out.println("内部类的成员方法");
System.out.println(inner_field);//内部类成员变量
System.out.println(outer_field);//外部类的私有成员变量
}
}
Outer outer = new Outer();
outer.out_method();
//创建成员内部类对象必须借助于外部类对象名
Outer.Inner inner = outer.new Inner();
inner.inner_method();
2、静态内部类: 类似于静态属性,定义在类中,方法的外面,被static修饰
//语法
//外部类类名.静态内部类类名.静态属性;
//外部类类名.静态内部类类名.静态方法();
//静态内部类
static class Inner{
int m = 2;
static int n = 20;
//m3()对外时 相当于加上了static 就不能直接访问外部类的普通成员
public void m3() {
//a属性为成员变量
StaticOuter so = new StaticOuter();
System.out.println(so.a);
//静态内部类中普通方法 但是相当于给其加了static
}
public static void m4() {
//System.out.println(m);//静态内部类的静态方法不能直接访问内部类的普通成员
System.out.println("内部类的静态方法");
System.out.println(n);
}
}
//访问静态内部类的静态成员 不需要创建内部类对象
//创建静态内部类对象不需要依赖于外部类对象
3、静态内部类: 类似于局部变量,定义在方法中,类似于局部变量,定义在方法中。
注意:局部内部类创建对象只能在定义它的方法中。(局部内部类可以访问外部类的局部变量,但是必须加上final(JDK8.0中,在内部类中访问为外部类的局部变量默认加上final)。)
public void m1() {
final int x = 10;//局部变量 作用范围(定义位置开始到所在代码块结束)
System.out.println("外部类的普通方法");
System.out.println(x);//10
//局部内部类
class Inner{
int y;
public void m2() {
System.out.println("x="+x);
System.out.println("局部内部类的方法");
System.out.println(a);//访问外部类的私有成员 不破坏封装
}
}
Inner inner = new Inner();
System.out.println(inner.y);//0
inner.m2();
}
4、匿名内部类: 特殊的局部内部类,局部内部类的一切特征,匿名内部类都存在(继承一个类或者实现一个接口)。
interface IA{
void m1();
}
class IAImpl implements IA{//1
public void m1() {
System.out.println("IAImpl m1()...");
}
}
main{
IA i1 = new IAImpl();//2
//创建的是接口的实现类对象 因为隐藏了实现类类名 所以称之为匿名内部类
//实现类的定义与实现类对象的创建二者结合为一
IA ia = new IA() {//这一种写法完全等价于1+2
public void m1() {
System.out.println("IAimpl m1...");
}
};
}