笔记总结九
01-接口介绍
-
接口主要体现的是对规则的声明
-
问题 : 什么时候我们需要定义接口 ?
-
发现一个类中, 所有的方法, 全部都是抽象方法, 这个类的唯一价值, 就只是在声明规则, 对于这种类
-
通常会改写为 Java 中接口.
-
理解 : 100% 抽象类
-
interface Inter {
public abstract void methodA();
public abstract void methodB();
}
02-接口的定义和使用
-
定义格式 :
public interface 接口名 {}
-
注意 : 接口不允许实例化 (不允许创建对象) , 我们应该关注的是接口的实现类
-
实现接口的格式 :
public class 类名称 implements 接口名 {}
-
作为接口的实现类 (子类)
1. 重写所有的抽象方法
2. 将实现类变成一个抽象类
03-接口中的成员特点
-
成员变量
-
只能是常量 , 因为默认被三个关键字修饰
public static final
这三个关键字没有顺序关系
-
-
成员方法
-
只能是抽象方法 , 因为默认加入了两个关键字 (jdk8版本之前正确的)
public abstract -
jdk8版本开始, 接口中允许定义, 带有方法体的普通方法了
-
jdk9版本开始, 接口中可以定义私有方法, 和静态方法
-
-
构造方法
-
没有构造方法
-
04-接口和类之间的各种关系
-
类与类 :
继承关系, 只支持单继承, 不支持多继承, 但是可以多层继承
-
类与接口 :
实现关系, 可以单实现, 也可以多实现, 并且可以在继承一个类的同时, 实现多个接口
-
接口与接口 :
继承关系, 可以单继承, 也可以多继承
05-JButton 按钮组件
-
构造方法
public JButton() : 创建一个不带任何文本和图片的按钮组件
public JButton(String text) : 创建一个带有传入字符串的按钮组件
-
将按钮添加到面板中
1. JFrame窗体为面板指定了默认的布局方式, 我们需要取消默认布局, 才能够让组件摆放的更灵活
frame.setLayout(null);
2. 当取消了默认布局之后, 一定要指定组件的摆放位置
btn.setBounds(x,y,width,height);
3. 添加到面板
frame.getContentPane().add(组件);
06-JLabel (图片\文本组件)
-
JLbale 是一块区域, 区域中可以展示文本和图片
-
构造方法 :
public JLabel() : 创建一个不带文本和图片的JLabel对象
public JLabel(String text) : 可以在构造方法中, 指定要展示的文字
public JLabel(Icon image) : 在构造方法中, 传入 ImageIcon 对象, 指定要展示的图片
JLabel jl1 = new JLabel("展示文字");
JLabel jl2 = new JLabel(new ImageIcon("D:\\image\\2.png"));
07- ActionListener - 动作监听
-
监听到鼠标左键 , 空格按键
JButton btn = new JButton("点我");
btn.addActionListener(ActionListener的实现类对象);
多态的应用:
public void addActionListener(ActionListener l) {
listenerList.add(ActionListener.class, l);
}
形参: ActionListener l
实参: new AImpl();
ActionListener l = new AImpl();
08- MouseListener - 鼠标监听 (了解)
-
监听(鼠标点击,鼠标按下,鼠标松开,鼠标滑入,鼠标滑出)
JButton btn = new JButton("点我");
btn.addMouseListener(MouseListener的实现类对象);
public synchronized void addMouseListener(MouseListener l) {
if (l == null) {
return;
}
mouseListener = AWTEventMulticaster.add(mouseListener,l);
newEventsOnly = true;
// if this is a lightweight component, enable mouse events
// in the native container.
if (peer instanceof LightweightPeer) {
parent.proxyEnableEvents(AWTEvent.MOUSE_EVENT_MASK);
}
}
形参: MouseListener l
实参: new AImpl();
MouseListener l = new AImpl(); // -- 多态
09- KeyListener - 键盘监听 (重点)
-
任务 : 能够对窗体加入键盘监听, 并能够区分出上下左右谁被按下了
-
keyCode
-
37 (左)
-
38 (上)
-
39 (右)
-
40 (下)
-
-
-
监听 (键盘按下, 键盘松开, 键盘键入)
JFrame frame = new JFrame();
frame.addKeyListener(KeyListener实现类对象);
10- 多态的介绍和前提
-
封装 : 隐藏实现细节, 仅对外暴露公共的访问方式
-
继承 : 让类与类之间产生关系, 子父类关系, 子类就可以直接使用父类的非私有成员
-
多态 : 对象在不同时刻, 体现的不同种形态
Cat c = new Cat(); // 这个对象, 以猫的形态所体现
Animal a = new Cat(); // 这个对象, 以动物猫的形态所体现
- 落地到实际代码中, 多态到底是什么?
- 父类引用指向子类对象
- 注意: 这种写法并不是随便就能写的 -
多态的前提条件 :
-
要有继承\实现关系
-
要有方法重写
-
要有父类引用指向子类对象
-
11- 多态成员的访问特点
-
当我们以父类引用指向子类对象之后, 调用成员有哪些特点 ?
-
成员变量:
-
编译看左边 (父类), 运行看左边(父类)
-
-
成员方法:
-
编译看左边(父类), 运行看右边(子类)
-
12- 多态的好处和弊端
-
好处 :
-
提高了代码的扩展性
-
体现 : 将方法的形参定义为父类类型, 这个方法就能接收该父类的任意子类对象
-
-
弊端 :
-
不能调用子类特有的成员
-
-
问题 : 非要调用子类特有的成员, 怎么办 ?
-
直接创建子类对象
-
强调的原因 : 一般来说, 多态创建对象之后, 都只调用共性的成员
-
-
向下转型
-
13-多态的转型问题
-
向上转型 (比对隐式转换)
-
父类引用指向子类对象
Fu f = new Zi(); -
-
向下转型 (比对强制转换)
-
将对象, 从新指向到子类的引用
Zi z = (Zi)f; -
14-instanceof关键字
-
避免向下转型的安全隐患
-
异常 : ClassCastException : 在引用数据类型的强转过程中, [实际类型] 和 [目标类型] 不匹配
Animal a = new Dog();
Cat c = (Cat)a; // 出现问题
public static void useAnimal(Animal a) {
// Animal a = new Cat();
// Animal a = new Dog();
a.eat();
if(a instanceof Cat ){
// 强转成Cat
Cat c = (Cat) a;
c.catchMouse();
}else if(a instanceof Dog) {
// 强转成Dog
Dog d = (Dog) a;
d.watchHome();
}
}
浙公网安备 33010602011771号