201871010107-公海瑜《面向对象程序设计(java)》第十二周学习总结
201871010107-公海瑜《面向对象程序设计(java)》第十二周学习总结
项目 | 内容 |
这个作业属于哪个课程 | https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 | https://www.cnblogs.com/nwnu-daizh/p/11867214.html |
作业学习目标 |
(1) 掌握Vetor、Stack、Hashtable三个类的用途及常用API; (2) 掌握ArrayList、LinkList两个类的用途及常用API; (3) 了解java集合框架体系组成; (4) 掌握Java GUI中框架创建及属性设置中常用类的API; (5) 了解Java GUI中2D图形绘制常用类的API; |
第一部分:总结第九章、第十章理论知识
集合
1.数据结构介绍
l 一般将数据结构分为两大类:线性数据结构和非线性数据结构。
l 线性数据结构:线性表、栈、队列、串、数组和文件。
l 非线性数据结构:树和图。
A.线性表 单向链表 循环链表 双向循环链表
B.栈(Stack)
C.队列(Queue)
D.散列表
2.JAVA的集合框架
l JAVA的集合框架实现对各种数据结构的封装,以降低对数据管理与处理的难度。
l 所谓框架就是一个类库的集合,框架中包含很多超类,编程者创建这些超类的子类可较方便的设计设计程序所需的类。例如:Swing类包
l 集合(Collection或称为容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类型的对象组成。
l 集合框架:JAVA集合类库的统一架构。
1)集合类的作用
l 集合类的作用:
– Java的集合类提供了一些基本数据结构的支持。
– 例如Vector、Hashtable、Stack等。
l 集合类的使用:
– Java的集合类包含在java.util包中。
– import java.util.*;
2)集合类的特点
l 特点一:
– 只容纳对象。
注意:数组可以容纳基本数据类型数据和对象。
– 如果集合类中想使用基本数据类型,又想利用集合类的灵活性,可以把基本数据类型数据封装成该数据类型的包装器对象,然后放入集合中处理。
l 特点二:
– 集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,这样设计的目的是为了集合类的通用性。
– 因为Object类是所有类的祖先,所以可以在这些集合中存放任何类的对象而不受限制,但切记在使用集合成员之前必须对它重新造型。
3. 新旧集合类
Vector类
Stack类
Hashtable类
集合框架中的基本接口
l Collection:集合层次中的根接口,JDK未提供这个接口的直接实现类。
l Set:不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一样按索引的方式进行访问,SortedSet是一个按照升序排列元素的Set。
l List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。
l Map:包含了key-value对。Map不能包含重复的key。
l SortedMap是一个按照升序排列key的Map。
4.AWT与Swing简介
用户界面(User Interface)
– 用户与计算机系统(各种程序)交互的接口
图形用户界面(Graphical User Interface)
– 以图形方式呈现的用户界面
AWT
Java 的 抽 象 窗 口 工 具 箱 ( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。
AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地GUI工具箱进行处理。
应用AWT编写依赖于本地用户界面元素GUI会暴露出一些缺陷。例如,菜单、滚动条和文本域这些用户界面元素,在不同的平台上,操作行为上存在一些微妙的差异。
Swing
l Swing用户界面库是非基于对等体的GUI工具箱。
l Swing具有更丰富并且更方便的用户界面元素集合。
l Swing对底层平台的依赖很少,因此与平台相关的bug很少。
l Swing会带来交叉平台上的统一视觉体验。
l Swing类库被放在javax.swing包里。
AWT与Swing的关系
l 大部分AWT组件都有其Swing的等价组件。
l Swing组件的名字一般是在AWT组件名前面添加一个字母“J”,如:JButton,JFrame,JPanel等
5.框架的创建
1)组件
构成图形用户界面的元素,拿来即用
l 用图形表示(能在屏幕上显示,能和用户进行交互)
– Button、Checkbox、Scrollbar、Choice、Frame
l 通常把由Component类的子类或间接子类创建的
对象称为一组件
2)容器
l 容器是Java中能容纳和排列组件的组件。
l 常用的容器是框架(Frame,JFrame)
3)添加组件
Container类提供了一个方法add(),用来在容器类组件对象中添加其他组件。
容器本身也是一个组件,可以把一个容器添加到另一个容器里,
4)框架(Frame)
l 在Java中,常采用框架(Frame)创建初始界面,即GUI的顶层窗口
5)在组件中显示信息
①Jframe的结构,它由根面板、层级面板、玻璃面板和 内容面板(content pane)四层面板构成。Swing程序员最关心的是内容面板,也称为内容窗格。
②在AWT中可调用add()方法把组件直接添加到AWT Frame中,在Swing中组件则添加到内容窗格里。
第二部分:实验部分
实验1: 导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
l 使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;
l 掌握Vetor、Stack、Hashtable三个类的用途及常用API。
//示例程序1 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]);//放入一个i值
System.out.println(stk); System.out.println("element 2=" + stk.elementAt(2));//element表示一个节点
while(!stk.empty()) System.out.println(stk.pop()); } }
运行结果:
//示例程序3 import java.util.*; class Counter { int i = 1; public String toString() { return Integer.toString(i); } } public class Statistics { public static void main(String[] args) { Hashtable ht = new Hashtable();//生成集合类Hashtable
for (int i = 0; i < 10000; i++) { Integer r = new Integer((int) (Math.random() * 20)); //随机生成实数定义为整型
if(ht.containsKey(r)) ((Counter)ht.get(r)).i++;//用来判断r是否为一个间值
else ht.put(r, new Counter()); } System.out.println(ht); } }
运行结果:
测试程序2:
l 使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;
ArrayListDemo代码如下:
import java.util.*; public class ArrayListDemo { public static void main(String[] argv) { ArrayList al = new ArrayList(); //用Add来添加对象且可以重载 // Add lots of elements to the ArrayList... al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // 首先使用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"); //add方法可以重载 ListIterator li = l.listIterator(0); //迭代器生成li对象 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"); } }
运行结果:
测试程序3:
l 在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
l 掌握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两个链表 List<String> a = new LinkedList<>(); a.add("Amy"); a.add("Carl"); a.add("Erica"); List<String> b = new LinkedList<>(); b.add("Bob"); b.add("Doug"); b.add("Frances"); b.add("Gloria"); //把b和a合并 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); // 删除b中的每两个单词 bIter = b.iterator(); while (bIter.hasNext()) { bIter.next(); // 跳过一个元素 if (bIter.hasNext()) { bIter.next(); // 跳过下一个元素 bIter.remove(); // 删除该元素 } } System.out.println(b); // 批量操作:从a中删除b中的所有单词 a.removeAll(b); System.out.println(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); } }
运行结果:
l 在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
l 掌握空框架创建方法;
l 了解主线程与事件分派线程概念;
l 掌握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(() -> { SimpleFrame frame = new SimpleFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); //设置用户是否能调整框架大小 })y; } } 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:
在elipse IDE中调试运行教材412页程序10-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表达式:通过线程开启一个队列 { var frame = new SizedFrame(); frame.setTitle("SizedFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } class SizedFrame extends JFrame { public SizedFrame() { // 获得Dimension的大小 Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.height; int screenWidth = screenSize.width; // 确定框架的大小,以及在屏幕上的位置 setSize(screenWidth / 2, screenHeight / 2); setLocationByPlatform(true); // 将图像设置为框架的图标 Image img = new ImageIcon("icon.gif").getImage(); setIconImage(img); } }
yu运行结果:
测试程序3:
l 在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
l 掌握在框架中添加组件;
掌握自定义组件的用法。
程序代码如下:
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(() -> { var 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 { 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); } }
运行结果:
三、实验总结
通过本周的学习,我更深层次地掌握了数据结构方面的知识,并且对图形用户界面的知识有了一定的了解。在课堂上,我初步了解了绘制图形的常用API以及如何设置字体和颜色,因为上个学期有过这方面知识的学习,所里理解起来并不是特别困难,但课后还是需要多加巩固练习。其次是编程方面还是有一定的困难,以后要继续练习。