Java学习笔记 - 第013天

每日要点

接口

接口是方法声明的集合

接口的三个关键点:
  • 接口代表能力 (儿子实现和尚的接口,就有和尚的能力)
  • 接口代表约定 (儿子实现和尚的接口,必须全部实现接口里的抽象方法)
  • 接口代表角色(实现x的接口,就可以扮演x角色)
就地实例化

所谓就地实例化实际上是创建了匿名内部类(anonymous inner type)的对象

    Monk wenshuMonk = new Monk() {
            
            @Override
            public void knockTheBell() {
                
            }
         } ;
适配器类

适配器类 - 缺省适配模式

public class Tianxing implements Monk {

    @Override
    public void chant() {
    }

    @Override
    public void eatVegetable() {
    }

    @Override
    public void knockTheBell() {
    }

    @Override
    public void practiceKongfu() {  
    }
    
}
接口Java 8+
  • 方法可以默认
interface Foo {
    public default void bar() {
        System.out.println("hello");
    }
}
interface Kao {
    public default void bar() {
        System.out.println("fuck");
    }
}
public class A implements Foo, Kao {    
    @Override
    public void bar() {
        System.out.println("goodbye");
        Foo.super.bar();
        Kao.super.bar();
    }
    
    public static void main(String[] args) {
        A a = new A();
        a.bar();
    }
}
  • Lambda表达式 --->匿名函数
    仅限于接口只有一个方法 且 不是默认
        okButton.addActionListener(e -> {
            changeBgColor();
        });
注意

接口之间可以相互继承而且允许多重继承(一个接口继承多个接口)
public interface NB extends Musician, Monk

杂项

  • 类和类之间简单的说有三种关系
    • is-a关系 - 继承 - 学生和人
    • has-a关系 - 关联(聚合/合成) - 扑克和一张牌
    • use-a关系 - 依赖 - 人和房子
  class Person {
    private House h; // 关联
    public void buy(House h) { // 依赖
    }
  }
  • 类和它实现的接口之间的关系:
    • play-a 扮演 / like-a 像 --实现
  • 命名相关
    当不知道去什么名时
    // fuck up
    public void foo();
    
    // beyond all recognization
    public void bar();

例子

  • 1.点确定变化背景颜色
public class MyFrame extends JFrame {
//  private int x;
//  private int y;  
    public MyFrame() {
        this.setSize(300, 200);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLayout(null);       
/*      this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });     
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                repaint();
            }
        });*/   
        JButton okButton = new JButton("确定");
        okButton.setBounds(120, 100, 60, 30);
        // 给按钮对象添加行为监听器
//      okButton.addActionListener(new ActionListener() {
//          // 接口的回调(callback)方法
//          @Override
//          public void actionPerformed(ActionEvent e) {
//              changeBgColor();
//          }
//      });     
        // Java 8+ ---> Lambda表达式 --->匿名函数
        // 仅限于接口只有一个方法 且 不是默认
        okButton.addActionListener(e -> {
            changeBgColor();
        });
        this.add(okButton);
    }   
/*  @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawOval(x - 50, y - 50, 100, 100);
    }*/ 
    public void changeBgColor() {
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);
        this.getContentPane().setBackground(new Color(r, g, b));
    }   
    public static void main(String[] args) {
        new MyFrame().setVisible(true);
    }
}
  • 2.小球动画
    小球类:
public class Ball {
    private int x;         // 左上角横坐标
    private int y;         // 左上角纵坐标
    private int size;      // 尺寸
    private Color color;   // 颜色
    private int sx;        //速度在横坐标分量
    private int sy;        // 速度在纵坐标的分量
    
    public Ball(int x, int y, int size, Color color, int sx, int sy) {
        this.x = x;
        this.y = y;
        this.size = size;
        this.color = color;
        this.sx = sx;
        this.sy = sy;
    }
    
