java内部类

成员内部类

定义在类里面的类

  • 成员内部类可以访问外部类的所有成员,包括private成员和静态成员
  • 当内部类和外部类成员重名的情况下,默认访问的是内部类的成员;访问外部成员方法为:外部类.this.外部成员
  • 创建内部类必须先存在外部类:new Out().new Inner()
  • 字节码文件名:外部类名$内部类名.class
package com.zrun;

import com.zrun.Outer1.Inner1;

public class App1 {

	public static void main(String[] args) {
		// 创建成员内部类的方法1
		Outer1 out = new Outer1("ych", 29);
		Inner1 inn = out.new Inner1("hll");
		inn.testField();
		// 创建成员内部类的方法2
		Inner1 inn2 = out.getInnerInst();
		inn2.testField();
	}

}

class Outer1 {
	private String name;
	private int age;

	public Outer1(String name, int age) {
		this.name = name;
		this.age = age;
	}

	private Inner1 inner;

	/**
	 * 获取内部类实例
	 * 
	 * @return
	 */
	public Inner1 getInnerInst() {
		if (inner == null)
			inner = new Inner1("hll");
		return inner;
	}

	class Inner1 {
		private String name;

		public Inner1(String name) {
			this.name = name;
		}

		/**
		 * 内部类引用外部类成员
		 */
		public void testField() {
			System.out.println("内部类使用外部类的变量age:" + age);
			System.out.println("内部类和外部类变量重名,默认使用内部类name:" + name);
			System.out.println("内部类和外部类变量重名,使用内部类name:" + this.name);
			System.out.println("内部类和外部类变量重名,使用外部类name:" + Outer1.this.name);
		}
	}
}

局部内部类

定义在方法或作用域里面的类,访问权限只在该方法或作用域中(实际开发中很少使用,因为作用域太小)

  • 局部内部类类似于方法局部变量,不能有public、protect、private、static修饰符
  • 字节码文件名:外部类名$1内部类名.class
package com.zrun;

public class App2 {
	public static void main(String[] args) {
		// new Inner2().printName();
		String name = "ych";
		class Inner2 {
			public void printName() {
				System.out.println(name);
			}
		}
		new Inner2().printName();
	}

}

匿名内部类

  • 常用于写事件监听
  • 字节码文件名:App3$1.class
package com.zrun;

public class App3 {

	public static void main(String[] args) {
		Button btn = new Button();
		btn.click(new ButtonClickListener() {

			@Override
			public void click() {
				System.out.println("按钮被点击了"); 
			}

			@Override
			public void doubleClick() {
				System.out.println("按钮被双击了");
			}
		});
	}
}

interface ButtonClickListener {
	public void click();

	public void doubleClick();
}

class Button {
	public void click(ButtonClickListener clickListener) {
		clickListener.click();
		clickListener.doubleClick();
	}
}

静态内部类

定义在类中的类,前面有static关键字修饰

  • 创建静态内部类不需要依赖外部类
  • 静态内部类相当于外部类的静态成员,不可以使用外部类的非静态成员
  • 字节码文件名:外部类名$内部类名.class
package com.zrun;

public class App4 {

	public static void main(String[] args) {
		Outer4.Inner4 inner4 = new Outer4.Inner4(); 
		inner4.print();
	}

}

class Outer4 {
	private String name;
	static Integer age = 29;

	static class Inner4 {
		public void print() {
			// System.out.println(name);
			System.out.println(age);
		}
	}
}


posted @ 2019-03-03 22:57  惬意的小屋  阅读(114)  评论(0编辑  收藏  举报