1. 本周学习总结
1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图,对面向对象思想进行一个总结。
1.2 可选:使用常规方法总结其他上课内容。
我的总结
1)接口(续):
- 实现Cloneable接口前要覆盖父类clone方法,声明为public。
2)内部类:
(1)嵌套类:分为两种,静态与非静态。
主要特性:
- 可以访问private属性与方法
- non static 构造前提:先构造外围类
- Shadowing(内部类隐藏外围类属性)
- static 可直接建立
(2)局部类:类似内部类。
(3)匿名类:没有类名的类。
- 可节省代码,使代码更紧凑
- Lambda可以用来创建匿名方法
3)Lambda表达式:
- 语法:参数 -> 表达式或程序块{...}
4)GUI与Swing:
(1)GUI(图形接口编程):
启动GUI程序固定写法:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
(2)Swing:基于AWT架构的工具。
布局管理器(LayoutManager):
FlowLayout:组件按最佳尺寸依次按排排列(最佳尺寸-->根据界面大小"自动换行"或者无法全部显示)
BorderLayout:组件根据add(...)的方位而添加指定方位(东西南北中,只能一个组件,但可以放置Jpanel容器中包含的多个组件)
GridLayout:各组件呈网格状分布,中有pack()方法(最佳高度宽度显示所有组件)最佳高度宽度-->类似平均分配事件处理:事件需要监视(事件源(Event source)——>事件监听器)监视-->根据行为执行相应代码
实现监听接口:使用匿名类,定义专门的外部类……
一个组件可以注册多个监听者常用组件
① JTextComponent:文本域(JTextField)__单行文本;文本区(JTextArea)__多行文本;密码域(JPasswordField)
② JScrollPane:添加滚动窗格
③ JLabel:标签——容纳文本(不响应用户输入);放置图像
④ 文本输入实例
⑤ 选择组件:复选框(JCheckBox);单选按钮(ButtonGroup与JRadioButton);边框(Border);组合框(JComboBox);滑块(JSlider)
⑥ 菜单:菜单条(JMenuBar);菜单(JMenu);菜单项(JMenuItem);复选框菜单项(JCheckboxMenuItem);弹出式菜单(JPopupMenu)
⑦ 工具栏、工具提示
⑧ 对话框(Dialog):模式对话框;无模式对话框(可"外交")/ 数据交换;文件对话框(JFileChooser);颜色选择器
2. 书面作业
1. clone方法
Q1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?
Answer:
我们看一下clone()方法:
这里要注意三点:
一是克隆对象需要实现Cloneable
接口,这个接口不包含任何方法,因此Object类本身不实现Cloneable接口,所以自定义的类调用clone()方法时没有实现Cloneable接口,就会抛出CloneNotSupportedException
异常。
二是克隆对象要重写clone()方法,显然由于protcted的限制,clone()方法只能用于同包内的类或继承Object类,为了其他类可以调用clone()方法,要其将声明为public。
三是由于native
方法的效率原因使得拷贝时不需要new一个类,把原始对象复制到新对象(也实现拷贝)。
然而浅拷贝(即复制对象类型,仍属于原来的引用(使用一、二点))是远远不够的,要实现深拷贝(复制对象,相当于新对象产生)还需要在clone()方法中加入o.对象 = (类型) 对象.clone();
,例如:cloned.hireDay = (Date) hireDay.clone();
。
Q1.2 自己设计类时,一般对什么样的方法使用protected进行修饰?以作业Shape
为例说明。
Answer:
(1)自己设计类时,需要用protected进行修饰的方法,简单来说就是不想让除去子类外的其它的类修改或者调用的,用以维持本类的封装性。
(2)作业Shape:
之前做题的时候声明的是public,声明为protected也是可以的,因为getPerimeter()方法和getArea()方法可以只用于继承Shape类的的子类(在本题中)。
Q1.3 在test1包中编写简单的Employee类,在test2包中新建一个TestProtected类,并在main中尝试调用test1包中的Employee的clone方法克隆一个新对象,能否成功?为什么?
Answer:
- 显然不能成功,
protected
修饰的clone()方法在不同的包内无法调用,而且TestProtected类并没有继承Employee类。 - 我的修改:根据提示,我们将clone()方法声明为
public
,在main上定义clone()方法,
我的代码:
package test1;
public class Employee implements Cloneable {
private String name;
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "Employee [name=" + name + ", salary=" + salary + "]";
}
public Employee clone() throws CloneNotSupportedException{
return (Employee) super.clone();
}
}
package test2;
import test1.Employee;
public class TestProtected {
public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub
Employee saraly = new Employee("boss", 10000);
Employee saraly2 = saraly.clone();
System.out.println(saraly);
System.out.println(saraly2);
}
}
2. 使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目5-2
(仅需粘贴关键代码与运行结果)
PS: 最后两行的标识暂时还没有弄清楚怎么返回匿名类的接口,先省略了。
3. 分析下列代码,回答shapeComparator
所指向的对象与 Comparator接口有什么关系?
Comparator shapeComparator = new Comparator() {
@Override
public int compare(Shape o1, Shape o2) {
//你的代码
}
};
Answer:
shapeComparator所指向的对象为了实现Comparator接口,对compare()方法进行重写。
4. GUI中的事件处理
4.1 写出事件处理模型中最重要的几个关键词。
- 事件:用户在组件上进行操作引发的动作,比如敲击键盘或点击鼠标这样的动作称作事件。
- 事件源:能够产生事件GUI组件对象,比如按钮或文本框等。(事件监听器注册在事件源上)
- 事件监听器:调用能够接收、解析和处理事件的对象的接口。
4.2 使用代码与注释,证明你理解了事件处理模型。
import java.awt.event.*;
import javax.swing.*;
public class MainGUI {
public static void main(String[] args) {
JFrame f = new JFrame("Test");//新建窗口,名称为Test
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用System exit方法退出应用程序,仅在应用程序中使用。
JButton b = new JButton("Press Me!");// 事件源:创建按钮 Press Me
b.addActionListener(new ButtonHandler());// 注册监听器
f.add(b);//添加按钮
f.setSize(200, 100);//设置框架属性:大小
f.setVisible(true);//设置窗体可见
}
private static class ButtonHandler implements ActionListener {// 监听器:当事件触发时,输出以下内容并获得事件源
public void actionPerformed(ActionEvent e) {
System.out.println("Action occurred");
System.out.println(e.getSource());
}
}
}
5. 结对编程:面向对象设计(大作业2-非常重要,未完成-2)
继续完善上周的项目作业。考核点如下:
5.1 尝试使用图形界面改写。(待修改,并且有很多功能还未实现)
5.2 给出两人在码云上同一项目的提交记录截图。
5.3 与上周相比,项目的主要改动是什么?
- 上周代码未完成,本周项目尝试用图形界面改写(正在尝试中)。
3. 码云上代码提交记录及PTA实验总结__题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类
3.1. 码云代码提交记录(在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图)
3.2. PTA实验——实验总结
函数4-1:编写ActionListener的匿名内部类,一直不知道出错点;通过询问同学,输入的值要用final修饰(原因:pta不支持java8,但只有java8中内部类可以直接访问外部非final声明的对象)。
编程5-3:建立ArrayIntegerStack类实现IntegerStack接口,按照注释就可以轻易的重写方法,注意pta提交时的数组格式(我总是通不过,经过检查格式是对的=·=会再进行检查)。
编程5-4:创建一个静态内部类以及静态方法,注意调用时是使用类名进行调用的(ArrayUtils.findMinMax
)。