201871010118-唐敬博《面向对象程序设计(java)》第十二周学习总结

博文正文开头格式:(2分)

项目

内容

这个作业属于哪个课程

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),体验程序开发中的两人合作。

随笔博文正文内容包括:

第一部分:总结第九章、第十章理论知识(40分)

 

1.数据结构:分为a.线性数据结构,如线性表、栈、队列、串、数组和文件。

                          b.非线性数据结构,如树和图。

1)所有数据元素在同一个线性表中必须是相同的数据类型。

  线性表按其存储结构可分为顺序表和链表。

2)栈:也是一种特殊的线性表,是一种后进先出(LIFO)的结构。

  栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶,表头称为栈底。

3)队列:限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。是一种先进先出(FIFO)的结构。

  表中允许插入的一端称为队尾,允许删除的一端称为队头。

2.集合:(容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类型的对象组成。

  1)集合框架:JAVA集合类库的统一架构。

  2)集合类的作用(包含在java.util包中):提供一些基本数据结构的支持,如Vector、Hashtable、Stack等。

  3)集合类的特点:a.只容纳对象;

                                      b.集合类容纳的对象都是Object类的实例(一旦把一个对象置入集合类中,它的类信息将丢失)

  4)Vector类:类似长度可变的数组。它只能存放对象,其元素通过下标进行访问。

  5)Stack类(Vector的子类):它描述堆栈数据结构。(所有对象都有一个散列码,可以通过Object类的hashCode方法获得。)

3.集合框架中的基本接口:a.Collection(构造类集框架的基础):集合层次中的根接口,JDK未提供这个接口的直接实现类。

                                           b.Set:不能包含重复的元素,即元素必须唯一。对象可能不是按存放的次序存放。(实 现 Set 接口的类有HashSet,TreeSet)

                                           c.List:有序的集合,可以包含重复的元素。提供了按索引访问的方式。实现它的类有ArrayList和LinkedLis(如ArrayList:能够自动增长容量的数组)

                                           d.Map:Map接口映射唯一关键字到值。包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。

3.用户界面:用户与计算机系统(各种程序)交互的接口

  图形用户界面:以图形方式呈现的用户界面

