Java核心技术--接口与内部类
接口implement
继承接口,即履行“义务”。
- 接口中所有的方法自动属于public,在接口声明中,不必提供关键字public
- 接口中决不能含有实例域,也不能在接口中实现方法
为了让类实现一个接口,通常需要下面两个步骤:
- 将类声明为实现给定的接口
- 对接口中的所有方法进行定义
接口与抽象类
为什么要引入接口,抽象类不是已经满足接口的功能了吗?
因为每个类只能扩展一个类,Java不支持
多类继承,主要原因是多类继承会让语言本身变得非常复杂(如同C++),效率也会降低(如同Eiffel)。
实际上,接口可以提供多重继承的大多数好处,同时还可以避免多重继承的复杂性和低效性。
对象克隆
拷贝
Copy时,原始变量A与copy变量B引用同一个对象,B改变,A也会相应的改变 。
克隆
clone是Object类的一个protected方法,在用户编写的代码中不能直接调用。- 默认的
clone方法是浅copy,数值或基本类没有问题,对于子对象的引用,拷贝的结果会使得两个域引用同一个对象。 - 所有数组类型均包含一个clone方法,public而不是protected
常常需要重新定义clone方法,对每个类需要做以下判断:
- 默认的clone方法是否满足需求
- 默认的clone方法是否能够通过调用可变子对象的clone得到修补
- 是否不应该使用clone
实际上,选项3是默认的。如果选择1或者2,类必须:
- 实现
Cloneable接口( 是Java提供的几种标记接口之一,标记接口没有方法) - 实现
public访问修饰符重新定义的clone方法
Class Employee implements Cloneable
{
// 即使默认clone能够满足需求,也建议实现Cloneable接口
public Employee clone() throws CloneNoSupportedException
{
// call Object clone()
Employee cloned = (Employee) super.clone();
// clone mutable fields
cloned.hireDay = (Date) hireDay.clone();
return cloned;
}
}
接口与回调(callback)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class TimerTest
{
public static void main(String[] args)
{
ActionListener listener = new TimePrinter();
Timer t = new Timer(1000, listener);
t.start();
JOptionPane.showMessageDialog(null, "quit program");
System.exit(0);
}
}
class TimePrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println("At the tone, the time is" + now);
Toolkit.getDefaultToolkit().beep();
}
}
内部类
为什么要使用内部类?
- 内部类可以访问该类定义所在的作用域中的数据,包括私有数据
- 内部类可以对同一个包中其他类隐藏起来
- 当想定义一个回调函数且不想编写大量的代码时,使用
匿名内部类比较便捷 - 只有内部类可以是私有类,常规类只具有包可见性,或者共有可见性
局部内部类
局部类不能用public或者private访问修饰符进行说明。它的作用域被限定在声明在这个局部类的快中。
由外部方法访问final变量
局部类还有一个优点,不仅能够访问包含它们的外部类,还可以访问局部变量,不过这些局部变量必须被声明为final
public void start(int interval, final boolean beep)
{
class TimerPrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println("At the time is " + now);
if(beep) Toolkit.getDefaultToolkit().beep();
}
}
ActionListener listener = new TimerPrinter();
Timer t = new Timer(interval, listener);
t.start();
}
Java核心技术--接口与内部类的更多相关文章
- Java核心技术-接口、lambda表达式与内部类
本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...
- Java抽象类接口、内部类题库
一. 选择题 1. Person类和Test类的代码如下所示,则代码中的错误语句是( C ).(选择一项) public class Person { public String nam ...
- java核心技术----接口
接口:用来描述类具有什么功能,而并不给出每个功能的具体实现. 一个类可以实现一个或多个接口. 克隆(深拷贝):创建一个新对象,且新的对象的状态与原始对象的状态相同.当对克隆的新对象进行修改时,不会影响 ...
- 《thinking in java》 接口与内部类
书本上的例子 改编后的. package test2; class A{ interface B{void f();} public class BImp implements B{public vo ...
- Java核心技术卷一基础知识-第6章-接口与内部类-读书笔记
第6章 接口与内部类 本章内容: * 接口 * 对象克隆 * 接口与回调 * 内部类 * 代理 接口技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现(implement)一 ...
- JAVA基础之接口与内部类
接口与内部类 目录 接口与内部类 1. Lambda表达式 1. 关于懒计算 2. Predicate接口 3. 关于方法引用 4. 关于构造器引用 5. 关于变量的作用域 2. 内部类 1. 局部内 ...
- Java面向对象程序设计--接口和内部类
1.接口的定义: In the Java programming language, an interface is not a class but staff[0] = ...
- [core java学习笔记][第六章接口与内部类]
接口域内部类 接口 描述类具有什么功能,不给出具体实现. 内部类 用于设计协作关系的类集合 代理 实现任意接口的对象. 6.1 接口 接口声明 public interface Comparable ...
- Java核心技术点之接口
1. 为什么使用接口 Java中的接口是一组对需求的描述.接口通过声明接口方法来对外宣布:“要想具有XX功能,就得按我说的做(即实现接口方法).” 而接口的实现类通过实现相应接口的方法来宣布:“我已经 ...
随机推荐
- [简单路径] Useful Decomposition
Ramesses knows a lot about problems involving trees (undirected connected graphs without cycles)! He ...
- R与金钱游戏:美股与ARIMA模型预测
似乎突如其来,似乎合情合理,我们和巴菲特老先生一起亲见了一次,又一次,双一次,叒一次的美股熔断.身处历史的洪流,渺小的我们会不禁发问:那以后呢?还会有叕一次吗?于是就有了这篇记录:利用ARIMA模型来 ...
- Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了). 思路:很明显就是线段树更改区间,不过这个区间的跨度有 ...
- Lack of free swap space on Zabbix server
在模板(Template)里找到Linux OS模板,修改触发器 配置>模板>Template OS Linux>触发器 找到swap关键字 修改 {Template OS Linu ...
- [POJ1835]宇航员<模拟>
链接:http://poj.org/problem?id=1835 题干太长我就不放描述了. 一道大模拟 看着就脑壳疼. 难点可能在于方向的确认上 要明确当前的头朝向和脸朝向,才能进行处理 一个小小坑 ...
- JavaScript实现哈希表
JavaScript实现哈希表 一.哈希表简介 1.1.认识哈希表 哈希表通常是基于数组实现的,但是相对于数组,它存在更多优势: 哈希表可以提供非常快速的插入-删除-查找操作: 无论多少数据,插入和删 ...
- javascript中的符号 == 和 === 的区别
== 表示相等 即仅仅比较两边变量的数值是否相等. 相等运算符隐藏的类型转换,会带来一些违反直觉的结果. 这就是为什么建议尽量不要使用相等运算符. 至于使用相等运算符会不会对后续代码造成意外影响,答 ...
- js之for与forEach循环的区别
回武汉打卡第四天,武汉加油,逆战必胜!今天咱们探讨一下for循环和forEach()循环的区别. 首先,for循环在最开始执行循环的时候,会建立一个循环变量i,之后每次循环都是操作这个变量,也就是说它 ...
- HDU-1421-搬寝室(01背包改编版)
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太 ...
- 关于C#三层架构增删改查中的“添加”问题
关于“添加”功能的实现比较简单: 先来一个简单的界面: 然后是代码: ··采用的是三层架构的思想写的·· 在DAO中的方法为: (使用了动软自动生成代码) 希望对您有所帮助!