每日要点
接口
接口是方法声明的集合
接口的三个关键点:
- 接口代表能力 (儿子实现和尚的接口,就有和尚的能力)
- 接口代表约定 (儿子实现和尚的接口,必须全部实现接口里的抽象方法)
- 接口代表角色(实现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();