201871010123-吴丽丽 《面向对象程序设计(Java)》第十六周学习总结

项目 内容
这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/
这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/12031970.html
作业的学习目标

(1) 掌握Java应用程序的打包操作;

(2) 掌握线程概念;

(3) 掌握线程创建的两种技术。

(4) 学习设计应用程序的GUI。

第一部分:总结教材14.1-14.3知识内容

1、程序与进程的概念:

(1)程序是一段静态的代码,它是应用程序执行的蓝本。

(2)进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。

(3)操作系统为每个进程分配一段独立的内存空间和系统资源,包括:代码数据以及堆栈等资源。每 一个进程的内部数据和状态都是完全独立的。

(4)多任务操作系统中,进程切换对CPU资源消耗较大。

2、多线程的概念:

(1)多线程是进程执行过程中产生的多条执行线索。

(2)线程是比进程执行更小的单位。

(3)线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据。

(4)每个线程有它自身的产生、存在和消亡的过程, 是一个动态的概念。

(5)多线程意味着一个程序的多行语句可以看上去几 乎在同一时间内同时运行。

(6)线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程(lightweight process)。

3、Java实现多线程有两种途径:
(1)创建Thread类的子类

(2)在程序中定义实现Runnable接口的类

4、用Thread类的子类创建线程:

(1)首先需从Thread类派生出一个子类,在该子类中重写run()方法。

  1. class hand extends Thread {
  2. public void run() {……}
  3. }

(2) 然后创建该子类的对象

  1. Lefthand left=new Lefthand();
  2. Righthand right=new Righthand();

(3)最后用start()方法启动线程

  1. left.start();
  2. right.start();

5、用Thread类的子类创建多线程的关键性操作:

(1)定义Thread类的子类并实现用户线程操作,即 run()方法的实现。

(2)在适当的时候启动线程。

(3)  由于Java只支持单重继承,用这种方法定义的类不可再继承其他父类。

6、用Runnable()接口实现线程

(1)首先设计一个实现Runnable接口的类;

(2) 然后在类中根据需要重写run方法;

(3)再创建该类对象,以此对象为参数建立Thread 类的对象;

(4)调用Thread类对象的start方法启动线程,将 CPU执行权转交到run方法。

例如:

  1. class A implements Runnable{
  2. public void run(){….}
  3. }
  4. class B {
  5. public static void main(String[] arg){
  6. Runnable a=new A();
  7. Thread t=new Thread(a);
  8. t.start();
  9. }
  10. }

7、线程的终止

(1)当线程的run方法执行方法体中最后一条语句后,或者出现了在run方法中没有捕获的异常时,线程将终止,让出CPU使用权。

(2)调用interrupt()方法也可终止线程。

-----void interrupt()

(3)向一个线程发送一个中断请求,同时把这个线程的“interrupted”状态置为true。

(4)若该线程处于 blocked 状态 ,会抛出 InterruptedException。

8、测试线程是否被中断的方法

(1)Java提供了几个用于测试线程是否被中断的方法。

-static boolean interrupted()

(2)检测当前线程是否已被中断 ,并重置状态 “interrupted”值为false。

-boolean isInterrupted()

(3)检测当前线程是否已被中断 ,不改变状态 “interrupted”值 。

9、线程的状态:

(1)利用各线程的状态变换,可以控制各个线程轮流使用CPU,体现多线程的并行性特征。

(2)线程有如下7种状态:

➢ New (新建)

➢ Runnable (可运行)

➢ Running(运行)

➢ Blocked (被阻塞)

➢ Waiting (等待)

➢ Timed waiting (计时等待)

➢ Terminated (被终止)

10、新创建线程

new(新建)

-----线程对象刚刚创建,还没有启动,此时线程还处于不可运行状态。例如: Thread thread=new Thread(r);此时线程thread处于新建状态,有了相应的内存空间以及 其它资源。

11、可运行线程

- runnable(可运行状态)

➢ 此时线程已经启动,处于线程的run()方法之中。

➢ 此时的线程可能运行,也可能不运行,只要 CPU一空闲,马上就会运行。

➢ 调用线程的start()方法可使线程处于“可运行”状态。例如: thread.start();

12、被阻塞线程和等待线程

- blocked (被阻塞)

