201871010104-陈园园 《面向对象程序设计(java)》第十二周学习总结
201871010104-陈园园 《面向对象程序设计(java)》第十二周学习总结
项目 | 内容 |
这个作业属于哪个课程 | https://www.cnblogs.com/nwnu-daizh/ |
这个作业要求在哪里 | https://www.cnblogs.com/lily-2018/p/11441372.html |
作业学习目标 |
(1) 掌握Vetor、Stack、Hashtable三个类的用途及常用API; (2) 掌握ArrayList、LinkList两个类的用途及常用API。 (3) 掌握Java GUI中框架创建及属性设置中常用类的API; (4) 应用结对编程(Pair programming),体验程序开发中的两人合作。 |
第一部分:总结理论知识
第九章集合知识点回顾
1、’’java的集合框架(java集合类库的统一架构)实现对各种数据的封装。
所谓框架就是一个类库,框架中包含一些通用接口和超类,编程者实现这些接口或创建这些超类的子类就可方便的设计程序所需的类。
集合(容器):是一类包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可由不同类型的对象组成。
2、集合类的作用:Java的集合类提供了一些基本数据结构的支持。例如Vector、Hashtable、Stack等。
集合类的使用:Java的集合类包含在java.util包中。import java.util.*。
3、集合类的特点:只容纳对象。(如果要使用基本数据类型,又想利用集合类的灵活性,可以吧基本数据类型数据封装成该数据类型的包装器对象,然后放入集合中处理。)
注意:数组可以容纳基本数据类型数据和对象。
集合类容纳的对象都是Object类的实例,一旦 把一个对象置入集合类中,它的类信息将丢失 ,这样设计的目的是为了集合类的通用性。
4、新旧集合类
1)在JDK1.0和JDK1,1中提供了Vector(矢量),Hashtable(哈希表),Stack(堆栈),Prooerties(属性类)等集合类,(缺点:缺少一个统一集中的机制)。
2)在JDK1.2中,java设计了一个统一的类集,并多上述类进行了改写,使其统一纳入java的集合框架。
Vector类:(举例见实验一示例程序一)
Vector类类似长度可变的数组。
Vector中只能存放对象。
Vector的元素通过下标进行访问。
Vector类关键属性:capacity表示集合多能容纳的元素个数。
capacityIncrement表示每次增加多少容量。
size表示集合当前元素个数。
5.Stack类:(实验一实例程序二)
Stack类是Vector的子类。
Stack类描述堆栈数据结构,即LIFO。
关键方法:
-public void push(Object item)//把项压入栈顶
-public Object pop()//移除栈顶对象并作为此函数的值返回该对象
-public boolean empty()//测试堆栈是否为空
6.Hashtable类:(实验一示例程序三)
Hashtable通过键来查找元素。
Hashtable用散列码(hashcode)来确定键。所有对象都有一个散列码,可以通过Object类的 hashCode()方法获得。
JDK1.2以后版本中的集合类:
java1.2以后有了一个统一的集合体系,用来完成各种集合的操作。
-Collection(构造类集框架的基础,常用方法见教材350-351页):集合层次中的根接口,JDK未提供这个 接口的直接实现类。
-Set:不能包含重复的元素。对象可能不是按存放的 次序存放,也就是说不能像数组一样按索引的方式进 行访问,SortedSet是一个按照升序排列元素的Set。
-List:是一个有序的集合,可以包含重复的元素。提 供了按索引访问的方式。
-Map:包含了key-value对。Map不能包含重复的key 。
-SortedMap是一个按照升序排列key的Map。
基本接口:
List类:分为ArrayList类(元素在内存中是顺序存储的,见教材178页)和LinkedLis(元素在内存中是以链表方式存储的,教材362页)类。
ArrayList:可以将其看作是能够自动增长容量的数组。
利用ArrayList的toArray()的toArray()返回的一个数组。
其余代码见教材集第二部分实验部分。
第十章知识总结
1.概述:用户界面,用户与计算机系统(各种程序)交互的接口,图形用户界面,以图形方式呈现的用户界面。
2.AWT:Java的抽象窗口工具箱,它包含在java.awt包中,提供了许多用来设计GUI的组件类和容器类。
AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地的GUI工具箱进行处理。
3.Swing:在java.swing包中,Swing用户界面库是非基于对等体的GUI工具箱。
4.AWT与Swing的关系:(1)大部分AWT组件都有其Swing的等价组件。
(2)Swing组件的名字一般是在AWT组件名前面添加一个字母“J”,如:JButton,JFrame,JPanel等。
5.创建框架:
(1)组件:通常把由Component类的子类或间接子类创建的对象称为一个组件。
(2)容器:Java中呢容纳和排列组件的组件,通常的容器是框架。
(3)添加组件:Container类提供了一个方法add(),用来在容器类组件对象中添加其他组件。
6.框架(Frame)的创建:
(1)创建空框架:在Java中,常采用框架(Frame)创建初始界面,即GUI的顶层窗口;AWT库中有一个基于对等体的Frame类;该类的Swing版本为JFrame,JFrame是Frame子类。
(2)框架定位与框架属性:
定位:常用Component类的setLocation和setBounds方法。
常用属性:Title(框架标题);IconImage(框架图标)。
(3)确定框架大小:通过调用Toolkit类的方法来得到屏幕尺寸信息。
7.在组件中显示信息:
(1)在AWT中可调用add()方法把组件直接添加到AWTFrame中,在Swing中组件则添加到内容窗格里。其中内容窗格是用来添加组件的,添加代码如下。
Container contentPane = getContentPane();
(2)用户也可以自行创建一个组件类,并在组件上进行绘制,此时需要重载paintComponent(),用户的自建组件也可添加到内容窗格里。
(3)public void setEnabled(boolean b):设置组件是否可被激活,
当参数b取值true时,组件可以被激活;当参数b取值false 时,组件不可激活;默认情况下,组件是可以被激活的。
(4)public void setVisible(boolean b):设置组件在该容器中的可见性,
当b取值true时,组件在容器中可见;当b取值false时,组件在容器中不可见;除了Window型组件外,其它类型组件默认是可见。
第二部分:实验部分
实验1: 导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
1)使用JDK行运行编辑、运行以下三个示例程序,结合运行结果理解程序;
2) 掌握Vector、Stack、Hashtable三个类的用途及常用API。
示例程序1
package JavaTest; import java.util.Vector;//实现自动增长的对象数组 class Cat { private int catNumber; Cat(int i) { catNumber = i; } void print() { System.out.println("Cat #" + catNumber); } } public class Cats{ public static void main(String[] args){ Vector<Cat> cats= new Vector<Cat>(); for(int i=0; i<7; i++) cats.addElement(new Cat(i)); for(int i=0; i<cats.size(); i++) (cats.elementAt(i)).print(); } }
运行结果:
示例程序2
import java.util.*; public class Stacks //栈(先进后出) { static String[] months={"金","银","铜","铁"}; public static void main(String[] args){ Stack<String> stk = new Stack<String> (); for(int i=0; i<months.length; i++) stk.push(months[i]);//进栈 System.out.println(stk); System.out.println("element 2=" + stk.elementAt(2)); while(!stk.empty()) System.out.println(stk.pop());//输出出栈元素 } }
运行结果:
示例程序3
import java.util.*; class Counter { int i = 1;//不加权限修饰符:friendly型 public String toString() //把其他类型的数据转为字符串类型的数据 { return Integer.toString(i); } } public class Statistics { public static void main(String[] args) { Hashtable ht = new Hashtable(); for (int i = 0; i < 10000; i++) { Integer r = new Integer((int) (Math.random() * 20));//生成0到20(不包括20)的整型随机数 if(ht.containsKey(r))//判断r是否是哈希表中一个元素的键值 ((Counter)ht.get(r)).i++;//通过get方法获得其值 else ht.put(r, new Counter());//ht不存在 } System.out.println(ht); } }
运行结果:
测试程序2:
使用Eclipse编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;
ArrayListDemo类
import java.util.*; public class ArrayListDemo {//ArrayList使用了数组的实现 public static void main(String[] argv) { ArrayList al = new ArrayList(); //在ArrayList中添加大量元素 al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello"));//下标从0开始,添加4个元素 //首先使用for循环打印它们。 System.out.println("Retrieving by index:"); for (int i = 0; i < al.size(); i++) { System.out.println("Element " + i + " = " + al.get(i)); } } }
运行结果:
LinkedListDemo类
import java.util.*; public class LinkedListDemo {//创建一个链表类 public static void main(String[] argv) { LinkedList l = new LinkedList(); l.add(new Object());//添加三个元素 l.add("Hello"); l.add("zhangsan"); ListIterator li = l.listIterator(0); while (li.hasNext()) System.out.println(li.next()); if (l.indexOf("Hello") < 0) System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }
运行结果:
1)在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
2)掌握ArrayList、LinkList两个类的用途及常用API。
package linkedList; import java.util.*; /** * This program demonstrates operations on linked lists. * @version 1.12 2018-04-10 * @author Cay Horstmann */ public class LinkedListTest { public static void main(String[] args) {//创建a和b两个泛型链表 LinkedList a = new LinkedList<String>(); a.add("Amy"); a.add("Carl"); a.add("Erica"); LinkedList b = new LinkedList<String>(); b.add("Bob"); b.add("Doug"); b.add("Frances"); b.add("Gloria"); //合并a和b中的词 ListIterator<String> aIter = a.listIterator(); Iterator<String> bIter = b.iterator(); while (bIter.hasNext()) { if (aIter.hasNext()) aIter.next(); aIter.add(bIter.next()); } System.out.println(a); //从第二个链表中每隔一个元素删除一个元素 bIter = b.iterator(); while (bIter.hasNext()) { bIter.next(); // skip one element if (bIter.hasNext()) { bIter.next(); // skip next element bIter.remove(); // remove that element } } System.out.println(b); // bulk operation: remove all words in b from a a.removeAll(b); System.out.println(a);//通过AbstractCollection类中的toString方法打印出链表a中的所有元素 } }
运行结果:
实验2:导入第10章示例程序,测试程序并进行代码注释。
测试程序1:
运行下列程序,观察程序运行结果。
import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setBounds(0, 0,300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
运行结果:
1)在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
2)掌握空框架创建方法;
3)了解主线程与事件分派线程概念;
掌握GUI顶层窗口创建技术。
package simpleFrame; import java.awt.*; import javax.swing.*; /** * @version 1.34 2018-04-10 * @author Cay Horstmann */ public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(()->//lambda表达式:通过线程开启一个队列 { SimpleFrame frame = new SimpleFrame();//创建一个类对象 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置对象点击关闭操作 frame.setVisible(true);//页面是否可见 }); } } class SimpleFrame extends JFrame { private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; public SimpleFrame()//构造器 { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//设置大小 } }
运行结果:
测试程序2:
1) 在elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;
2)掌握确定框架常用属性的设置方法。
package sizedFrame; import java.awt.*; import javax.swing.*; /** * @version 1.35 2018-04-10 * @author Cay Horstmann */ public class SizedFrameTest { public static void main(String[] args) { EventQueue.invokeLater(() ->//lambda表达式:通过线程开启一个队列 { SizedFrame frame = new SizedFrame();//创建一个frame类对象 frame.setTitle("SizedFrame");//设置标题 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭操作 frame.setVisible(true);//设置组件可见性 }); } } class SizedFrame extends JFrame//设置继承关系,SizedFrame的父类为JFrame { public SizedFrame()//构造器 { //得到屏幕维度 Toolkit kit = Toolkit.getDefaultToolkit();//生成Toolkit对象 Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.height;//设置高度 int screenWidth = screenSize.width;//设置宽度 // set frame width, height and let platform pick screen location setSize(screenWidth / 2, screenHeight / 2);//设置尺寸大小 setLocationByPlatform(true); // set frame icon Image img = new ImageIcon("icon.gif").getImage(); setIconImage(img); }
运行结果:
测试程序3:
1) 在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
2)掌握在框架中添加组件;
掌握自定义组件的用法。
package notHelloWorld; import javax.swing.*; import java.awt.*; /** * @version 1.34 2018-04-10 * @author Cay Horstmann */ public class NotHelloWorld { public static void main(String[] args) { EventQueue.invokeLater(() ->//lambda表达式:通过线程开启一个队列 { NotHelloWorldFrame frame = new NotHelloWorldFrame(); frame.setTitle("NotHelloWorld");;//设置标题 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭窗口 frame.setVisible(true);//设置窗口可见性 }); } } /** * A frame that contains a message panel. */ class NotHelloWorldFrame extends JFrame//设置继承,NotHelloWorldFrame的父类是JFrame { public NotHelloWorldFrame()//构造器 { add(new NotHelloWorldComponent());//添加窗口 pack(); } } /** * A component that displays a message. */ class NotHelloWorldComponent extends JComponent//设置继承 { public static final int MESSAGE_X = 75;//设置位置 public static final int MESSAGE_Y = 100; private static final int DEFAULT_WIDTH = 300;//设置宽度 private static final int DEFAULT_HEIGHT = 200;//设置高度 public void paintComponent(Graphics g)//绘图 { g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } public Dimension getPreferredSize() //覆盖这个方法,返回组建的首选大小 { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
运行结果:
实验总结:
本周学习了图形用户界面,即以图形的方式呈现的用户界面,了解了新旧集合类的不同之处。掌握了Vetor、Stack、Hashtable三个类的用途,以及java集合框架体系组成,掌握ArrayList、LinkList两个类的用途及常用API。课堂上,认真听了老师的讲解,对基础知识有了一定的掌握,除此之外,在实验课上,对程序代码运行并做了一定的理解,总之,这章内容掌握的还可以。以后也会继续努力的。