简单学习下Java内部类

   内部类就是在外部类内部定义的一个类,该类可以放到外部类的里面、外部类的某个方法中、外部类某个表达式内.有了内部类以后,就可以访问外部类中的私有成员变量.

   内部类共分为4中类型:

   (1)、静态内部类

/**
 * 静态内部类
 * @author Administrator
 *
 */
public class StaticInnerclassTest {

	public static void main(String[] args) {
		OutClass.InnerStatciClass inner = new OutClass.InnerStatciClass();
		inner.test();
	}
}

class OutClass {
	
	private static int i = 3;
	
	static class InnerStatciClass {
		public void test() {
			System.out.println(i);
		}
	}
}

    a.对于静态内部类的初始化,通常使用外部类.内部类即可

    b.静态内部类中只能访问外部的静态成员变量

    c.编译后的class文件中,会出现OutClass.class和OutClass$InnerStatciClass.class字节码文件

 

(2)成员内部类

public class MemberInnerClassTest {

	public static void main(String[] args) {
		//注意内部类的初始方式
		OutClass1.MemeberInnerClass member = (new OutClass1()).new MemeberInnerClass();
		OutClass1 out = new OutClass1();
		out.test();
		member.test();
	}
	
}

class OutClass1 {
	
	private int j = 5;
	
	class MemeberInnerClass {
		int j = 2;
		public void test() {
			System.out.println(OutClass1.this.j);//打印外部类的成员变量
		}
	}
	
	public void test() {
		System.out.println(j);
	}
}

 a.访问外部类的成员变量:外部类名.this.外部类成员变量名

 b.实例化方式:(new 外部类名()).new 内部类名()

 c.在外部类的某个方法中掉用内部类:this.new 内部类名();

 

(3) 局部内部类

/**
 * 局部内部类(通常定义在外部类的方法作用域中)
 * @author Administrator
 *
 */
public class LocalInnerClassTest {

	public static void main(String[] args) {
		OutClass2 out = new OutClass2();
		out.test();
	}
}

class OutClass2 {
	
	private int j = 3;
	
	public void test() {
		final int j = 4;
		class inner1 {
			public void innerTest() {
				System.out.println(j);//局部内部类只能访问final类型的变量
			}
		}
		new inner1().innerTest();
	}
}

 a.在外部类的某个方法中作用域或更小作用域中的类

 b.该内部类中只能起之外的被final修饰的变量

 

(4) 匿名内部类

public interface MyInterfce {

	public String print();
}

 

/**
 * 匿名内部类
 * @author Administrator
 *
 */
public class AnonyInnerClassTest {

	public static void main(String[] args) {
		OutClass3 out = new OutClass3();
		String str = out.test(new MyInterfce() {
			@Override
			public String print() {
				return "hello world";
			}
		});
		System.out.println(str);
	}
}

class OutClass3 {
	
	public String test(MyInterfce mi) {
		return mi.print();
	}
}

 

a.匿名内部类就是没有类名的局部内部类

b.没有显示的继承或实现接口的关键字,但是可以继承或者实现接口,如本例中就隐式实现了MyInterface接口

你可能感兴趣的:(java,C++,c,C#,J#)