java内部类

下面是一个Out类中有一个内部类Inner的实例:

public class Out {

	// public Out() {
	// System.out.println("***");
	// }

	
	private int num = 3;

	private String name = "张三";

	public void show() {

		System.out.println(this.name + "Hello" + Inner.name);

		Inner.show();

	}

	// 定义一个内部类 该类作为Out类的成员类
	
	abstract static class Inner {
		// public Inner() {
		// System.out.println("~~~");
		// }

		static final String name = "李四";

		public static void show() {
			System.out.println(name + "内部的Hello");
		}
	}

	public static void main(String args[]) {
		Out o = new Out(); // 产生Out对象的时候不会产生Inner对象>
		o.show();
	}

}

 

(1)内部类可以直接访问外部类的所有属性和方法,即使是外部类的私有方法。可以通过Set和Get方法访问public类的私有属性,但不能访问私有方法,而内部类解决了这个问题。

若内部类和外部类有相同名字的属性,在内部类的方法中想调用该属性,例如:

 

public void show() {
    System.out.println(this.name+"内部的hello"+Out.this.name);
}

 

 (2)外部类Out和内部类Inner中都有同名属性name,在show方法中调用内部类的name,可以用this.name;而调用外部类的name则用Out.this.name,意为外部类的当前对象的name属性。若要在内部类的方法中访问外部类的非同名属性num,直接写num即可。

 

(3)外部类想访问类内部类的属性时,需要先创建内部类的对象,然后再通过对象.属性名调用属性。可以把内部类对象引用放在外部类中作为全局属性使用;或者把内部类改成static,把属性也改成static。

 

(4)若一个类中有一个内部类,那么编译后会产生两个.class文件,分别是Out.class和Out$Inner.class.

(5)一个类中可以包含内部类(包含抽象类)和接口,如果外部类包含的是抽象类,那么外部类如果访问内部类的属性?给属性加上static final,给方法加上static,内部类前也要加上static;static修饰的类和方法时能调用static修饰的内容。

(6)在静态函数main()里创建内部类对象时,需要依附外部类对象;

 

public static void main(String args[]) {
    Out.Inner in = new Out().new Inner();
}

 而在非静态方法show里创建内部类对象则可以直接Inner in = new Inner(); 因为main()是静态方法,没有this指代,创建内部类对象时需要具体的指代,所以需要先new Out(),而外部类中的非静态方法show()则可以有this,this则指代外部类对象。

你可能感兴趣的:(java内部类)