内部类

本文深入探讨Java内部类的使用原因及类型,包括内部类如何访问私有数据和局部变量,匿名内部类的构造特点,以及静态内部类的声明方式。通过实例展示了内部类在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java内部类

使用内部类的原因

  1. 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
  2. 内部类可以对同一个包中的其他类隐藏起来
  3. 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
    内部类的对象有一个隐式引用,在内部类中不可见,它引用了实例化该内部类对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。

局部内部类

当内部类只在外围类的某个方法中使用时,可以定义局部内部类,不能用`public、private`访问说明符声明,作用域为此方法块(本方法内),对外部世界完全隐藏。
public void start(){
	class TimePrinter implements ActionListener{
		public void actionPerformed(ActionEvent event){
			System.out.println("At the time is " + new Date());
			if(beep) Toolkit.getDefaultTookit().beep();
		}
	}
	ActionListener listener = new TimePrinter();
	Timer t = new Timer(interval, listener);
	t.start();
}

局部内部类可以访问本方法内的局部变量(事实上为final),而普通内部类则不可以访问局部变量

匿名内部类

由于构造器名称与类名要一致,而匿名内部类没有类名,所以他也没有构造器,取而代之的是,将构造器参数传递给超类构造器。

public void start(intinterval, boolean beep){
	ActionListener listener = new ActionListener(){
		public void actionPerformed(ActionEvent event){
			System.out.println("At the tone, the time is " + new Date());
			if(beep) Toolkit.getDefaultToolkit().beep();
		}
	};
	Timer t = new Timer(interval, listener);
	t.start();
}
  • 双括号初始化
ArrayList<String> friends = new ArrayList<>();
friends.add("Harry");
friends.add("Tony");
invite(friends);//构造friends数组列表,并将其传递给invite()方法

如果不再需要这个数组列表,将其作为一个匿名类

invate(new ArrayList<String>() {  //外围大括号表示建立一个匿名类
	{//内部大括号代表一个对象构造块
		add("Harry");
		add("Tony");
	}
}

静态内部类

如果只是为了将一个类隐藏在另一个类内部,不需要内部类引用外围类对象,可以使用static,以便取消产生的引用。

  • 与常规内部类不同,静态内部类可以有静态域和方法
  • 声明在接口中的内部类自动成为static,public
  • new outterClass.staticInnerClass()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值