《Java核心技术》复习笔记 - 第六章 接口与内部类
来源:互联网 发布:淘宝集运香港仓电话 编辑:程序博客网 时间:2024/05/16 00:49
《Java核心技术》复习笔记 - 第六章 接口与内部类
1. 接口和抽象类的区别
2. Java不支持多重继承,但是引入了接口的概念,声明一个接口用关键字interface,实现接口用关键字implements,接口是可以继承的。接口绝不能含有实例域,也不能在接口中实现方法。接口中的所有方法自动为public,在实现接口时,必须把实现的方法声明为public,否则编译器认为该方法是包可见性,并可出一个警告。接口中可以包含常量,接口中的域被自动设为public static final。
3. Object有一个protected的clone方法,提供的克隆操作为浅拷贝,即没有拷贝对象所引用的对象。如果原始对象与浅拷贝对象共享的子对象是不可变的,将不会产生任何问题。但是更常见的是子对象是可变的,这时就要重新定义clone方法,以便提供深拷贝语义。由于Object提供的clone方法为protected,因此子类只能调用受保护的clone方法克隆它自己。为此,必须重新定义clone方法,并将他申明为public,这样才能让所有的方法克隆该类的对象。
import java.util.*;/** * This program demonstrates cloning. * @version 1.10 2002-07-01 * @author Cay Horstmann */public class CloneTest{ public static void main(String[] args) { try { Employee original = new Employee("John Q. Public", 50000); original.setHireDay(2000, 1, 1); Employee copy = original.clone(); copy.raiseSalary(10); copy.setHireDay(2002, 12, 31); System.out.println("original=" + original); System.out.println("copy=" + copy); } catch (CloneNotSupportedException e) { e.printStackTrace(); } }}class Employee implements Cloneable{ public Employee(String n, double s) { name = n; salary = s; hireDay = new Date(); } public Employee clone() throws CloneNotSupportedException { // call Object.clone() Employee cloned = (Employee) super.clone(); // clone mutable fields cloned.hireDay = (Date) hireDay.clone(); return cloned; } /** * Set the hire day to a given date. * @param year the year of the hire day * @param month the month of the hire day * @param day the day of the hire day */ public void setHireDay(int year, int month, int day) { Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime(); // Example of instance field mutation hireDay.setTime(newHireDay.getTime()); } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } public String toString() { return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; } private String name; private double salary; private Date hireDay;}
4. 所有数组类型都包含一个clone方法,这个方法被设为public,而不是protected,可以利用这个方法创建一个包含所有数据元素拷贝的新数组。
5. 内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域。内部类对象有一个隐式引用,指向创建它的外部类对象。外围类的引用是在构造器中设置的,编译器会修改所有内部类的构造器,添加一个外围类的引用参数。
import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.Timer;/** * This program demonstrates the use of inner classes. * @version 1.10 2004-02-27 * @author Cay Horstmann */public class InnerClassTest{ public static void main(String[] args) { TalkingClock clock = new TalkingClock(1000, true); clock.start(); // keep program running until user selects "Ok" JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); }}/** * A clock that prints the time in regular intervals. */class TalkingClock{ /** * Constructs a talking clock * @param interval the interval between messages (in milliseconds) * @param beep true if the clock should beep */ public TalkingClock(int interval, boolean beep) { this.interval = interval; this.beep = beep; } /** * Starts the clock. */ public void start() { ActionListener listener = new TimePrinter(); Timer t = new Timer(interval, listener); t.start(); } private int interval; private boolean beep; public class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("At the tone, the time is " + now); if (beep) Toolkit.getDefaultToolkit().beep(); } }}
6. 只有内部类可以是私有的,而常规类只可以具有包可见性或公有可见性。
7. 局部内部类:如果内部类只在某个方法中使用了一次,就可以在方法中定义一个局部内部类。局部内部类不能用public或private访问说明符进行申明。它的作用域被限定在申明这个局部类的块中。局部类不仅可以访问外部类,还可以访问局部变量,不过这些局部变量必须被申明为final。
8. 匿名内部类:如果只创建局部内部类的一 个对象,就不用命名了。这种类被称为匿名内部类,如GUI编程中的监听器类对象。
9. 静态内部类:有时候使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外部类的对象,为此,可以将内部类申明为static,以便取消产生的引用。只有内部类可以声明为static,声明在接口中的内部类自动成为static和public。
/** * This program demonstrates the use of static inner classes. * @version 1.01 2004-02-27 * @author Cay Horstmann */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 p = ArrayAlg.minmax(d); System.out.println("min = " + p.getFirst()); System.out.println("max = " + p.getSecond()); }}class ArrayAlg{ /** * A pair of floating-point numbers */ public static class Pair { /** * Constructs a pair from two floating-point numbers * @param f the first number * @param s the second number */ public Pair(double f, double s) { first = f; second = s; } /** * Returns the first number of the pair * @return the first number */ public double getFirst() { return first; } /** * Returns the second number of the pair * @return the second number */ public double getSecond() { return second; } private double first; private double second; } /** * Computes both the minimum and the maximum of an array * @param values an array of floating-point numbers * @return a pair whose first element is the minimum and whose second element * is the maximum */ public static Pair minmax(double[] values) { double min = Double.MAX_VALUE; double max = Double.MIN_VALUE; for (double v : values) { if (min > v) min = v; if (max < v) max = v; } return new Pair(min, max); }}
- 《Java核心技术》复习笔记 - 第六章 接口与内部类
- #Java 核心技术卷一阅读笔记# 第六章 接口、lambda表达式与内部类
- java核心技术笔记 接口与内部类
- 【java核心技术笔记】接口与内部类
- java核心技术第六章——接口和内部类
- java学习笔记---第六章接口与内部类
- [core java学习笔记][第六章接口与内部类]
- Java核心技术:卷1笔记[4] 接口和内部类
- Java核心技术(第8版)学习笔记_接口与内部类
- [学习笔记] Java核心技术 卷一:基础知识 接口、lambda表达式与内部类(三)
- JAVA核心技术I之接口与内部类
- 接口与内部类(Java核心技术卷Ⅰ)
- JAVA基础【6.4】《Java核心技术1》接口与内部类-内部类
- 2015 7 1 java核心技术 卷1 第6章 接口与内部类
- Java核心技术 卷I —— 第6章 接口与内部类
- Java复习笔记(7)——接口和内部类
- JAVA学习笔记----接口与内部类
- 笔记:Java 接口与内部类
- Struts2基于XML配置方式实现对Action方法进行校验
- 《Java核心技术》复习笔记 - 第五章 继承
- django mysql数据库配置以及管理界面提交中文错误解决
- 写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
- 网络和计应12级电子商务学习
- 《Java核心技术》复习笔记 - 第六章 接口与内部类
- 【选择排序】堆排序--Java
- C语言经典算法100例-021-猴子吃桃问题
- C++ throw()引发的core
- Cookie深度解析
- 《Java核心技术》复习笔记 - 第十三章 集合
- STM32学习心得
- java中TextArea和JTextArea的自动换行和滚动条
- 《Java核心技术》复习笔记 - 第十四章 多线程