Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类。下面分别详细学习一下这四种内部类的具体使用。

内部类在编译完成后也会产生.class文件,但文件名称是:外部类名称$内部类名称.class


成员内部类

成员内部类也叫实例内部类。

应用场景: 每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)

特征:

  • 作为外部类的一个成员存在,与外部类的属性、方法并列;
  • 成员内部类持有外部类的引用;
  • 成员内部类中不能定义static变量和方法。

代码:

public class App {

	private String name = "成员内部类 - 1";

	public static void main(String[] args) throws Exception {
		//方法一:
		// App app = new App();
		// InnerApp innerApp = app.new InnerApp();
		// innerApp.show();

		//方法二:
		App.InnerApp innerApp = new App().new InnerApp();
		innerApp.show();
		System.out.println(innerApp.name);
	}

	public class InnerApp {
		private String name = "成员内部类 - 2";

		public void show() {
			System.out.println(App.this.name);
			System.out.println("内部类!");
		}
	}
}


静态内部类

内部类如果使用static声明,则此内部类就称为静态内部类。可以通过外部类 . 内部类来访问。

应用场景: 内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。

特征:

  • 静态内部类不会持有外部类的引用;
  • 静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问

代码:

public class App {

	String name = "静态内部 - 1";

	public static void main(String[] args) throws Exception {
		App.InnerApp innerApp = new App.InnerApp();
		innerApp.print();
	}

	static class InnerApp {
		String name = "静态内部 - 2";

		public void print() {
			System.out.println(name);
		}

	}

}


局部内部类

局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。

应用场景: 如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类

特征:

  • 用在方法内部,作用范围仅限于该方法中;
  • 根据情况决定持有外部类对象引用;
  • 不能使用private,protected,public修饰符;
  • 不能包含静态成员。

代码:

public class App {

	String name = "局部内部类 - 1";

	public static void main(String[] args) {
		App app = new App();
		app.show();
	}

	public void show() {
		final String name = "局部内部类 - 2";

		class InnerApp {

			public void print() {
				System.out.println(name);
			}

		}

		new InnerApp().print();
	}

}


匿名内部类

如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。

匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。

应用场景: 简化内部类的使用

特征:

  • 使用new创建 ,没有具体位置;
  • 创建的匿名类,默认继承或实现new后面的类型;
  • 根据使用情况决定是否持有外部类对象引用;
  • 内嵌匿名类编译后生成的.class文件的命名方式是”外部类名称$编号.class”,编号为1,2,3…n,编号为x的文件对应的就是第x个匿名类

代码:

public class App {

	String name = "匿名内部类 - 1";

	public static void main(String[] args) {
		Person p = new Person() {
			public void run() {
				System.out.println("匿名内部类实现的");
			}
		};
		p.run();
	}

}

public interface Person {

	public void run();
}


内部类优缺点

优点:

  • 实现多重继承
  • 内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
  • 减少了类文件编译后的产生的字节码文件的大小

缺点: 使程序结构不清楚。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值