第6周-接口、内部类与Swing

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

(仅需粘贴关键代码与运行结果)

  • 匿名类

  • Lambda表达式

  • 运行结果

PS: 最后两行的标识暂时还没有弄清楚怎么返回匿名类的接口,先省略了。

  • 返回接口

  • 新的运行结果

3. 分析下列代码,回答shapeComparator所指向的对象与 Comparator接口有什么关系?

Comparator<Shape> shapeComparator = new Comparator<Shape>() {
    @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)。

原文地址:https://www.cnblogs.com/whting/p/6633684.html