美文网首页
Java核心技术--接口与内部类

Java核心技术--接口与内部类

作者: Silence_Dong | 来源:发表于2018-08-16 08:46 被阅读0次

6.1 接口implement

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

  • 接口中所有的方法自动属于public,在接口声明中,不必提供关键字public
  • 接口中决不能含有实例域,也不能在接口中实现方法
    为了让类实现一个接口,通常需要下面两个步骤:
  1. 将类声明为实现给定的接口
  2. 对接口中的所有方法进行定义
接口与抽象类

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

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

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

6.2 对象克隆

拷贝

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

6.3 接口与回调(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();
    }
}

6.4 内部类

为什么要使用内部类?

  • 内部类可以访问该类定义所在的作用域中的数据,包括私有数据
  • 内部类可以对同一个包中其他类隐藏起来
  • 当想定义一个回调函数且不想编写大量的代码时,使用匿名内部类比较便捷
  • 只有内部类可以是私有类,常规类只具有包可见性,或者共有可见性
局部内部类

局部类不能用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核心技术上的例子很不错,本篇内部类博客部分代码以Java核心技术上的例子进行讲解。 内部类总览 内部类...

  • Java核心技术--接口与内部类

    6.1 接口implement 继承接口,即履行“义务” 接口中所有的方法自动属于public,在接口声明中,不必...

  • PHP转JAVA的记录

    Java 数组 内部类 内部类的创建:内部类可以对包内其他类隐藏想实现一个接口时, 不想新建类文件 内部类可以访问...

  • 6接口与内部类

    6 接口与内部类 后面将介绍Java的几种常用的高级技术,掌握以完善自己的Java工具箱。 首先,接口(inter...

  • Java基础:内部类

    Java中有一种特殊的类,是写在类里面的,叫作内部类。内部类又分为成员内部类、局部内部类、静态内部类、接口内部类和...

  • JAVA中的内部类和 JAVA 的持有对象

    内部类 为什么 在JAVA 中每个内部类都能实现一种接口,这也是实现多态的一种方式。无论外部类是否已经实现了该接口...

  • Java匿名内部类

    导语 学完匿名内部类就懂的情书。 主要内容 接口与抽象类和匿名内部类的关系 具体内容 匿名内部类也就是没有名字的内...

  • 接口与抽象类【Java提高四】

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 抽象类与接口是java语言中对抽象概念进行定义...

  • Kotlin匿名内部类

    引言 匿名内部类常用作接口实现、回调等 java kotlin

  • kotlin之内部类,匿名内部类与伴生对象

    个人博客:haichenyi.com。感谢关注 内部类   kotlin的内部类与java的内部类有点不同java...

网友评论

      本文标题:Java核心技术--接口与内部类

      本文链接:https://www.haomeiwen.com/subject/urnybftx.html