corejDay1

1、内部类:

有什么用?

1、可以访问该类定义所在作用域中的数据,包括私有数据。

2、当想定义一个回调函数而不想编写大量代码时,使用匿名内部类比较便捷。

3、内部类可以对同一个包中的其他类隐藏起来。

什么时候用?

1、想省代码

2、想访问本类数据

3、想隐藏数据(要写的类,仅被一个类使用一次)

简单内部类举例

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created by xkfx on 2017/2/12.
 */
public class InnerClassTest{
    public static void main(String[] args){
        TalkingClock clock = new TalkingClock(1000 , true); //参数改成100系统不响铃
        clock.start();

        JOptionPane.showMessageDialog(null , "Quit?");  //没有这两行代码,程序无法运行???
        System.exit(0);
    }
}

class TalkingClock{
    private int interval;
    private boolean 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 class TimePrinter implements ActionListener{    //设置成private就实现了封装

        //这里有一个不可见的隐式引用 outer = 外围类对象
        //下面的beep等价于 outer.beep
        //TimePrinter有一个隐式的构造器 public TimePrinter(TalkingClock clock){ outer = clock; }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("...");
            if(beep) Toolkit.getDefaultToolkit().beep();    //内部类可以访问外围类对象的数据域
        }
    }
}

内部类的语法规则

局部内部类

:在一个方法中定义类

匿名内部类

:例如

public void start(int interval, boolean beep)
{
    ActionListener listener = new ActionListener(){
        public void actionPerformed(ActionEvent event){
            System.out.println("...");
            if(beep){
                Toolkit.getDefaultToolkit().beep();
            }
        }
    };
    Timer t = new Timer(interval, listener);
    t.start();
}

如何将静态内部类镶嵌在辅助类中

 

2、代理

有什么用?

可以在运行时创建一个实现了一组给定接口的新类。

只有在编译时无法确定需要实现哪个接口时才有必要使用。

什么时候用?

原文地址:https://www.cnblogs.com/xkxf/p/6390926.html