zoukankan      html  css  js  c++  java
  • Java核心技术--接口与内部类

    接口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();
    }
    
  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/CocoML/p/12727040.html
Copyright © 2011-2022 走看看