韩顺平java基础——坦克大战(含有线程、I\O流的讲解)
写在最前边:
研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。
韩顺平老师课程地址:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0
阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。
============================= ❀ 坦 克 大 战 ❀ =============================
============================== ❀ 1.0 版 本 ❀ ==============================
用到泛型及其之前的知识
一、Java绘图坐标体系
1、像素——密度单位(
与厘米这种长度单位完全不是一回事
)与分辨率有关:分辨率越高像素越大,密度越高,展示的东西越丰富。
像素 = 分辨率的长× 宽
2、坐标介绍
坐标 原点 位于左上角
坐标单位是 像素
(x , y)
二、Java绘图入门
1、步骤
定义一个类MyPanel extends JPanel,作为画板;
MyPanel 类中重写paint方法,使用Graphics类 作为画笔。进行一系列方法绘图;
定义一个类 DrawCircle extends JFrame ,作为活动窗口展示画板内容
DrawCircle 类中 声明一个画板类 MyPanel
在DrawCircle 类的构造器或者其他方法中创建MyPanel 对象并加入当前DrawCircle 类对象中
设置窗口大小以及是否显示
代码实例
import javax.swing.*; import java.awt.*; public class MyPanel extends JPanel{@Overridepublic void paint(Graphics g) {super.paint(g);g.drawOval(0,0,50,50);} } public class DrawCircle extends JFrame {private MyPanel mp = null;public static void main(String[] args) {new DrawCircle();}public DrawCircle(){mp = new MyPanel();this.add(mp);this.setSize(200,200);this.setVisible(true);} }
2、重要类的方法
3、paint方法何时被调用
4、Graphics类(画笔)的绘图方法
https://www.bilibili.com/video/BV1fh411y7R8/?p=572&spm_id_from=pageDriver&vd_source=863cd5165874b9e91cbd88db7b5eaa82
5、Java事件处理机制——以键盘控制小球移动为例
实现键盘监听接口 KeyListener 即可监听键盘事件KeyEvent
事件源:可以产生一个事件的对象,如按钮、窗口等
事件:承载 事件源 状态改变时的信息 的事件类的对象,比如按下的按钮值之类的。事件类
事件监听者:是一个 ==实现了某些 事件监听器接口 ==的
类
,对监听到的时间进行业务 处理
此时,通过之前知识的运用,我们可以画出很多坦克,并且控制自己坦克的移动。还需要在2.0版本实现敌人坦克的自动移动呀↓
============================== ❀ 2.0 版 本 ❀ ==============================
加入多线程基础知识
补充:
IDEA中的 jconsole可视化线程工具
1、一些概念
程序:一段代码,静态的
····· 例如:迅雷应用代码
进程:程序运行一次,动态的(具有产存在、消亡的过程)
·······例如:迅雷应用
线程:进程创建的一个实体,一个进程可以有多个线程。线程就是小任务,一个应用程序可以有很多小任务。
······例如:迅雷应用中的下载任务
并发与并行:
······都是执行多任务的前提:
······单核CPU 是并发——通过交替执行使得用户认为在同时执行
······多核CPU 是并发——真正的同时执行
······当电脑执行任务个数超过CPU个数,则并发和并行在电脑中都存在
······Java查看电脑CPU的个数
2、线程分类
单线程:同一时刻,只能执行一个线程。
多线程:同一时刻,可以执行多个线程。如qq可以同时打开多个聊天窗口
3、Java创建线程的方法本质都是使用Start0()
方法一:继承Thread,重写run()方法为自己的业务逻辑,然后该类就可以看为一个线程
class Cat extends Thread{run(){....} } public class Thread01{//main方法就是 主线程 public static void main(String[] args) throw InterruptedException{//Cat对象就是一个线程Cat cat = new Cat();cat.start(); //主线程不会被阻塞for(int i = 0 ; i < 10 ;i++){...}}
记住1:进程结束的标志 不是主线程main结束,要看所有线程是否结束。
记住2:线程 也可以开辟 另一个线程
为什么在main使用start()方法启动线程而不是run()呢?
run()是一个普通方法,没有启动线程,并且会阻塞程序直到run执行完毕程序再继续执行 。
start()源码:
方法二:实现Runnable接口,重写run()方法为自己的业务逻辑,然后该类就可以看为一个线程(
底层使用了代理模式)
韩老师讲解视频地址对单继承机制的补充,使得某类继承了其他类的情况还可以使用多线程。同时适用于多个线程共享一个资源的情况。
线程类中的声明同上。但是创建线程不能直接使用start类,而是封装到Thread中才可以使用start()。
>public class Thread02{//main方法就是 主线程 public static void main(String[] args) throw InterruptedException{//Cat对象就是一个线程Cat cat = new Cat();//cat.start(); 不能使用了Thread thread = new Thread(cat);thread .start();//主线程不会被阻塞for(int i = 0 ; i < 10 ;i++){...}}
4、线程终止
线程任务完成后,自动退出;
使用变量,在run()方法中控制线程退出,使得其他线程可以控制线程的终止。通知方式
5、线程常用方法1
优先级:
interrupt()方法,一般用于中断(唤醒)正在休眠的线程。会抛给正在休眠的线程一个异常,那么在catch中我们就可以写上自己的 中断休眠后的业务逻辑代码。这也是为什么sleep()方法必须用try-catch的原因
6、线程常用方法2
7、线程常用方法3
用户线程:又叫工作线程
守护线程:服务工作线程(常见的是垃圾回收机制)
二者关系:所有用户线程结束,守护线程自动结束
应用场景:
有一个线程是死循环,那么当所有其他线程都结束了,他还不结束岂不是程序永远不结束了?因为我们要把他设置为守护线程,以便他可以结束。
设置方法——使用类.setDaemon(true)即可
8、线程7大状态
``java中的 Thread.State枚举了六种状态,但是RUNNABLE状态还可以细分为两个内核状态。
- #####NEW
RUNNABLE
- Ready 就绪态
- Running 执行态
BLOCKED
WAITING
TIME_WAITING
TERMINATED
9、线程同步机制 Synchronized
``首先注意,锁的对象应该是同一个呀。如果我们new 了好几个那么底层就不是一个对象了,线程之间也没有争抢了。
使用Synchronized的2种方法
同步 代码块推荐使用,范围精准
同步 方法
注意:run()方法不要写成Synchronized的呀
10、互斥锁
锁实际是在对象/.class上,而不是代码块上
synchronized (this)是非公平锁
细节5
细节6
11、死锁
12、释放锁
释放锁的4种时机
不会 释放锁的2种情况
============================== ❀ 3.0 版 本 ❀ ==============================
加入I/O流知识
1、一些概念
文件:保存数据的地方(文档、音频、视频…)
文件流: 文件在程序中是以流的形式来操作的
文件 VS 流:
流不生产数据,只是文件数据的搬运工
2、常用文件操作 File类的使用
(1)使用 File类 创建文件的三种方法
1.File可以创建目录(文件夹)或者文件(如.txt) , 因为在java中目录也被当做是文件
2.new File(...) 只是创建了一个file对象,只有使用createNewFile()方法的时候才会真正创建文件夹/文件
(2)File类的获取文件信息的方法
可以通过类图查看
(3)File类的目录操作
mkdir 创建
一级
目录mkdirs 创建
多级
目录delete 删除空目录或文件
3、IO流原理
每创建一个IO流类的对象,其实就是分配了一个外卖小哥来送货(文件数据),至于到底一个文件中的数据怎么全部运输完(输入内存/输出到外部),根据每个外卖小哥自己的方法来决定,并且外卖小哥运输完成这一单后,应该被释放,以便可以继续接活
4、IO流分类
按操作数据的单位长度划分:
1)字节流(8bit)
好处:效率较低,适用于二进制文件,保证对二进制文件(如音频、视频、doc、pdf)的无损操作
2)字符流(=多少字节?根据
文件编码
来看)好处:效率较高,适用于文本文件
按数据流的流向划分:
1)输入流
2)输出流
以上四种可以两两组合成为四种 【抽象类】成为IO流中其他类的抽象基类,也就是说其他IO流类都是这四种抽象类的子类:
![]()
细节:字符流FileWriter进行写操作时,必须 close或者flush一下(刷新一下,否则还没有写入指定文件)
5、节点流和处理流
1)节点流 :
初级的外卖员,只能配送一种货物
从特定的数据源读写数据 。如FileReader 、 FileWriter、FileInputStream、FileOutputStream等
缺点:直接对数据源进行操作,不够灵活
2)处理流(包装流):
高级的外卖员,能配送多种货物
连接在 已存在的
节点流或处理流
上,提供更强大的读写功能。如:BufferedReader、BufferedWriter优点1:处理流内部封装一个Reader/Writer/InputStream/OutputStream属性,即封装了一个节点流。那么使用的可以是任何的四大抽象基类的子类:
优点2:进行功能扩展
优点3、4
处理流的设计模式——修饰器模式:
节点流、处理流的区别和联系
2.1)对象流 属于处理流:
以上过程即 序列化和反序列化操作:
如何进行序列化和反序列化?
序列化后的文件类型是.dat
细节:
2.2)标准输入输出流 属于处理流:
键盘输出、显示器输出
2.3)转换流 属于处理流:
由IO流默认使用UTF-8格式读取文件,所以有时会遇到文件乱码,所以需要字节流 —> 字符流
使用InputStreamReader、OutputStreamReader类完成转换工作
代码例子展示:
2.4)打印流 属于输出处理流,没有输入流哦:
使用PrintStream、PrintWriter类完成转换工作
默认打印到显示器,都可以使用SetOut()方法修改打印路径:
6、配置文件的读写操作
配置文件不用IO流读写,而是使用专门的类Properties类:
Properties类介绍
Properties的方法介绍
代码展示
韩顺平java基础——坦克大战(含有线程、I\O流的讲解)相关推荐
- Java基础 - 坦克大战(第四章,线程基础)
文章目录 线程终止 基本说明 案例 线程常用方法1 细节 线程常用方法2 礼让(yield) 插队(join) 案例 线程常用方法3 用户线程和守护线程 用户线程 守护线程 常见的守护线程(垃圾回收机 ...
- Java基础 - 坦克大战(第五章,坦克移动、与被击中效果功能)
文章目录 坦克大战0.3 新建Shot类 坦克大战0.4版 1.让敌人坦克发射子弹(多颗子弹) 思路 2.当我方坦克击中敌人坦克时,敌人的坦克就消失 3.实现敌人坦克爆炸后消失 注意图片位置 4.实现 ...
- b站韩顺平老师的坦克大战
一.主要的几个类 Mypanel WwyTankGame01 AnemyTank //写代码时候把单词拼错了哈哈不好意思 Bomb Recorder Node Shot Tank Hero 二.功能实 ...
- Java笔记(韩顺平Java基础12-14章)
Java学习笔记(第12章 P444-P459)(第13章P460-P498)(第14章P499-P553) 第12章 异常-Exception 异常介绍 编译异常 异常处理 try-catch异常处 ...
- JAVA——Java后端技术体系韩顺平框架图_韩顺平Java基础学习路线图
第一阶段:Java基础 变量.控制结构.OOP(封装,继承,多态).数组.Java API.异常和处理.集合.泛型.IO.反射.网络通信 第二阶段:Java高级 Java多线程/高并发 1.1 并发基 ...
- Java基础 坦克大战01绘制坦克
java绘图坐标体系 坐标体系-像素 1.绘图还必须搞清一个非常重要的概念-像素 一个像素等于多少厘米? 2.计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的.例如,计算机显示器的分辨率是800 ...
- Java基础 - 坦克大战(第三章,线程基础与线程使用)
文章目录 本章内容 - 多线程处理 绘制敌方坦克 线程基础 线程相关概念 程序(program) 进程 什么是线程 其他相关概念 单线程 多线程 并发 并行 获取当前电脑处理器(cpu)个数 Java ...
- Java笔记(韩顺平Java基础7-8章)
Java学习笔记(第7章 P191-P263)(第8章 P264-P360) 第7章 面向对象编程(基础部分) 类与对象 成员方法 成员方法传参机制(!!!) 方法递归调用(!!!) 方法重载(Ove ...
- 韩顺平java基础学习笔记一
目录 面向对象编程(基础部分) 7.1类和对象 7.2 成员方法 7.3 成员方法传参机制(非常非常重要) 7.4 方法递归调用(非常非常重要,比较难) 7.5 方法重载(OverLoad) 7.6 ...
最新文章
- 在命令行导出MySQL数据到Excel
- 90 亿美元的“Java 第一版权案”终落幕:谷歌胜,甲骨文败!
- BZOJ3998 TJOI2015弦论(后缀数组+二分答案)
- CSS 布局经典问题初步整理
- 普通软件项目开发过程规范(五)—— 总结
- 【LeetCode】217. Contains Duplicate (2 solutions)
- Mine Number(搜索,暴力) ACM省赛第三届 G
- 【线性代数及其应用】02 -矩阵代数
- 如何判断自己的手机是山寨机?如何判断山寨机的芯片型号和平台?
- C编程实例-“约瑟夫问题” 解法
- 手把手教你如何用VBA统计问卷调查表
- 五人合伙最佳股份分配_五个人合伙,股份如何划分才合理?
- 基于java springboot的图书管理系统设计和实现
- 减法公式运算法则_六年级数学各种运算法则与学习方法
- Linux用户与内核空间交互—procfs
- VC6 VS2010 环境变量
- python数据爬取并可视化代码,python爬取摩拜单车API数据并做可视化分析(源码)...
- 设计模式之简单化_Mediator中介者模式_只有一个仲裁者
- C语言答案解析,C语言题库带详细讲解答案解析.doc
- python 时间表_python获取起止日期段中的时间列表
热门文章
- 计算机化系统验证的生命周期是几年,采用GMAP5方法的计算机化系统验证的生命周期文件及活动(课件).pdf...
- h5封装table表格 vue
- InVEST模型 | HAbitat quality模块计算生境质量
- Neo4j安装与配置
- R语言igraph包的使用
- 电子产品21个权威认证
- matlab时域微分,实验一 MATLAB用于时域分析.doc
- iOS单元测试之接口测试
- Android 深入探讨sigleTask和singletop的区别
- 【实验五 一维数组】7-2 sdut-C语言实验-整数位