➢ 一个正在执行的线程因特殊原因,被暂停执行, 进入阻塞状态。

➢ 阻塞时线程不能进入队列排队,必须等到引起阻塞的原因消除,才可重新进入排队队列。

➢ 引起阻塞的原因很多,不同的原因要用不同的方法解除。

-sleep(),wait()是两个常用引起线程阻塞的方法。

13、线程阻塞的三种情况:

(1)等待阻塞 :通过调用线程的wait()方法,让线程等待某工作的完成。

(2)同步阻塞 :线程在获取synchronized同步锁失 败(因为锁被其它线程所占用),它会进入同步阻 塞状态。

(3)其他阻塞 :通过调用线程的sleep()或join() 或发出了I/O请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超 时、或者I/O处理完毕时,  线程重新转入就绪状态。

14、被终止的线程

(1)Terminated (被终止) 线程被终止的原因有二:

a.一是run()方法中最后一个语句执行完毕而自然死亡。

b.二是因为一个没有捕获的异常终止了run方法而意外死亡。

(2)   可以调用线程的stop 方 法 杀 死 一 个 线 程 (thread.stop();),但是,stop方法已过时, 不要在自己的代码中调用它。

15、其他判断和影响线程状态的方法:

(1)join():等待指定线程的终止。

(2)join(long millis):经过指定时间等待终止指定的线程。

(3)isAlive():测试当前线程是否在活动。

(4)yield():让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权。

16、多线程调度

(1)Java提供一个线程调度器来监控程序启动后进入可运行状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。

(2)处于可运行状态的线程首先进入就绪队列排队等候处理器资源,同一时刻在就绪队列中的线程可能有多个。Java的多线程系统会给每个线程自动分配一个线程的优先级。

17、Java 的线程调度采用优先级策略:

(1)优先级高的先执行,优先级低的后执行;

(2)多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级;

(3)任务紧急的线程,其优先级较高;

(4)同优先级的线程按“先进先出”的队列原则;

18、守护线程

(1)守护线程的惟一用途是为其他线程提供服务。例如计时线程。

(2)在一个线程启动之前,调用setDaemon方法可将线程转换为守护线程(daemon thread)。 例如: setDaemon(true);

19、Thread类有三个与线程优先级有关的静态量:

➢ MAX_PRIORITY:最大优先权,值为10;

➢ MIN_PRIORITY:最小优先权,值为1;

➢ NORM _PRIORITY:默认优先权,值为5。

第二部分:实验部分

实验十四  应用程序归档与线程初步

实验时间 2019-12-12

1、实验目的与要求

(1) 掌握Java应用程序的打包操作;

(2) 掌握线程概念;

(3) 掌握线程创建的两种技术。

2、实验内容和步骤

实验1: 导入第13章示例程序,测试程序并进行代码注释。

测试程序1

elipse IDE中调试运行教材585页程序13-1,结合程序运行结果理解程序;

l 将所生成的JAR文件移到另外一个不同的目录中,再运行该归档文件,以便确认程序是从JAR文件中,而不是从当前目录中读取的资源。

掌握创建JAR文件的方法;

程序代码如下:

  1. package resource;
  2.  
  3. import java.awt.*;
  4. import java.io.*;
  5. import java.net.*;
  6. import java.util.*;
  7. import javax.swing.*;
  8.  
  9. /**
  10. * @version 1.41 2015-06-12
  11. * @author Cay Horstmann
  12. */
  13. public class ResourceTest
  14. {
  15. public static void main(String[] args)
  16. {
  17. EventQueue.invokeLater(() -> {
  18. JFrame frame = new ResourceTestFrame();
  19. frame.setTitle("ResourceTest");
  20. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21. frame.setVisible(true);
  22. });
  23. }
  24. }
  25.  
  26. /**
  27. * A frame that loads image and text resources.
  28. */
  29. class ResourceTestFrame extends JFrame
  30. {
  31. /**
  32. *
  33. */
  34. private static final long serialVersionUID = 1L;
  35. private static final int DEFAULT_WIDTH = ;
  36. private static final int DEFAULT_HEIGHT = ;
  37.  
  38. public ResourceTestFrame()
  39. {
  40. setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  41. URL aboutURL = getClass().getResource("about.gif"); //在getclass方法的getResourse下查找about.gif文件
  42. System.out.println(aboutURL);
  43. Image img = new ImageIcon(aboutURL).getImage();//利用about.gif图像文件制作图标
  44. setIconImage(img);
  45.  
  46. JTextArea textArea = new JTextArea();//创建一个textArea对象
  47. InputStream stream = getClass().getResourceAsStream("about.txt");//读取about.txt文件
  48. try (Scanner in = new Scanner(stream, "UTF-8"))
  49. {
  50. while (in.hasNext())
  51. textArea.append(in.nextLine() + "\n");
  52. }
  53. add(textArea);
  54. }
  55. }

