我的java学习笔记(17)关于内部类(part 2)

1.内部类是一种编译器现象,与虚拟机无关。编译器将会把内部类翻译成用$ 分隔外部类名与内部类的常规文件,而虚拟机则对此一无所知。

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();
	}
}

输出结果

时间: 2024-10-14 06:44:46

我的java学习笔记(17)关于内部类(part 2)的相关文章

我的java学习笔记(16)关于内部类(part 1)

1.内部类是定义在另一个类中的类. 原因:a.内部类方法可以访问类定义所在的作用域中的数据,包括私有的数据. b.内部类可以对同一个包中的其他类隐藏起来. c.当想要定义一个回调函数且不想编写大量的代码时,使用匿名内部类比较便捷. 2.内部类皆可以访问自身的数据域,也可以访问创建它的外围类对象的数据域. 3.内部类的对象总有一个隐式引用,它指向了创建它的外部类对象.这个引用在内部类的定义中是不可见的. 4.外围类的设置一般都在内部类的构造器中设置. 5.只用内部类可以是私有类,而常规类只可以具有

我的java学习笔记(18)关于内部类(part 3)

1.当使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要在内部类引用外部类对象时,可以将内部类为static,以便取消产生的引用. 2.只有内部类可以声明为static.静态内部类的对象除了没有对生成它的外部类对象的引用特权外,其他与所有内部类完全一样. 实例代码 测试类 public class test { public static void main(String[] args) { double[] d = new double[20]; for(int i = 0; i <

Java学习笔记17

Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看关于finalize()方法在源码中是如何定义的: protected void finalize() throws Throwable { } 关于此方法的说明: 当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源. finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的

Java学习笔记五(内部类 )

1 内部类的优缺点 在一个类的内部还存在另外一个类,则成为内部类.内部类可以是public 或者private,对其访问的控制与类的成员变量和 成员方法相同. 内部类的缺点:内部类其实严重破坏了良好的代码结构 内部类的优点:方便的访问外部类中的私有属性:将内部类拿到外部之后,代码会增加,复杂度也会增加: 2 基本的内部类结构 class Outer{ private String info = "Hello outer inner class"; class Inner{ public

java学习笔记day06---匿名内部类

1.匿名内部类:其实就是内部类的简化形式,它所体现的就是一个类或者接口的子类对象.前提:     内部类必须继承或实现外部类或接口. 格式:    new 父类&接口(){};    其实就是一个子类对象,用{};结束 匿名内部类在程序中的体现形式有三种: 1.父类为普通的类 class Inter{ } class OuterTest{ public static void function(){ new Inter(){ private int num = 9; void show(){ S

Java 学习笔记(2015.7.13~17)

Java 学习笔记(2015.7.13~17) Java this关键字 表示本类中的属性,调用本类中的方法 class Person {        private String name;         private int age;         public Person(String name, int age) {         this.name = name;//调用本类中的属性         this.age = age;//同上} //get&set方法:    

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep