天天看点

19、java的4种内部类(成员内部类、静态内部类、静态内部类、匿名内部类)

内部类

内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类

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...");
  }
};
}