运行结果如下:

利用Eclipse方式导出jar文件的步骤:

选中ResourceTest---->右键,Export...---->Java---->JAR file---->next---->在JAR file的这一文本区内输入Resource.jar---->next---->next----> 选 择 Main class---->Finish.

导出的文件如下:

双击Resourse.jar之后就出现以下页面:

测试程序2:

l 在elipse IDE中调试运行ThreadTest,结合程序运行结果理解程序;

l 掌握线程概念;

l 掌握用Thread的扩展类实现线程的方法;

利用Runnable接口改造程序,掌握用Runnable接口创建线程的方法。

ThreadTest.java代码如下:

  1. class Lefthand extends Thread {
  2. public void run()
  3. {
  4. for(int i=0;i<=5;i++)
  5. { System.out.println("You are Students!");
  6. try{ sleep(500); } //用了sleep()方法,休眠500毫秒
  7. catch(InterruptedException e)
  8. { System.out.println("Lefthand error.");}
  9. }
  10. }
  11. }
  12. class Righthand extends Thread {
  13. public void run() //重写run方法
  14. {
  15. for(int i=0;i<=5;i++)
  16. { System.out.println("I am a Teacher!");
  17. try{ sleep(300); } //用了sleep()方法,休眠300毫秒
  18. catch(InterruptedException e)
  19. { System.out.println("Righthand error.");}
  20. }
  21. }
  22. }
  23. public class ThreadTest
  24. {
  25. static Lefthand left;
  26. static Righthand right;
  27. public static void main(String[] args)
  28. { left=new Lefthand();
  29. right=new Righthand();
  30. left.start();
  31. right.start();
  32. }
  33. }

运行结果如下图所示:

Runnable接口改造的程序如下:

  1. class Lefthand implements Runnable{ //用Runnable()接口实现线程
  2. public void run()
  3. {
  4.  
  5. for(int i=;i<=;i++)
  6. { System.out.println("You are Students!");
  7. try{ Thread.sleep(); } //调用了Thread类的start方法
  8. catch(InterruptedException e)
  9. { System.out.println("Lefthand error.");}
  10. }
  11. }
  12. }
  13. class Righthand implements Runnable {
  14. public void run()
  15. {
  16.  
  17. for(int i=;i<=;i++)
  18. { System.out.println("I am a Teacher!");
  19. try{ Thread.sleep(); }
  20. catch(InterruptedException e)
  21. { System.out.println("Righthand error.");}
  22. }
  23. }
  24. }
  25. public class Thread1
  26. {
  27. static Lefthand left;
  28. static Righthand right;
  29. public static void main(String[] args)
  30. { //创建Runnable类型的对象,以此类对象为参数建立Thread类的对象
  31. Runnable lefthand = new Lefthand();
  32. Thread left=new Thread(lefthand);
  33. left.start(); //调用left这个对象变量的start方法
  34. Runnable righthand = new Righthand();
  35. Thread right=new Thread(righthand);
  36. right.start();
  37. }
  38. }

运行结果如下:

测试程序3:

l 在Elipse环境下调试教材625页程序14-1、14-2 、14-3,结合程序运行结果理解程序;

l 在Elipse环境下调试教材631页程序14-4,结合程序运行结果理解程序;

l 对比两个程序,理解线程的概念和用途;

l 掌握线程创建的两种技术。

