接口implement

继承接口,即履行“义务”。

  • 接口中所有的方法自动属于public,在接口声明中,不必提供关键字public
  • 接口中决不能含有实例域,也不能在接口中实现方法

    为了让类实现一个接口,通常需要下面两个步骤:
  1. 将类声明为实现给定的接口
  2. 对接口中的所有方法进行定义

接口与抽象类

为什么要引入接口,抽象类不是已经满足接口的功能了吗?

因为每个类只能扩展一个类,Java不支持多类继承,主要原因是多类继承会让语言本身变得非常复杂(如同C++),效率也会降低(如同Eiffel)。

实际上,接口可以提供多重继承的大多数好处,同时还可以避免多重继承的复杂性和低效性。

对象克隆

拷贝

Copy时,原始变量A与copy变量B引用同一个对象,B改变,A也会相应的改变 。

克隆

  • clone是Object类的一个protected方法,在用户编写的代码中不能直接调用。
  • 默认的clone方法是浅copy,数值或基本类没有问题,对于子对象的引用,拷贝的结果会使得两个域引用同一个对象。
  • 所有数组类型均包含一个clone方法,public而不是protected

常常需要重新定义clone方法,对每个类需要做以下判断:

  1. 默认的clone方法是否满足需求
  2. 默认的clone方法是否能够通过调用可变子对象的clone得到修补
  3. 是否不应该使用clone

实际上,选项3是默认的。如果选择1或者2,类必须:

  1. 实现Cloneable接口( 是Java提供的几种标记接口之一,标记接口没有方法)
  2. 实现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核心技术--接口与内部类的更多相关文章

  1. Java核心技术-接口、lambda表达式与内部类

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  2. Java抽象类接口、内部类题库

    一.    选择题 1. Person类和Test类的代码如下所示,则代码中的错误语句是(  C  ).(选择一项)   public class Person { public String nam ...

  3. java核心技术----接口

    接口:用来描述类具有什么功能,而并不给出每个功能的具体实现. 一个类可以实现一个或多个接口. 克隆(深拷贝):创建一个新对象,且新的对象的状态与原始对象的状态相同.当对克隆的新对象进行修改时,不会影响 ...

  4. 《thinking in java》 接口与内部类

    书本上的例子 改编后的. package test2; class A{ interface B{void f();} public class BImp implements B{public vo ...

  5. Java核心技术卷一基础知识-第6章-接口与内部类-读书笔记

    第6章 接口与内部类 本章内容: * 接口 * 对象克隆 * 接口与回调 * 内部类 * 代理 接口技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现(implement)一 ...

  6. JAVA基础之接口与内部类

    接口与内部类 目录 接口与内部类 1. Lambda表达式 1. 关于懒计算 2. Predicate接口 3. 关于方法引用 4. 关于构造器引用 5. 关于变量的作用域 2. 内部类 1. 局部内 ...

  7. Java面向对象程序设计--接口和内部类

    1.接口的定义: In the Java programming language, an interface is not a class but          staff[0] =       ...

  8. [core java学习笔记][第六章接口与内部类]

    接口域内部类 接口 描述类具有什么功能,不给出具体实现. 内部类 用于设计协作关系的类集合 代理 实现任意接口的对象. 6.1 接口 接口声明 public interface Comparable ...

  9. Java核心技术点之接口

    1. 为什么使用接口 Java中的接口是一组对需求的描述.接口通过声明接口方法来对外宣布:“要想具有XX功能,就得按我说的做(即实现接口方法).” 而接口的实现类通过实现相应接口的方法来宣布:“我已经 ...

随机推荐

  1. 四则运算APP版

    (一)四则运算APP版 这这个Demo的目的就是强化一下本周学习的Android的Jetpack里的新内容,接下来我将通过这个Demo来展示我所学到的新知识. 先列出新学到的知识:ViewModel, ...

  2. java基于Hash表和双向链表简单实现LRU Cache

    package lru; import java.util.HashMap; public class LRUCache2<K,V> { public final int capacity ...

  3. [CS充实之路] CS50 WEEK 1

    前言 大学电子专业,幸好自学了JAVA,遂有幸工作了三年,但这期间一直在焦虑,一个是基础不扎实的担心,另一个是未来方向的不确定.去年开始终于下定决心,一方面走一遍CS之路,巩固知识体系,另一方面部署自 ...

  4. Tensorboard 详解(上篇)

    花间提壶华小厨 1. Tensorboard简介 对大部分人而言,深度神经网络就像一个黑盒子,其内部的组织.结构.以及其训练过程很难理清楚,这给深度神经网络原理的理解和工程化带来了很大的挑战.为了解决 ...

  5. Nginx 实现API 网关

    1,网关 网关(Gateway)就是一个网络连接到另一个网络的“关口”. 在Nginx 配置负载均衡之后,可以进入到网关,在网关决定进入到哪个真实的web 服务器. 2,将Ngnix 配置 API 网 ...

  6. leetcode并发题解

    按序打印 解法一:使用volatile public class FooWithVolatile { private volatile int count; public FooWithVolatil ...

  7. std::bind接口与实现

    前言 最近想起半年前鸽下来的Haskell,重温了一下忘得精光的语法,读了几个示例程序,挺带感的,于是函数式编程的草就种得更深了.又去Google了一下C++与FP,找到了一份近乎完美的讲义,然后被带 ...

  8. 爬虫简介和requests模块

    目录 爬虫介绍 requests模块 requests模块 1.requests模块的基本使用 2.get 请求携带参数,调用params参数,其本质上还是调用urlencode 3.携带header ...

  9. session分布式处理

    session分布式处理 标签(空格分隔): 分布式 1. Session复制 在支持Session复制的Web服务器上, 通过修改服务器配置, 可以实现将Session同步到其它Web服务器上, 达 ...

  10. 新建基于STM32F103ZET6的工程-寄存器版本

    1.新建空白工程 新建一个文件夹,用来存放新建的工程文件.在这个新建的文件夹下创建MDK-PRO和OUTPUT两个子文件夹.MDK-PRO文件夹用来存放工程文件:OUTPUT用来存放工程编译器后输出的 ...