zoukankan      html  css  js  c++  java
  • 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

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

    运行结果:

          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以及如何设置字体和颜色,因为上个学期有过这方面知识的学习,所里理解起来并不是特别困难,但课后还是需要多加巩固练习。其次是编程方面还是有一定的困难,以后要继续练习。

  • 相关阅读:
    运营商公网
    任务管理器 的 服务与进程
    QQ通信原理及QQ是怎么穿透内网进行通信的?
    windows Telnet 客户端常用命令介绍
    redis优化
    shell反射
    USB安装centos6系统(centos7需要换软件)
    rocketmq双主模式
    golang数据类型与转换
    golang介绍
  • 原文地址:https://www.cnblogs.com/gonghaiyu/p/11883080.html
Copyright © 2011-2022 走看看