Bounce.java代码如下:

  1. package bounce;
  2.  
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import javax.swing.*;
  6.  
  7. /**
  8. * 显示一个动态弹跳球。
  9. * @version 1.34 2015-06-21
  10. * @author Cay Horstmann
  11. */
  12. public class Bounce
  13. {
  14. public static void main(String[] args)
  15. {
  16. EventQueue.invokeLater(() -> {
  17. JFrame frame = new BounceFrame();
  18. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  19. frame.setVisible(true);
  20. });
  21. }
  22. }
  23.  
  24. /**
  25. * 带有球组件和按钮的框架。
  26. */
  27. class BounceFrame extends JFrame
  28. {
  29. private BallComponent comp;
  30. public static final int STEPS = ;
  31. public static final int DELAY = ;
  32.  
  33. /**
  34. * 使用组件构造框架,以显示弹跳球和开始和关闭按钮
  35. */
  36. public BounceFrame()
  37. {
  38. setTitle("Bounce");
  39. comp = new BallComponent(); //创建一个新的BallComponent类赋给comp
  40. add(comp, BorderLayout.CENTER);
  41. JPanel buttonPanel = new JPanel();
  42. addButton(buttonPanel, "Start", event -> addBall());
  43. addButton(buttonPanel, "Close", event -> System.exit());
  44. add(buttonPanel, BorderLayout.SOUTH);
  45. pack();
  46. }
  47.  
  48. /**
  49. * 将按钮添加到容器中。
  50. * @param c容器
  51. * @param 按钮标题
  52. * @param 侦听器按钮的操作侦听器
  53. */
  54. public void addButton(Container c, String title, ActionListener listener)
  55. {
  56. JButton button = new JButton(title);
  57. c.add(button);
  58. button.addActionListener(listener);
  59. }
  60.  
  61. /**
  62. * 向面板中添加一个弹跳球,使其弹跳1000次。
  63. */
  64. public void addBall()
  65. {
  66. try
  67. {
  68. Ball ball = new Ball();
  69. comp.add(ball);
  70.  
  71. for (int i = ; i <= STEPS; i++)
  72. {
  73. ball.move(comp.getBounds()); //调用ball这对象变量来移动球
  74. comp.paint(comp.getGraphics()); //调用comp的paint方法来绘画
  75. Thread.sleep(DELAY); //调用Thread类的sleep方法
  76. }
  77. }
  78. catch (InterruptedException e)
  79. {
  80. }
  81. }
  82. }

BallComponent.java代码如下:

  1. package bounce;
  2.  
  3. import java.awt.*;
  4. import java.util.*;
  5. import javax.swing.*;
  6.  
  7. /**
  8. * 画球的部件。
  9. * @version 1.34 2012-01-26
  10. * @author Cay Horstmann
  11. */
  12. public class BallComponent extends JPanel
  13. {
  14. private static final int DEFAULT_WIDTH = ;
  15. private static final int DEFAULT_HEIGHT = ;
  16.  
  17. private java.util.List<Ball> balls = new ArrayList<>();
  18.  
  19. /**
  20. * 向组件添加一个球。
  21. * 要添加的球
  22. */
  23. public void add(Ball b)
  24. {
  25. balls.add(b);
  26. }
  27.  
  28. public void paintComponent(Graphics g)
  29. {
  30. super.paintComponent(g); // 擦除背景
  31. Graphics2D g2 = (Graphics2D) g;
  32. for (Ball b : balls) //foreach循环
  33. {
  34. g2.fill(b.getShape()); //通过对象变量b的getShape方法来传参给fill
  35. }
  36. }
  37.  
  38. public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } //通过返回一个新建Dimension类来获取组件的大小
  39. }