4.AWT:Java 的抽象窗口工具箱( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。

  AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地GUI工具箱进行处理。

5.Swing:Swing用户界面库是非基于对等体的GUI工具箱。

  Swing具有更丰富并且更方便的用户界面元素集合。

  Swing对底层平台的依赖很少,因此与平台相关的bug很少。

  Swing类库被放在javax.swing包里。

大部分AWT组件都有其Swing的等价组件。Swing组件的名字一般是在AWT组件名前面添加一个字母“J”。

创建框架

1.组件:构成图形用户界面的元素,拿来即用用图形表示(能在屏幕上显示,能和用户进行交互)

2.通常把由Component类的子类或间接子类创建的对象称为一个组件。

3.容器:容器是Java中能容纳和排列组件的组件。常用的容器是框架(Frame,JFrame)

定位:
  —常用Component类的setLocation和setBounds方法
常用属性
  —Title:框架标题
  —IconImage:框架图标

  确定框架的大小:通过调用Toolkit类的方法来得到屏幕尺寸信息。

4.在组件中显示信息

在AWT中可调用add()方法把组件直接添加到AWTFrame中,在Swing中组件则添加到内容窗格里。

其中内容窗格是用来添加组件的,添加代码如下:

  Container contentPane = getContentPane();

用户也可以自行创建一个组件类,并在组件上进行绘制,此时需要重载paintComponent()。

用户的自建组件也可添加到内容窗格里。

public void setEnabled(boolean b):设置组件是否可被激活。
  当参数b取值true时,组件可以被激活。
  当参数b取值false 时,组件不可激活。
  默认情况下,组件是可以被激活的。
public void setVisible(boolean b):设置组件在该容器中的可见性。
  当b取值true时,组件在容器中可见。
  当b取值false时,组件在容器中不可见。
  除了Window型组件外,其它类型组件默认是可见的。

第二部分:实验部分

实验1:测试程序1(6分)

导入第9章示例程序,测试程序并进行代码注释。

※使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;

※掌握Vetor、Stack、Hashtable三个类的用途及常用API。

Vetor

实验程序如下:

 1 import java.util.Vector;  //实现自动增长的对象数组
 2 
 3 class Cat {
 4      private int catNumber;
 5      Cat(int i) {
 6         catNumber = i;
 7     }
 8      void print() {
 9         System.out.println("Cat #" + catNumber);
10      }
11 }
12 public class Cats{
13 public static void main(String[] args){
14        Vector<Cat> cats= new Vector<Cat>();
15        for(int i=0; i<7; i++)
16            cats.addElement(new Cat(i)); 
17        for(int i=0; i<cats.size(); i++)
18            (cats.elementAt(i)).print();  //进行强制类型转化
19    }
20 }
运行结果如下:

 

 

Stack:

实验程序如下:

 1import java.util.*;
 2 public class Stacks  //栈(先进后出)
 3 {
 4    static String[] months={"金","银","铜","铁"};
 5    public static void main(String[] args){
 6       Stack<String> stk = new Stack<String> ();
 7       for(int i=0; i<months.length; i++)
 8           stk.push(months[i]);  //进栈
 9       System.out.println(stk);
10       System.out.println("element 2=" + stk.elementAt(2));
11       while(!stk.empty())
12           System.out.println(stk.pop());  //输出出栈元素
13   }
14 }
实验结果如下:

 

 

 Hashtable:

实验程序如下:

import java.util.*;
 2 class Counter {
 3     int i = 1;  //不加权限修饰符:friendly型
 4     public String toString() {  //把其他类型的数据转为字符串类型的数据
 5         return Integer.toString(i);
 6     }
 7 }
 8 
 9 public class Statistics {
10     public static void main(String[] args) {
11         Hashtable ht = new Hashtable();
12         for (int i = 0; i < 10000; i++) {
13             Integer r = new Integer((int) (Math.random() * 20));  //生成0到20(不包括20)的整型随机数
14             if(ht.containsKey(r))  //判断r是否是哈希表中一个元素的键值
15               ((Counter)ht.get(r)).i++;  //通过get方法获得其值
16           else
17               ht.put(r, new Counter());  //ht不存在
18 }
19         System.out.println(ht);
20     }
21 }
实验结果如下:

 

 

实验1:测试程序2(6分)

※使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;

ArrayListDemo:

实验程序如下:

 1 import java.util.*;
 2 
 3 public class ArrayListDemo   //ArrayList使用了数组的实现
 4 {
 5     public static void main(String[] argv) {
 6         ArrayList al = new ArrayList();
 7         // Add lots of elements to the ArrayList...
 8         al.add(new Integer(11));
 9         al.add(new Integer(12));
10         al.add(new Integer(13));
11         al.add(new String("hello"));  //下标从0开始,添加4个元素
12         // First print them out using a for loop.
13         System.out.println("Retrieving by index:");
14         for (int i = 0; i < al.size(); i++) {
15             System.out.println("Element " + i + " = " + al.get(i));
16         }
17      }
18 }
实验结果如下:

 

 

 LinkedListDemo:

实验程序如下:

 1 import java.util.*;
 2 
 3 public class LinkedListDemo
 4 {
 5     public static void main(String[] argv)
 6     {
 7         //创建一个链表
 8         LinkedList l = new LinkedList();
 9         l.add(new Object());
10         l.add("Hello");
11         l.add("zhangsan");
12         ListIterator li = l.listIterator(0);
13         while (li.hasNext())
14             System.out.println(li.next());
15         if (l.indexOf("Hello") < 0)   
16             System.err.println("Lookup does not work");
17         else
18             System.err.println("Lookup works");
19    }
20 }
实验结果如下:

 

 

实验1:测试程序3(6分)

※Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;

※掌握ArrayList、LinkList两个类的用途及常用API。

实验程序如下:

1 import java.util.*;
 2 
 3 /**
 4  * This program demonstrates operations on linked lists.
 5  * @version 1.11 2012-01-26
 6  * @author Cay Horstmann
 7  */
 8 public class LinkedListTest
 9 {
10    public static void main(String[] args)
11    {
12        //创建a和b两个链表
13       List<String> a = new LinkedList<>();//泛型
14       a.add("Amy");
15       a.add("Carl");
16       a.add("Erica");
17 
18       List<String> b = new LinkedList<>();//泛型
19       b.add("Bob");
20       b.add("Doug");
21       b.add("Frances");
22       b.add("Gloria");
23 
24       //合并a和b中的词
25 
26       ListIterator<String> aIter = a.listIterator();
27       Iterator<String> bIter = b.iterator();
28 
29       while (bIter.hasNext())
30       {
31          if (aIter.hasNext()) aIter.next();
32          aIter.add(bIter.next());
33       }
34 
35       System.out.println(a);
36 
37       //从第二个链表中每隔一个元素删除一个元素
38 
39       bIter = b.iterator();
40       while (bIter.hasNext())
41       {
42          bIter.next(); // skip one element
43          if (bIter.hasNext())
44          {
45             bIter.next(); // skip next element
46             bIter.remove(); // remove that element
47          }
48       }
49 
50       System.out.println(b);
51 
52       // bulk operation: remove all words in b from a
53 
54       a.removeAll(b);
55 
56       System.out.println(a);//通过AbstractCollection类中的toString方法打印出链表a中的所有元素
57    }
58 }
实验结果如下:

 

 

实验2:测试程序1(6分)

※运行下列程序,观察程序运行结果

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 import javax.swing.*;
 2 public class SimpleFrameTest
 3 {
 4    public static void main(String[] args)
 5    {
 6      JFrame  frame = new JFrame(); //创建一个frame类对象
 7      frame.setBounds(0, 0,300, 200);//定义坐标以及宽度和高度
 8      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭操作
 9      frame.setVisible(true);//窗口是否可见    
10    }
11 }

 

 

※在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;

※掌握空框架创建方法;

※了解主线程与事件分派线程概念;

※掌握GUI顶层窗口创建技术。

实验程序如下:

 1 package simpleFrame;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.33 2015-05-12
 8  * @author Cay Horstmann
 9  */
10 public class SimpleFrameTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() ->//lambda表达式:通过线程开启一个队列
15          {
16             SimpleFrame frame = new SimpleFrame();//创建一个类对象
17             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置对象点击关闭操作
18             frame.setVisible(true);//页面是否可见
19          });
20    }
21 }
22 
23 class SimpleFrame extends JFrame
24 {
25    private static final int DEFAULT_WIDTH = 300;
26    private static final int DEFAULT_HEIGHT = 200;
27 
28    public SimpleFrame()//构造器
29    {
30       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//设置大小
31    }
32 }
实验结果如下:

 

 

