Java内部类
2021/9/15 1:06:48
本文主要是介绍Java内部类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、使用内部类访问对象状态
类:
package innerClass; import timer.TimePrinter; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; public class TalkingClock { private int interval; private boolean beep; public TalkingClock(int interval, boolean beep) { this.interval = interval; this.beep = beep; } public void start() { ActionListener listener = new TimePrinter(); Timer timer = new Timer(interval, listener); timer.start(); } public class TimerPrinter implements ActionListener { @Override public void actionPerformed(ActionEvent actionEvent) { System.out.println("At the tone, the time is " + new Date()); //内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域 if (beep) Toolkit.getDefaultToolkit().beep(); } } }
测试:
package innerClass; import javax.swing.*; public class InnerClassTest { public static void main(String[] args) { TalkingClock talkingClock = new TalkingClock(1000, true); talkingClock.start(); JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } }
2、内部类的特殊语法规则
- 使用外围类引用的正规语法:OuterClass.this
例:if (TalkingClock.this.beep)
- 编写内部对象构造器:outerObject.new InnerClass(construction parameters)
例:ActionListener listener = this.new TimerPrinter();
- 在外围类的作用域之外引用内部类:OuterClass.InnerClass
- 内部类中声明的所有静态域都必须是final;
3、局部内部类
package innerClass; import timer.TimePrinter; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; public class TalkingClock { private int interval; private boolean beep; public TalkingClock(int interval, boolean beep) { this.interval = interval; this.beep = beep; } public void start() { //局部类不能用public或private访问说明符声明。它的作用域被限定在这个局部类的块中。 class TimerPrinter implements ActionListener { public void actionPerformed(ActionEvent actionEvent) { System.out.println("At the tone, the time is " + new Date()); //内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域 if (beep) Toolkit.getDefaultToolkit().beep(); } } ActionListener listener = new TimerPrinter(); Timer t = new Timer(interval, listener); t.start(); } }
4、由外部方法访问变量
package innerClass; import timer.TimePrinter; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; public class TalkingClock { public void start(int interval, boolean beep) { //局部类不仅可以访问包含它们的外部类,还可以访问局部变量(局部变量必须为final) class TimerPrinter implements ActionListener { public void actionPerformed(ActionEvent actionEvent) { System.out.println("At the tone, the time is " + new Date()); //内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域 if (beep) Toolkit.getDefaultToolkit().beep(); } } ActionListener listener = new TimerPrinter(); Timer t = new Timer(interval, listener); t.start(); } }
5、匿名内部类
package anonymousInnerClass; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.swing.Timer; public class TalkingClock { public void start(int interval, boolean beep) { //创建一个实现ActionListener接口的类的新对象,需要实现的方法actionPerforme定义在括号{}内 //匿名类不能有构造器,构造器参数传递给超类构造器 ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("At the tone, the time is " + new Date()); if (beep) Toolkit.getDefaultToolkit().beep(); } }; Timer timer = new Timer(interval, listener); timer.start(); } }
6、静态内部类
类:
package staticInnerClass; public class ArrayAlg { //内部类不需要访问外部类对象的时候,应该使用静态内部类 //静态内部类可以有静态域和方法 //声明在接口中的内部类自动成为static和public public static class Pair { private double first; private double second; public Pair(double f, double s) { first = f; second = s; } public double getFirst() { return first; } public double getSecond() { return second; } } //一个静态方法 public static Pair minmax(double[] values) { double min = Double.POSITIVE_INFINITY; double max = Double.NEGATIVE_INFINITY; for (double v: values ) { if (min > v) min = v; if (max < v) max = v; } return new Pair(min, max); } }
测试:
package staticInnerClass; public class StaticInnerClassTest { public static void main(String[] args) { double[] d = new double[20]; for (int i = 0; i < d.length; i++){ d[i] = 100 * Math.random(); } ArrayAlg.Pair pair = ArrayAlg.minmax(d); System.out.println("min = " + pair.getFirst()); System.out.println("max = " + pair.getSecond()); } }
这篇关于Java内部类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?