我的java学习笔记(17)关于内部类(part 2)
2015-04-04 21:46
423 查看
1.内部类是一种编译器现象,与虚拟机无关。编译器将会把内部类翻译成用$ 分隔外部类名与内部类的常规文件,而虚拟机则对此一无所知。
2.内部类拥有访问特权,所以与常规类比起来功能更加强大。
3.有时候一个类只在一个方法中使用一次,我们可以定义这个类为局部类。
4.局部类不能用public或private访问说明符进行声明,它的作用域限定在声明这个局部类块中。
5.局部类有一个优势,即对外部世界可以完全地隐藏起来。
6.与其他的内部类相比较,局部类还有一个优点。它们不仅能够访问包含它们的外部类,还可以访问局部变量。不过,那些局部变量必须被声明为final。
7.如果局部变量表示一个动态的计数器,可以将其转换为一个长度为1的数组,数组变量任然被声明为final,但这仅仅表示它不能引用另外一个数组,数组中的值是可以随意改变的。
8.将局部内部类的使用再深入一步,假如只创建这个类的一个对象,就不必命名了。这种类被称为匿名类。
9.由于构造器的名字必须与类名相同。而匿名类没有类名,所以,匿名类不能有构造器。取而代之的是,将构造器参数传递给超类构造器。但实现接口时不能有任何参数。
10.构造参数的闭圆括号跟一个花括号,花括号内就是定义的匿名内部类。
实例代码
测试类
功能类
输出结果
2.内部类拥有访问特权,所以与常规类比起来功能更加强大。
3.有时候一个类只在一个方法中使用一次,我们可以定义这个类为局部类。
public void start() { class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("现在时间是:" + now); if(beep) Toolkit.getDefaultToolkit().beep(); } } ActionListener li = new TimePrinter(); Timer t = new Timer(interval,li); t.start(); }
4.局部类不能用public或private访问说明符进行声明,它的作用域限定在声明这个局部类块中。
5.局部类有一个优势,即对外部世界可以完全地隐藏起来。
6.与其他的内部类相比较,局部类还有一个优点。它们不仅能够访问包含它们的外部类,还可以访问局部变量。不过,那些局部变量必须被声明为final。
7.如果局部变量表示一个动态的计数器,可以将其转换为一个长度为1的数组,数组变量任然被声明为final,但这仅仅表示它不能引用另外一个数组,数组中的值是可以随意改变的。
final int[] c = new int[1]; for(int i = 0; i < dates.length;i++) { dates[i] = new Date() { public int compareTo(Date other) { c[0]++; return super.compareTo(other); } }; }
8.将局部内部类的使用再深入一步,假如只创建这个类的一个对象,就不必命名了。这种类被称为匿名类。
new SuperType(construction parameters) { inner class methods and data }
9.由于构造器的名字必须与类名相同。而匿名类没有类名,所以,匿名类不能有构造器。取而代之的是,将构造器参数传递给超类构造器。但实现接口时不能有任何参数。
new InterfaceType() { inner class methods and data }
10.构造参数的闭圆括号跟一个花括号,花括号内就是定义的匿名内部类。
实例代码
测试类
import javax.swing.JOptionPane; public class test { public static void main(String[] args) { TalkingClock c = new TalkingClock(); c.start(1000, true); JOptionPane.showMessageDialog(null, "退出吗?"); System.exit(0); } }
功能类
import java.awt.Toolkit; 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,final boolean beep) { ActionListener li = new ActionListener() { public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("现在的时间是:" + now); if(beep) Toolkit.getDefaultToolkit().beep(); } }; Timer t = new Timer(interval,li); t.start(); } }
输出结果
相关文章推荐
- 我的java学习笔记(18)关于内部类(part 3)
- 我的java学习笔记(16)关于内部类(part 1)
- 我的java学习笔记(12)关于反射(part 1)
- 我的java学习笔记(14)关于反射(part 3)
- 关于JAVA中 内部类的几点学习笔记
- 我的java学习笔记(13)关于反射(part 2)
- 30日学习笔记,关于java的IO系统已经Decorarot模式
- JAVA 学习笔记 第三篇 内部类
- JAVA学习笔记(三)---关于JAVA中的栈内存、堆内存
- Java学习笔记(接口与内部类)
- 内部类定义在局部学习笔记InnerClassDemo3.java
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- java学习笔记,关于java的一些基础知识,适用于初学者,第一节
- java学习笔记,试用初学者,第二节,关于内存地址分配问题
- Java Web 学习笔记(part)
- Java 学习笔记15:关于web开发中,全局变量的一点想法
- java学习笔记:关于IO转换流InputStreamReader和OutputStreamWriter
- Java学习笔记18天---(17)
- JAVA学习笔记--关于System.out.println()
- Effective Java 学习笔记(17)