• 201521123003《Java程序设计》第6周学习总结


    1. 本周学习总结

    1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图,对面向对象思想进行一个总结。
    注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对象的核心内容即可。
    注2:颜色要少、连线不要复杂,必要的时候要在连线上进行说明。
    参考资料:

    XMind


    2. 书面作业

    Q1.clone方法
    1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?

    1.关键字protected表明这个方法不能被其他包中的类直接调用,因此,在自定义的类中覆盖clone方法时,将protected改为public,以便在任何包都可以调用该方法。同时,还需实现Cloneable接口。
    2.使用super.clone(),仅实现了对于可复制类的其他对象进行浅拷贝,即复制的是对象的引用,而不是对象的内容,没有克隆包含在对象中的其他引用型属性。如果要进行深复制,需要使用自定义的复制操作覆盖clone方法,具体如下代码:

    class Employee implements Cloneable{
        public Employee clone() throws ....{
        //call Object.clone()
        Employee cloned = (Employee) super.clone();
        // clone mutable fields
        cloned.hireDay = (Date) hireDay.clone(); //实现深复制
        return cloned;
        }
    }
    

    [参考文章](http://www.itzhai.com/java-based-notebook-the-object-of-deep-and-shallow-copy-copy-copy-implement-the-cloneable-interface-serializing-deep-deep-copy.html#₩ᄋᄆ¥ᄂヘ¥ネᄊ(deep clone)￯ᄐレ)

    1.2 自己设计类时,一般对什么样的方法使用protected进行修饰?以作业Shape为例说明。

    protected关键字表明其子类可以访问(即使不在同一个包),同包的其他类可以访问父类的protected属性和方法。以Shape为例,Circle类和Rectangle类都是Shape类的子类,这两个子类都包含有getPerimeter()与getArea()方法。所以,在父类中将这两种方法用修饰符protected定义,子类的可进行访问即可。

    代码如下:

    abstract class Shape 
    {
        private final static double PI = 3.14;
        protected abstract double getPerimeter();
        protected abstract double getArea();
    }
    

    1.3 在test1包中编写简单的Employee类,在test2包中新建一个TestProtected类,并在main中尝试调用test1包中的Employee的clone方法克隆一个新对象,能否成功?为什么?

    不能成功,会出现如下图中的错误,因为Employee类和TestProtected类并不在同一个包内,在test1包Employee类中的clone方法是用protected修饰的,对其他包中的类是不可见的,需将protected改为public。

    修改后的代码如下:

    package test1;
    
    public class Employee implements  Cloneable {
    	private String name;
    	private double salary;
    	
    	public Employee(String name, double salary) {
    		super();
    		this.name = name;
    		this.salary = salary;
    	}
    
    	@Override
    	public Employee clone() throws CloneNotSupportedException{
            // TODO Auto-generated method stub
            return (Employee) super.clone();
        }
    
    	@Override
    	public String toString() {
    		return "Employee [name=" + name + ", salary=" + salary + "]";
    	} 
    	
    }
    
    package test2;
    
    import test1.Employee;
    
    public class TestProtected {
    
    	public static void main(String[] args) throws CloneNotSupportedException  {
    		// TODO Auto-generated method stub
    		Employee employee = new Employee("张三", 5000);
    		Employee employee2 = employee.clone();
    		System.out.println(employee2.toString());
    	}
    
    }
    

    运行结果如下:


    Q2.使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目5-2
    仅需粘贴关键代码与运行结果,图片不要太大。

    关键代码:

    Comparator<PersonSortable2> NameComparator = new Comparator<PersonSortable2>()
    {
    
    	@Override
    	public int compare(PersonSortable2 o1, PersonSortable2 o2) {
    	    return new String (o1.getName()).compareTo(o2.getName());
    	}
    
    		
    };
    Comparator<PersonSortable2> AgeComparator = new Comparator<PersonSortable2>()
    {
    
    	@Override
    	public int compare(PersonSortable2 o1, PersonSortable2 o2) {
    		return o1.getAge()-o2.getAge();
    	}
    		
    }
    

    运行结果:


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

    Comparator<Shape> shapeComparator = new  Comparator<Shape>() {  
         @Override  
         public int compare(Shape o1, Shape o2) {  
             //你的代码     
          }         
    };  
    

    这显然是一个匿名内部类,让shapeComparator实现Comparable接口,使其可以实现对象的比较进而实现排序。只是实现接口,并没有必要给此类取名字,这样也减少了代码量。


    Q4.GUI中的事件处理
    4.1 写出事件处理模型中最重要的几个关键词。

    事件(event):事件对象,比如点击按钮、组件发生变化或按下某个键时便产生了某个事件。
    事件源:导致事件产生的组件,比如按钮、标签、文本框等等。
    事件监听器:一组动作接口。与之对应的事件发生时,即一般在鼠标点击某个按钮时会产生该事件,该接口包含处理该事件的抽象方法。事件监听器需要注册才能使用,同时也可以注销的。

    4.2 使用代码与注释,证明你理解了事件处理模型。

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class MainGUI {
    	public static void main(String[] args) {
    		JFrame f = new JFrame("Test");
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JButton b = new JButton("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());//获得事件源
    	    }
    	}
    }
     
    

    Q5.结对编程:面向对象设计(大作业2-非常重要,未完成-2)
    继续完善上周的项目作业。考核点如下:
    5.1 尝试使用图形界面改写。
    1.登陆界面

    2.登陆之后,跳转到搜索界面

    3.搜索商品,主要就弄了book类和clothes类,可以选择添加进购物车的商品数量

    4.点击查看购物车,跳转到购物车界面显示已加商品信息

    5.2 给出两人在码云上同一项目的提交记录截图。

    5.3 与上周相比,项目的主要改动是什么?

    -将原本的控制台输入输出全部改成由图形界面输入输出
    -新增了登陆、注册界面
    -购物车类多了一个增加添加进购物车的商品数量


    3. PTA实验总结及码云上代码提交记录

    3.1本周Commit历史截图

    在码云的项目中,依次选择“统计-Commits历史-设置时间段”,然后搜索并截图,如下图所示


    3.2 实验总结

    实验碰到的问题、思考、收获与解决方案

    实验5_3在刚开始编写peek()方法时返回arr[top],导致输出的结果错误;同时,没有考虑到数字数量大于栈的容量,导致PTA上提交答案部分正确
    解决方案:返回值改成arr[top-1];每次入栈打印入栈返回结果的代码改成System.out.println(stack.push(x));
    具体改动代码如下

    public Integer peek() {
        // TODO Auto-generated method stub
        if(top==0)return null;
        else return arr[top-1];
        }
    
    for(int i=0;i<m;i++){
        int x=in.nextInt();
        System.out.println(stack.push(x));
        }
    

    实验5_4主要是运用静态内部类,静态内部类相当于一个全新的类。可直接建立,不需要先建立外围类,不能访问外围类的非静态属性与方法。此题主要注意静态内部类的代码编写。

  • 相关阅读:
    vue指令(3)v-html
    vue指令(2)v-text
    vue基础(2)模板语法
    Struts2中在Action里面向前端页面传值的方法总结
    MySQL之字符串函数
    搜索关键字描红
    点击超链接执行js代码实现确认操作
    Java之线程同步的三种方法
    Java之线程的控制
    Java之线程的生命周期
  • 原文地址:https://www.cnblogs.com/dongmf/p/6658812.html
Copyright © 2020-2023  润新知