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

1. 本周学习总结

1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图,对面向对象思想进行一个总结。

2. 书面作业

  • Q1.clone方法

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

    答:创建自己的自定义类时,必须覆盖继承的 .clone() 方法,以复制自定义类的属性。要注意重新定义clone方法时要将它声明为pubilc。protected修饰clone()方法时子类只能调用受保护的clone方法克隆它自己,
    所以,必须重新定义clone方法 ,并将它声明为pubilc,这样才能让所有的方法克隆对象。做完上述操作之后,编译发现报错,抛出 CloneNotSupportedException 异常,出现这个情况的原因是由于没有实现Cloneable接口

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

    答:用protected修饰的成员变量可以被三种类所引用:该类自身、与它在同一个包中的其它类、在其他包中的该类的子类。使用protected修饰符的主要作用是允许其他包中该类的子类来访问父类的特定属性。此外,用该关键字修饰的成分是受保护的,只可以被同一包及其子类的实例对象访问。所以,当coder希望类某一方法只被同包中的类或者子类访问的时候,用protected进行修饰。Shape类被Circle、Rectangle这两个子类继承,这两个子类都需要使用getPerimeter()与getArea()两种方法,所以可以用protected修饰方法。

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

    test 1 包中代码:

      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();
       }	
      }
    

    test2包中代码:

      package test2;
      	
      public class TestProtected {
      public static void main(String[] args) {
      
      	TestProtected employee=new TestProtected("Yao",3000);
          TestProtected copy = null;![](http://images2015.cnblogs.com/blog/1109769/201704/1109769-20170402205634024-1683386050.png)
    
      	copy = employee.clone();
      System.out.println(copy);
    
      }
      }
    

不能成功。因为TestProtected类和Employee类不在同一个包内,TestProtected类也未继承Employee类。

修改后代码如下:

	package test2;
	import test1.Employee;
	public class TestProtected {
		public static void main(String[] args) {
		Employee employee=new Employee("Yao",3000);
			Employee copy = null;
			
				try {
					copy = employee.clone();
				} catch (CloneNotSupportedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
			System.out.println(copy);
	}
	}

运行结果为:Employee [name=Yao, salary=3000.0]
  • Q2.使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目5-2

    Labmda表达式语法:参数 -> 表达式或程序块{ }

    部分代码如下:

    Comparator<PersonSortable2> nameComparator = (o1,o2)->o1.getName().compareTo(o2.getName());//匿名内部类的方法新建比较器
    Comparator<PersonSortable2> ageComparator = (arg0,arg1)->arg0.getAge()-arg1.getAge();//匿名内部类的方法新建比较器
    Arrays.sort(person,nameComparator);//按照名字排序
    Arrays.sort(person,ageComparator);//按照年龄排序
    

    输入数据:

    5
    
    zhang 15
    
    zhang 12
    
    wang 14
    
    wang 17
    
    li 17
    

运行结果:

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

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

    答:用匿名内部类,将compare方法进行重写,shapeComparator类实现了Comparator接口

  • Q4.GUI中的事件处理

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

    事件源:产生事件的来源,通常是各种组件,如按钮,窗口等.

    事件对象:于每一个事件源发生一个动作时,就会产生一个事件。

    事件监听器:负责监听事件源发生的事件,并对不同的事件做相应的处理。

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

(此题不是很懂,于是仔细看了老师的ppt,然而最后还是请教了同学)

	import java.awt.EventQueue;
	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;
	import javax.swing.JButton;
	import javax.swing.JFrame;
	
	public class MainGUI {
		static int count = 0;
	public static void main(String[] args) {
			EventQueue.invokeLater(new Runnable() {
				public void run() {
					JFrame f = new JFrame("MyText");
					f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
					JButton b = new JButton("press me!");// 事件源
					b.addActionListener(new ActionListener() {
						@SuppressWarnings("deprecation")
						public void actionPerformed(ActionEvent e) {
							System.out.println("The event occurred" + (count + 1) + "times");
							b.setLabel("click" + new Integer(++count).toString() + "times");
							System.out.println("Eventsource:" + e.getSource().getClass());// 获得事件源
						}
					});
					// b.addActionListener(new ButtonHandler());// 注册监听器
					f.add(b);
					f.setSize(200,300);
					f.setVisible(true);
				}
			});
		}
		
	}
  • Q5.结对编程:面向对象设计

    继续完善上周的项目作业。考核点如下:(还在修改代码中)

  • 5.1 尝试使用图形界面改写。

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

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

    对上周的代码进行完善,原来的程序不一定适用于图形界面,需要改动的地方有很多

郭炜埕 姚佳希 项目地址
[郭炜埕的博客链接][http://www.cnblogs.com/vicheng/p/6652066.html] [姚佳希的博客链接][https://i.cnblogs.com/EditPosts.aspx?postid=6659732] [ShoppingCart码云地址][https://git.oschina.net/vicheng/ShoppingCart/commits/master]

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

题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2. PTA实验

函数(选做:4-1)、编程(5-3, 5-4)
一定要有实验总结

  • 5-3:一个类可以实现多个接口,在本题中用接口描述一个存放Integer元素的栈的常见方法。

  • 5-4:静态内部类相当于一个全新的类。不需要创建外部类后才能创建内部类

posted @ 2017-04-02 20:34  ballon  阅读(143)  评论(0编辑  收藏  举报