「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
在本系列中,你会了解如何使用内部类,局部内部类,匿名内部类以及静态内部类。
1. 局部内部类
如果我们查看本系列中上一篇的TalkingClock示例的代码就会发现,类型TimePrinter的名字只出现了一次。遇到这种情况的时候,我们可以在一个方法中局部地定义这个类。
public void start()
{
class TimePrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
. . .
}
}
TimePrinter timePrinter = new TimePrinter();
Timer timer = new Timer(interval, listener);
timer.start();
}
复制代码
请注意,声明局部类时不能有访问修饰符。局部类地作用域被限定在声明这个局部类的代码块中。
局部类内部类的优势在于对外部世界完全隐藏,甚至TalkingClock类中的其他代码也无法访问它。除了声明这个类的方法之外,没有任何方法能够知道这个局部内部类的存在。
而与其他内部类相比较,局部内部类还有一个优点。它们不仅能够访问外部类的字段,还可以访问局部变量。
不过这些局部变量必须由final修饰。
2. 匿名内部类
使用局部内部类时,还可以再进一步。假如我们只想创建这个类的一个对象,甚至不需要为类指定名字。这样一个类被称为匿名内部类。
匿名内部类的语法如下
new SuperType(construction parameters)
{
innerClass methods and data
}
复制代码
其中SuperType可以是接口或者类,内部类需要实现或者扩展它。
一直以来我们习惯于用匿名内部类实现事件监听器和其他回调。如今最好的方式还是使用lambda表达式。
下面给出匿名内部类以及lambda表达式的对比。
- 匿名内部类
public void start(int interval, boolean beep)
{
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
. . .
}
};
Timer timer = new Timer(interval, listener);
timer.start();
}
复制代码
- lambda表达式
public void start(int interval, boolean beep)
{
Timer timer = new Timer(interval, event -> {
. . .
});
}
复制代码
- 每天一个Java小知识
ArrayList和LinkList的区别
-
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
-
对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
-
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据,而查询和修改ArrayList占优势。
36. S ocket和HTTP区别?
感谢观看,这是Java 内部类系列的第三篇文章,如果您有兴趣,可以关注一下我,方便查看后续文章,一起学习,共同进步,不胜感激!




近期评论