实验2:测试程序2(6分)

※在elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;

※掌握确定框架常用属性的设置方法。

实验程序如下:

1 package simpleFrame;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.34 2015-06-16
 8  * @author Cay Horstmann
 9  */
10 public class SizedFrameTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() ->//lambda表达式:通过线程开启一个队列
15          {
16             JFrame frame = new SizedFrame();//创建一个frame类对象
17             frame.setTitle("SizedFrame");//设置标题
18             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭操作
19             frame.setVisible(true);//设置可见性
20          });
21    }
22 }
23 
24 class SizedFrame extends JFrame//继承
25 {
26    public SizedFrame()//构造器
27    {
28       //得到屏幕维度
29 
30       Toolkit kit = Toolkit.getDefaultToolkit();//生成Toolkit对象
31       Dimension screenSize = kit.getScreenSize();
32       int screenHeight = screenSize.height;
33       int screenWidth = screenSize.width;
34 
35       // set frame width, height and let platform pick screen location
36 
37       setSize(screenWidth / 2, screenHeight / 2);//尺寸大小
38       setLocationByPlatform(true);
39 
40       // set frame icon
41 
42       Image img = new ImageIcon("icon.gif").getImage();
43       setIconImage(img);      
44    }
45 }
实验结果如下:

 

 实验2:测试程序3(6分)

※在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;

※掌握在框架中添加组件;

※掌握自定义组件的用法。

实验程序如下:

1 package simpleFrame;
 2 
 3 import javax.swing.*;
 4 import java.awt.*;
 5 
 6 /**
 7  * @version 1.33 2015-05-12
 8  * @author Cay Horstmann
 9  */
10 public class NotHelloWorld
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() ->//lambda表达式:通过线程开启一个队列
15          {
16             JFrame frame = new NotHelloWorldFrame();
17             frame.setTitle("NotHelloWorld");//标题
18             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19             frame.setVisible(true);
20          });
21    }
22 }
23 
24 /**
25  * A frame that contains a message panel
26  */
27 class NotHelloWorldFrame extends JFrame//继承
28 {
29    public NotHelloWorldFrame()//构造器
30    {
31       add(new NotHelloWorldComponent());//添加窗口
32       pack();
33    }
34 }
35 
36 /**
37  * A component that displays a message.
38  */
39 class NotHelloWorldComponent extends JComponent
40 {
41    public static final int MESSAGE_X = 75;
42    public static final int MESSAGE_Y = 100;
43 
44    private static final int DEFAULT_WIDTH = 300;
45    private static final int DEFAULT_HEIGHT = 200;
46 
47    public void paintComponent(Graphics g)//绘图
48    {
49       g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
50    }
51    
52    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
53 }
实验结果如下:

 

 三,实验总结:(19分)

通过本周的学习,我学习到了用JAVA语言更方便的实现数据结构的一些知识,理论课感觉自己能听懂,但实践课一动手发现自己还是有很多知识不知道,因此,在后面的学习中,除了多练习代码,我还会多翻书去记下一些细节和概念。努力学好这门课程。

posted @ 2019-11-18 21:48  tangjingbo  阅读(151)  评论(1编辑  收藏  举报