Ball.java代码如下:

  1. package bounce;
  2.  
  3. import java.awt.geom.*;
  4.  
  5. /**
  6. * 从长方形边缘上移动和弹跳的球
  7. * @version 1.33 2007-05-17
  8. * @author Cay Horstmann
  9. */
  10. public class Ball
  11. {
  12. private static final int XSIZE = ;
  13. private static final int YSIZE = ;
  14. private double x = ;
  15. private double y = ;
  16. private double dx = ;
  17. private double dy = ;
  18.  
  19. /**
  20. * 将球移动到下一个位置,如果球碰到其中一条边,则反向移动
  21. */
  22. public void move(Rectangle2D bounds)
  23. {
  24. x += dx;
  25. y += dy;
  26. if (x < bounds.getMinX()) //通过bounds来获得宽度的最小值
  27. {
  28. x = bounds.getMinX();
  29. dx = -dx;
  30. }
  31. if (x + XSIZE >= bounds.getMaxX()) //通过bounds来获得宽度的最大值
  32. {
  33. x = bounds.getMaxX() - XSIZE;
  34. dx = -dx;
  35. }
  36. if (y < bounds.getMinY()) //通过bounds来获得高度的最小值
  37. {
  38. y = bounds.getMinY();
  39. dy = -dy;
  40. }
  41. if (y + YSIZE >= bounds.getMaxY()) //通过bounds来获得高度的最大值
  42. {
  43. y = bounds.getMaxY() - YSIZE;
  44. dy = -dy;
  45. }
  46. }
  47.  
  48. /**
  49. * 获取球在当前位置的形状。
  50. */
  51. public Ellipse2D getShape()
  52. {
  53. return new Ellipse2D.Double(x, y, XSIZE, YSIZE); //用Ellipse2D类绘制圆作为返回值
  54. }
  55. }

运行结果如下:

该程序的close键不可用,点击没反应

后将Bounce.java通过线程来修改,其程序为BounceThread.java来修改后,close可使用了

BounceThread.java代码如下:

  1. package bounceThread;
  2.  
  3. import java.awt.*;
  4. import java.awt.event.*;
  5.  
  6. import javax.swing.*;
  7.  
  8. /**
  9. * 显示动画弹跳球。
  10. * @version 1.34 2015-06-21
  11. * @author Cay Horstmann
  12. */
  13. public class BounceThread
  14. {
  15. public static void main(String[] args)
  16. {
  17. EventQueue.invokeLater(() -> {
  18. JFrame frame = new BounceFrame(); //创建一个新框架
  19. frame.setTitle("BounceThread");
  20. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21. frame.setVisible(true);
  22. });
  23. }
  24. }
  25.  
  26. /**
  27. *带有面板和按钮的框架。
  28. */
  29. class BounceFrame extends JFrame
  30. {
  31. private BallComponent comp;
  32. public static final int STEPS = ;
  33. public static final int DELAY = ;
  34.  
  35. /**
  36. * 用显示弹跳球和的组件构造框架启动和关闭按钮
  37. */
  38. public BounceFrame()
  39. {
  40. comp = new BallComponent();
  41. add(comp, BorderLayout.CENTER); //将comp添加到边框布局的中间
  42. JPanel buttonPanel = new JPanel();
  43. addButton(buttonPanel, "Start", event -> addBall());
  44. addButton(buttonPanel, "Close", event -> System.exit());
  45. add(buttonPanel, BorderLayout.SOUTH);
  46. pack();
  47. }
  48.  
  49. /**
  50. * 将按钮添加到容器中。
  51. * @param c容器
  52. * @param 按钮标题
  53. * @param 侦听器按钮的操作侦听器
  54. */
  55. public void addButton(Container c, String title, ActionListener listener)
  56. {
  57. JButton button = new JButton(title);
  58. c.add(button);
  59. button.addActionListener(listener);
  60. }
  61.  
  62. /**
  63. *在画布上添加一个弹跳球,并启动一根线使其弹跳
  64. */
  65. public void addBall()
  66. {
  67. Ball ball = new Ball();
  68. comp.add(ball); //向comp中添加球
  69. Runnable r = () -> { //Runnable是函数式接口,用lambda表达式
  70. try
  71. {
  72. for (int i = ; i <= STEPS; i++)
  73. {
  74. ball.move(comp.getBounds()); //将comp的getBounds方法作为参数来传递ball的move方法
  75. comp.repaint(); //通过对象来调用repaint方法,repaint方法是在另外一个绘制线程里进行的
  76. Thread.sleep(DELAY); //通过Thread线程来调用sleep方法
  77. }
  78. }
  79. catch (InterruptedException e)
  80. {
  81. }
  82. };
  83. Thread t = new Thread(r); //创建一新的线程
  84. t.start(); //调用start方法来启动线程
  85. }
  86. }

运行结果如下:

按了close按钮后就关闭程序了,该程序与前一个程序的不同是:这个体现了线程的并发性,其点一次Start就出现一个球,而前一个程序不管你点多少次start,都有等到第一个工作完之后才可运行,所以该程序很好的体现了线程的特点。