    /**
     * 移动
     */
    public void move() {
            x += sx;
            y += sy;
            if (x <= 0 || x >= 800 - size) {
                sx = -sx;
            }
            if (y <= 30 || y >= 600 - size) {
                sy = -sy;
            }
    }
    
    /**
     * 绘制小球
     * @param g 画笔
     */
    public void draw(Graphics g) {
        g.setColor(color);
        g.fillOval(x, y, size, size);
    }
}

窗口类:

public class BallFrame extends JFrame {
    private BufferedImage image = new BufferedImage(800, 600, 1);
    
    private Ball[] ballsArray = new Ball[100];
    private int total = 0;
    
    public BallFrame() {
        this.setTitle("小球动画");
        this.setSize(800, 600);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (total < ballsArray.length) {
                    int x = e.getX();
                    int y = e.getY();
                    int size = (int) (Math.random() * 81 + 20);
                    Color color = getRandomColor();
                    int sx;
                    int sy;
                    do {
                        sx = (int) (Math.random() * 21 - 10);
                        sy = (int) (Math.random() * 21 - 10);
                    } while (sx == 0 && sy == 0);
                    Ball ball = new Ball(x - size / 2, y - size / 2, size, color, sx, sy);
                    ballsArray[total++] = ball;
                }
            }
        });
        
        Timer timer = new Timer(40, e -> {
            for (int i = 0; i < total; i++) {
                Ball ball = ballsArray[i];
                ball.move();
            }
            repaint();
        });     
        timer.start();
    }
    
    private Color getRandomColor() {
        int r = (int) (Math.random() * 256);
        int g =  (int) (Math.random() * 256);
        int b =  (int) (Math.random() * 256);
        return new Color(r, g, b);
    }
    
    @Override
    public void paint(Graphics g) {
        Graphics otherGraphics = image.getGraphics();
        super.paint(otherGraphics);
        for (int i = 0; i < total; i++) {
            Ball ball = ballsArray[i];
            ball.draw(otherGraphics);
        }
        g.drawImage(image, 0, 0, null);
    }
    
    public static void main(String[] args) {
        new BallFrame().setVisible(true);
    }
}

作业

  • **1.题目:
    我想做燕子 只需简单思想 只求风中流浪
    我想做树 不长六腑五脏 不会寸断肝肠
    我做不成燕子 所以我 躲不过感情的墙
    我做不成树 因此也 撑不破伤心的网
    来生做燕子吧 随意找棵树休息翅膀 然后淡然飞向远方
    来生做树吧 枝头的燕子飞走时 不去留恋地张望 **
    燕子接口:
public interface Swallow {
    
    public default void fly() {}
    
    public default void simpleThink() {}
    
    public default void treeRest() {}
}

树接口:

public interface Tree {
    
    public default void photosynthesis() {}
}

人类:

public class Person implements Swallow, Tree {
    String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public void complexThink() {
        System.out.println(name + "正在思考复杂的事.");
    }

    public void fallInLove() {
        System.out.println(name + "正在谈恋爱.");
    }
    
    public void weep() {
        System.out.println(name + "正在哭泣.");
    }

    @Override
    public void photosynthesis() {
        System.out.println(name + "想变成一棵树自由呼吸.");
    }

    @Override
    public void fly() {
        System.out.println(name + "想要变成燕子飞翔.");
    }

    @Override
    public void simpleThink() {
        System.out.println(name + "想要变成燕子简单的去思考.");
    }

    @Override
    public void treeRest() {
        System.out.println(name + "想要变成燕子在树上休息.");
    }   
}

测试类:

        Person person = new Person("小白");
        person.complexThink();
        person.fallInLove();
        person.weep();
        
        Swallow swallow = person;
        swallow.fly();
        swallow.simpleThink();
        swallow.treeRest();
        
        Tree tree = person;
        tree.photosynthesis();

你可能感兴趣的:(Java学习笔记 - 第013天)