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)。

  • 相关阅读:
    LeetCode:前K个高频单词【692】
    LeetCode:前K个高频元素【347】
    Java进阶教程:Lambda表达式与最佳实践
    《图说VR入门》——googleVR 他山之玉
    执行力:我的一些个人实践
    执行力:我的一些个人实践
    设计模式——迭代器模式详解
    P2P平台投宝金融跑路?为什么我没有中雷!
    P2P平台投宝金融跑路?为什么我没有中雷!
    NetWork——关于HTTP、HTTPS的知识总结
  • 原文地址:https://www.cnblogs.com/whting/p/6633684.html
Copyright © 2011-2022 走看看