实验总结:

在本次实验中进行第一个实验时,刚刚开始不知道怎么将jar文件导出来,后通过网上查询知道了如何去导出来,在该实验中也了解到了有关线程的概念和用途,学会了线程的创建方法,理解了线程优先级属性及调度方法,同时通过测试程序三能够很好的认识到了线程的特点。

201871010123-吴丽丽 《面向对象程序设计(Java)》第十六周学习总结的更多相关文章

  1. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  2. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  3. 201771010134杨其菊《面向对象程序设计java》第八周学习总结

    第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...

  4. 201771010134杨其菊《面向对象程序设计java》第七周学习总结

    第七周学习总结 第一部分:理论知识 1.继承是面向对象程序设计(Object Oriented Programming-OOP)中软件重用的关键技术.继承机制使用已经定义的类作为基础建立新的类定义,新 ...

  5. 201771010128 王玉兰《面象对象程序设计 (Java) 》第六周学习总结

    ---恢复内容开始--- 第一部分:基础知识总结: 1.继承 A:用已有类来构建新类的一种机制,当定义了一个新类继承一个类时,这个新类就继承了这个类的方法和域以适应新的情况: B:特点:具有层次结构. ...

  6. 201871010126 王亚涛《面向对象程序设计 JAVA》 第十三周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  7. 马凯军201771010116《面向对象程序设计Java》第八周学习总结

    一,理论知识学习部分 6.1.1 接口概念 两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构:二,一个类所具有的方法的特征集合,是一种逻辑上的抽象.前者叫做“Java接口”,后 ...

  8. 周强201771010141《面向对象程序设计Java》第八周学习总结

    一.理论知识学习部分 Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个接口. 接口体中包含常量定义和方法定义,接口中只进行方法的声明,不提供方法的实现. 类似建立类的继承关系 ...

  9. 201777010217-金云馨《面向对象程序设计Java》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  10. 201871010126 王亚涛 《面向对象程序设计 (Java)》第十七周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/12 ...

随机推荐

  1. springboot(二):bootstrap和application有什么区别?

    “SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个服务之间提供 ...

  2. Choose the WinForms UI Type 选择 WinForms UI 类型

    In this lesson, you will learn how to change the UI Type of the WinForms application. By default, th ...

  3. echarts 部分美化配置项使用记录

    一.图表背景色配置项,如背景颜色渐变 https://www.echartsjs.com/zh/option.html#backgroundColor 二.图表中图形的颜色,如柱状图行采用渐变颜色显示 ...

  4. 2019QM大作业2-weyl半金属Landau Level

    目录 说明 for cnblog QM大作业2--weyl半金属的Landau Level \(\boldsymbol{Abstract}\) 说明 Landau Level 自旋与pauli mat ...

  5. C语言入门-枚举

    常量符号化 用符号而不是具体的数字来表示程序中的数字 一. 枚举 用枚举而不是定义独立的const int变量 枚举是一种用户定义的数据类型,它用关键字enum如以下语句来声明 enum 枚举类型名字 ...

  6. Java_foreach不能remove

    foreach 阿里巴巴java开发手册 [强制]不要在foreach循环里进行元素的remove/add操作.remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁 ...

  7. [洛谷P1279][题解]字串距离

    题目戳我 很明显的这题是一道dp,主要讲一下几个细节 1.初始化 我们需要初始化边界情况也就是一个字符串为空的情况 #----------# #----------# A:aaaaaa A:□□□□□ ...

  8. RTP Payload Format for H264 Video

    基础传输结构 rtp中对于h264数据的存储分为两层,分别是 VCL: video coding layer 视频编码层 这是h264中block, macro block 以及 slice级别的定义 ...

  9. 构造函数new运算符进行了哪些操作

    new 运算符 1,实例化一个对象 2,将构造函数prototype对象赋值给对象__proto__属性 3,将对象作为函数this传进去,函数有return 并且是对象的话,就直接返回return的 ...

  10. 剑指Offer-37.二叉树的深度(C++/Java)

    题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 分析: 递归求解左右子树的最大值即可,每遍历到一个结点,深度加1,最后 ...