内 部 类
辽宁经济职业技术学院信息系
硕士、副教授 陈英
API 帮助文档
java.long,Comparable
Int compareTo(Object other)
对本对象和 otherObject 进行比较。如果本对象
小于 otherObject,返回一个负整数;如果相等,
返回 0 ;否则返回一个正整数。
java.util.Arrays
static void sort(Object[] a)
为数组 a 中的元素进行排序。数组中的所有元素
必须属于实现 Comparable 接口的类,并且它们
必须能够相互比较。
接口和回调
编程的一个常用模式是回调模式。在这种模式
中,可以指定当一个特定事件发生时所采取的
动作。
javax.Swing类中包含一个子 Timer类。如果需
要在时间间隔到时得到通知,那么这个类就非
常有用。
Java标准库中的类采取了一个面向对象的方法。
你传递某个类的一个对象,定时器调用对象上
的方法。当然定时器需要知道调用哪个方法。
定时器要求传递的对象所属的类必须要实现
java.awt.event包中的 ActionListener接口。
ActionListener接口
Public interface ActionListener
{
void actionPerformed(ActionEvent
event);
}
例如,若希望每隔十秒钟就打印一条消息,
那么需要首先定义一个实现 ActionListener
接口的类,然后实现 actionPerformed方法。
API 帮助文档
java.swing.JOptionPane
static void showMessageDialog(Comonent parent,Object message)
该方法显示一个带有提示和 OK按钮的对话框。该对话
框显示在 parent组件的中央位置,如果 parent为空,则
对话框就显示在屏幕的中央位置。
Java.swing.Timer
Timer(int interval,ActionListener listener)
构造一个定时器,每 interval微秒过后,该定时器会通
知 listener.
Void start() 启动定时器以后,定时器调用该监听器的
actionPerformed方法。
Void stop() 停止定时器。停止以后,定义器不再调用
该监听器的 actionPerformed方法。
API 帮助文档
java.awt.Toolkit
static Toolkit getDefaultToolkit()
得到默认工具箱。工具箱包含有图形用
户界面环境的信息。
Void beep()
激发一次震铃响声。
内 部 类
一个内部类是定义在另一个类内部的类。
构建内部类的原因:
1) 一个内部类的对象能够访问创建它的对象的
实现 —— 包括私有数据。
2) 对于同一包中的其他类来说,内部类能够隐
藏起来。
3) 匿名内部类可以很方便地定义回调。
4) 使用内部类可以非常方便地编写事件驱动程
序。
内部类
内部类,有时叫做嵌套类,被附加到 JDK1.1及
更高版本中。
内部类允许一个类定义被放到另一个类定义里。
内部类是一个有用的特征,因为它们允许将逻
辑上同属性的类组合到一起,并在另一个类中
控制一个类的可视性 。
内部类的类名只能用在定义它的类或语句块之
内,在外部引用时必须给出完整的名称。且内
部类的类名不能与包含它的类名相同。
InnerClasstEest内部类实例分析
定时器的动作监听器对象每隔一秒便给帐户加一
次利息。
若使用公开的方法来处理银行余额,任何人都能
够调用这些公开的方法来修改银行余额。
取而代之,使用一个内部类,该内部类的方法能
够直接处理银行余额。
只有内部类才能是私有的。普通类总是具有包可
见性或者公开性。
对于构造内部类的对象,它们并不是外部类的实
例字段,相反,它们只是外部类方法中的局部变
量。
InnerClasstEest内部类实例分析
InterestAdder类在 BankAccount类之内。这并
不意味着每一个 BankAccount都有一个
InterestAdder实例。
因为内部类实现了 ActionListener接口,所以它
具有一个 actionPerformed方法。该方法实际来
增大帐户余额。
BankAccount类中的 start方法根据给定的利息构
造了一个 InterestAdder对象,然后把它设为定
时器的动作监听器,并且启动该定时器。
作为结果,InterestAdder类中的
actionPerformed方法每秒调用一次。
InnerClasstEest内部类实例分析
public void actionPerformed(ActionEvent event)
{
double interest = balance * rate / 100;
balance += interest;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
System.out.println("balance=" + formatter.format(balance));
}
? 名字 rate指向 InterestAdder类的实例字段。然而,
InterestAdder类没有任何 balance字段。取而代之的是,
balance指向创建该 InterestAdder对象的 BankAccount对象
的一个字段。这非常有创新性。
? 传统上,一个方法能够访问调用该方法的对象数据字段。
而一个内部类方法即可以访问它自己的数据字段,也能够
访问创建它的外部对象的那些字段。
? 该引用对于外部类的定义来说是不可见的。
InnerClasstEest内部类实例分析
public void actionPerformed(ActionEvent event)
{
double interest = outer.balance* this.rate / 100;
outer,balance += interest; //outer表示调用外部对象
NumberFormat formatter = NumberFormat.getCurrencyInstance();
System.out.println("balance=" + formatter.format(outer.balance));
}
外部类引用在构造器中设置。编译器为构造器添加一个参数,
声称如下代码:
public InterestAdder(BankAccount account,double aRate)
{
outer =account;
rate = aRate;
}
内部类的属性
类名称只能用在定义过的范围中,除非用
在限定的名称中。内部类的名称必须与所
嵌套的类不同。
内部类可以被定义在方法中 。 这条规则较
简单, 它支配到所嵌套类方法的变量的访
问 。 任何变量, 不论是本地变量还是正式
参数, 如果变量被标记为 final,那么, 就
可以被内部类中的方法访问 。
内部类可以使用所嵌套类的类和实例变量
以及所嵌套的块中的本地变量 。
内部类的属性
只有内部类可以被声明为 private 或
protected,以便防护它们不受来自外部
类的访问 。 访问保护不阻止内部类使用
其它类的任何成员, 只要一个类嵌套另
一个 。
一个内部类可以作为一个接口, 由另一
个内部类实现 。
注 -内部类有常常被用作创建事件适配
器的方便特征 。
protected变量和方法
有时需要让超类的某些方法或者字段只允许子类
访问,而对于其他任何类来说都不可见。在这种
情况下,需要把类定义为受保护的,prodected。
例。如果超类 Employee把 hireDay字段定义为
proteced而不是私有的,那么 Manager中的方法就
可以直接访问它。
然而,Manager类方法仅仅能够访问 Manager对
象的 hireDay字段,而不是 Employee对象的该字段。
这种限制保证你不会滥用受保护机制并且规范子
类只能获取受保护字段的访问。
protected变量和方法
如果一个类中变量或方法有修饰符
protected,同一类,同一包可以使用。
不同包的类要使用,必须是该类的子类
可以存取变量或调用。
protected变量和方法
在实际中,要小心使用 proteced属性。
假设你的类给其他程序员所用并且你在其中设
计了受保护字段,那么其他程序员就可以在你
的类上派生新类,并且开始访问你的受保护字
段。
这样你就不再能够在不通知其他程序员的情况
下,改变你的类实现。这有违 OOP精神,因为
它破坏了数据封装。
受保护方法可能更有意义。如果要限制一个方
法的使用那么在类中可以把方法声明为
proteced。这表示子类(可能很熟悉祖先类)
被信任可以使用这些方法,而其他类则不可以。
辽宁经济职业技术学院信息系
硕士、副教授 陈英
API 帮助文档
java.long,Comparable
Int compareTo(Object other)
对本对象和 otherObject 进行比较。如果本对象
小于 otherObject,返回一个负整数;如果相等,
返回 0 ;否则返回一个正整数。
java.util.Arrays
static void sort(Object[] a)
为数组 a 中的元素进行排序。数组中的所有元素
必须属于实现 Comparable 接口的类,并且它们
必须能够相互比较。
接口和回调
编程的一个常用模式是回调模式。在这种模式
中,可以指定当一个特定事件发生时所采取的
动作。
javax.Swing类中包含一个子 Timer类。如果需
要在时间间隔到时得到通知,那么这个类就非
常有用。
Java标准库中的类采取了一个面向对象的方法。
你传递某个类的一个对象,定时器调用对象上
的方法。当然定时器需要知道调用哪个方法。
定时器要求传递的对象所属的类必须要实现
java.awt.event包中的 ActionListener接口。
ActionListener接口
Public interface ActionListener
{
void actionPerformed(ActionEvent
event);
}
例如,若希望每隔十秒钟就打印一条消息,
那么需要首先定义一个实现 ActionListener
接口的类,然后实现 actionPerformed方法。
API 帮助文档
java.swing.JOptionPane
static void showMessageDialog(Comonent parent,Object message)
该方法显示一个带有提示和 OK按钮的对话框。该对话
框显示在 parent组件的中央位置,如果 parent为空,则
对话框就显示在屏幕的中央位置。
Java.swing.Timer
Timer(int interval,ActionListener listener)
构造一个定时器,每 interval微秒过后,该定时器会通
知 listener.
Void start() 启动定时器以后,定时器调用该监听器的
actionPerformed方法。
Void stop() 停止定时器。停止以后,定义器不再调用
该监听器的 actionPerformed方法。
API 帮助文档
java.awt.Toolkit
static Toolkit getDefaultToolkit()
得到默认工具箱。工具箱包含有图形用
户界面环境的信息。
Void beep()
激发一次震铃响声。
内 部 类
一个内部类是定义在另一个类内部的类。
构建内部类的原因:
1) 一个内部类的对象能够访问创建它的对象的
实现 —— 包括私有数据。
2) 对于同一包中的其他类来说,内部类能够隐
藏起来。
3) 匿名内部类可以很方便地定义回调。
4) 使用内部类可以非常方便地编写事件驱动程
序。
内部类
内部类,有时叫做嵌套类,被附加到 JDK1.1及
更高版本中。
内部类允许一个类定义被放到另一个类定义里。
内部类是一个有用的特征,因为它们允许将逻
辑上同属性的类组合到一起,并在另一个类中
控制一个类的可视性 。
内部类的类名只能用在定义它的类或语句块之
内,在外部引用时必须给出完整的名称。且内
部类的类名不能与包含它的类名相同。
InnerClasstEest内部类实例分析
定时器的动作监听器对象每隔一秒便给帐户加一
次利息。
若使用公开的方法来处理银行余额,任何人都能
够调用这些公开的方法来修改银行余额。
取而代之,使用一个内部类,该内部类的方法能
够直接处理银行余额。
只有内部类才能是私有的。普通类总是具有包可
见性或者公开性。
对于构造内部类的对象,它们并不是外部类的实
例字段,相反,它们只是外部类方法中的局部变
量。
InnerClasstEest内部类实例分析
InterestAdder类在 BankAccount类之内。这并
不意味着每一个 BankAccount都有一个
InterestAdder实例。
因为内部类实现了 ActionListener接口,所以它
具有一个 actionPerformed方法。该方法实际来
增大帐户余额。
BankAccount类中的 start方法根据给定的利息构
造了一个 InterestAdder对象,然后把它设为定
时器的动作监听器,并且启动该定时器。
作为结果,InterestAdder类中的
actionPerformed方法每秒调用一次。
InnerClasstEest内部类实例分析
public void actionPerformed(ActionEvent event)
{
double interest = balance * rate / 100;
balance += interest;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
System.out.println("balance=" + formatter.format(balance));
}
? 名字 rate指向 InterestAdder类的实例字段。然而,
InterestAdder类没有任何 balance字段。取而代之的是,
balance指向创建该 InterestAdder对象的 BankAccount对象
的一个字段。这非常有创新性。
? 传统上,一个方法能够访问调用该方法的对象数据字段。
而一个内部类方法即可以访问它自己的数据字段,也能够
访问创建它的外部对象的那些字段。
? 该引用对于外部类的定义来说是不可见的。
InnerClasstEest内部类实例分析
public void actionPerformed(ActionEvent event)
{
double interest = outer.balance* this.rate / 100;
outer,balance += interest; //outer表示调用外部对象
NumberFormat formatter = NumberFormat.getCurrencyInstance();
System.out.println("balance=" + formatter.format(outer.balance));
}
外部类引用在构造器中设置。编译器为构造器添加一个参数,
声称如下代码:
public InterestAdder(BankAccount account,double aRate)
{
outer =account;
rate = aRate;
}
内部类的属性
类名称只能用在定义过的范围中,除非用
在限定的名称中。内部类的名称必须与所
嵌套的类不同。
内部类可以被定义在方法中 。 这条规则较
简单, 它支配到所嵌套类方法的变量的访
问 。 任何变量, 不论是本地变量还是正式
参数, 如果变量被标记为 final,那么, 就
可以被内部类中的方法访问 。
内部类可以使用所嵌套类的类和实例变量
以及所嵌套的块中的本地变量 。
内部类的属性
只有内部类可以被声明为 private 或
protected,以便防护它们不受来自外部
类的访问 。 访问保护不阻止内部类使用
其它类的任何成员, 只要一个类嵌套另
一个 。
一个内部类可以作为一个接口, 由另一
个内部类实现 。
注 -内部类有常常被用作创建事件适配
器的方便特征 。
protected变量和方法
有时需要让超类的某些方法或者字段只允许子类
访问,而对于其他任何类来说都不可见。在这种
情况下,需要把类定义为受保护的,prodected。
例。如果超类 Employee把 hireDay字段定义为
proteced而不是私有的,那么 Manager中的方法就
可以直接访问它。
然而,Manager类方法仅仅能够访问 Manager对
象的 hireDay字段,而不是 Employee对象的该字段。
这种限制保证你不会滥用受保护机制并且规范子
类只能获取受保护字段的访问。
protected变量和方法
如果一个类中变量或方法有修饰符
protected,同一类,同一包可以使用。
不同包的类要使用,必须是该类的子类
可以存取变量或调用。
protected变量和方法
在实际中,要小心使用 proteced属性。
假设你的类给其他程序员所用并且你在其中设
计了受保护字段,那么其他程序员就可以在你
的类上派生新类,并且开始访问你的受保护字
段。
这样你就不再能够在不通知其他程序员的情况
下,改变你的类实现。这有违 OOP精神,因为
它破坏了数据封装。
受保护方法可能更有意义。如果要限制一个方
法的使用那么在类中可以把方法声明为
proteced。这表示子类(可能很熟悉祖先类)
被信任可以使用这些方法,而其他类则不可以。