zoukankan      html  css  js  c++  java
  • 第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)。

  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/whting/p/6633684.html
Copyright © 2011-2022 走看看