本文已参与「新人创作礼」活动,一起开启掘金创作之路
1、图形界面编程—GUI编程—swing编程
1)GUI(Graphical User Interface)
图形用户界面 图形界面编程中使用的工具类大部分都是javax.swing包中
2)图形界面编程中的2个概念
(1)组件: 是图形用户界面的最小单位,里面不能在包含其他的内容,比如按钮、单选、多选、输入框等 (2)容器:可以将多个组件放在一起。比如窗体、面板等。
3)学习容器、组件
(1)容器
窗体JFrame -- 墙
面板JPanel -- 幕布小板子
(2)组件
按钮JButton
标签JLabel
①标签上显示文字
②标签上显示图片
先将图片放入图标上
t.jpgImageIcon
再将图标放入标签上
ImageIconJLabel
文本输入框JTextField
多行文本域/框JTextArea
密码输入框JPasswordField
4)布局管理器
(1)FlowLayout布局管理器
是一种最简单的布局管理器,也是面板JPanel的默认布局,是以流的方式,从左往右,从上往下的存放组件,默认居中对齐。
(2)BorderLayout布局管理器
采用东、西、南、北、中的布局方式
(3)GridLayout布局管理器
表格布局,指定几行几列
5)事件处理
三部分:事件源事件事件监听
事件源:比如按钮、输入框、单选、图片等,一般都是组件
事件:单击事件、双击事件等
事件监听:把事件绑定到组件上的一种行为称为事件监听ActionListener事件监听器
事件处理的实现形式:
(1)外部类实现形式
(2)内部类实现形式
(3)类本身的实现形式
(4)匿名内部类实现形式
6)抽象abstract类接口interface
普通类
publicclass A{
}
A a=newA(); ok
抽象类
public abstract class B{
}
B b=new B(); error
思考:
1、为什么把类定义为抽象
2、怎么使用抽象类
extends继承子父类继承关系
子类 C 父类B
public class C extends B{
}
B b=new B(); 错误
C c=new C(); 正确
接口:interface,是一种特殊的抽象类
抽象类中可以包含普通方法,可以包含抽象方法;
接口中只包含抽象方法。
总结:
1、类的分类:普通类抽象类接口
2、普通类只能包含普通方法
3、抽象类即可以包含普通方法,也可以包含抽象方法,abstract不能省略
4、接口只能包含抽象方法,abstract可以省略
5、类 extends 抽象类,一个类只能继承一个父类
6、类 implements 接口,一个类可以实现多个接口
7、抽象类和接口不能直接new创建
7)其它的事件监听器
MouseListener接口鼠标监听器
MouseAdapter抽象类鼠标适配器
ChangeListener接口改变监听器
KeyListener接口键盘监听器
KeyAdapter抽象类键盘适配器
WindowListener接口窗体的事件监听
WindowAdapter抽象类窗体监听适配器
ItemListener下拉列表框的事假监听
8)其它的组件
(1)对话框JDialog
模态对话框非模态对话框
setModal(true/false)
(2)菜单
菜单栏JMenuBar
菜单JMenu
菜单项JMenuItem
9)绘图机制
小案例--满天繁星的案例
2、IO流
InputOutput输入输出流
流的概念:使用输入或者输出的处理方式,对文件、
图片、音频或者视频等进行处理。
1)File类
是java提供的一个类,表示一个文件或者文件夹,可以使用该类对文件或者文件夹进行新建、删除、重命名等操作。但是File类不能读写文件里的内容。
2)File类的创建方式
方式1:File f=new File(“文件或者文件夹”);
方式2:File f=new File(File ff, “文件或文件夹”);
ff一定表示某个路径下的文件夹
方式2创建的f表示的是在ff这个文
件夹下的文件或者文件夹
3)File中常用的一些方法
exists()方法判断文件或者文件夹是否存在,该方法返回true或者false
mkdir()方法创建文件夹
getName() 获得文件夹名或文件名
getCanonicalPath()获得文件夹或文件的路径
renameTo(新名) 修改文件或者文件夹的名字
delete() 删除文件夹/文件
length() 求文件的长度/大小
isDirectory()是否是目录/文件夹 true/false
isFile()是否是文件 true/false
4)FileFilter文件过滤器
java.io包中的,接口
5)Java中的IO流
因为File类不能对文件进行读写操作,可以使用IO流对文件进行读写操作
(1)Java中IO流的分类
A 输入流:从文件中读数据
输出流:向文件中写数据
B 字节流:以字节为单位对文件进行读写操作
字符流:以字符为单位对文件进行读写操作
C 节点流:向IO设备(磁盘、网络)读写的流
包装流:有特定功能的流,在节点流基础上封装后使用的
(2)字节流
FileInputStream字节输入流读
①int i =read() 一次读1个字节,方法返回读到的字节,是int类型
②int i =read(byte[] b) 一次读b.length个数据,并将读取的数据存储到b数组中,方法的返回值是实际读取的字节个数
③int i=read(byte[] b, int off, int len)
FileOutputStream字节输出流写
①write(int b)方法:先将int类型转换为byte类型,以一个字节(8位)写入文件中。
write(3)
write(‘A’)’A’unicode编码值
->int
②write(byte[] b)写入一个字节数组
③write(byte[] b, int off, int len)
(3)字符流
InputStreamReader 字符输入流读
①int i=read() 一次读一个字符,返回的是字符对应的unicode编码
②int i =read(char[] cc)
③int i =read(char[] cc,int of, int len)
OutputStreamWriter 字符输出流写
①write(int i) 写入字符、整数
②write(String s) 写入字符串
③write(String s, int off, int len)
④write(char[] cc) 写入字符数组
⑤write(char[] cc, int off, int len)
(4)缓冲字符流
一次读写的内容增大了,减少了读写次数,提高了读写的效率。
BufferedReader字符缓冲输入流
BufferedWriter字符缓冲输出流
3、多线程
1)概念
程序:计算机支持的每一个任务都可以理解为
一个程序。QQ.exe
进程:运行中的程序叫做进程。一个程序安装完成后启动,会在内存中多出相对应的进程。
多线程:是一个进程中的更小单位,在一个进程的内部,把出现的并发执行的现象称之为多线程。
并发执行的理解:
并发执行并不是真正意义上的同时执行,同时执行只能在现实中做到,计算机只能做到并发执行。计算机会使用CPU分配时间片给不同的线程,得到时间片的线程会执行,其它线程等待。而且CPU分配时间片是不可控制。CPU分配时间片的速度非常快,所以
感觉不到线程在停止等待。
2)多线程的使用方式
(1)方式1:通过Thread类
a 定义一个类去继承Thread类
b 在该类中调出run方法,在run方法中实现多线程要做的事情
c 创建该类,然后调用start方法启动线程
(2)方式2:通过Runnable接口
a 定义一个类去实现Runnable接口
b 调出run方法
c 创建该类,借助于Thread类,调用start方法
3)Java程序的执行顺序
(1)顺序执行:从上往下,依次执行
(2)并发执行:各自执行,互不干扰
4)通过匿名内部类创建方式使用线程
5)线程的生命周期/生命状态
(1)创建状态
当new创建了一个线程实例,创建完成以后线程就处于创建状态了
FirstThread first=new FirstThread();
(2)就绪状态
当调用start方法之后,线程就处于就绪状态了
first.start();
就绪状态的线程时刻等待着CPU的调用
(3)运行状态
如果就绪状态的线程获得了CPU分配的时间片,就会调用run方法执行,此时线程处于一个运行状态
(4)阻塞状态
当一个线程运行后,不可能一直处于运行状态,线程在运行过程中可能会被中断,这种现象叫做阻塞状态
出现阻塞状态的情况:
1不到CPU时间片了
2线程调用了sleep()方法
3线程中调用了IO流的相关方法,被阻塞的线程会在合适的机会重新进入就绪状态,等待CPU的调用
(5)死亡状态
结束后的线程就处于死亡状态了
如果出现以下情况线程会自动进入死亡状态:
1 run()方法正常执行完了
2线程出现了异常或者错误
3直接调用stop方法结束线程
6)线程操作
(1)join操作
在一个程序中,分为主线程和子线程,一般main方法称为主线程,通过main方法的主线程可调用其它的子线程。
在默认情况下,在主线程调用子线程时,如果子线程需要大量的,耗时的运算,主线程往往会在子线程结束之前结束。
但是如果我们需要用到子线程的结果怎么办呢?使用join操作可以让主线程在子线程执行完在结束。
(2)后台线程
线程还可以分为前台线程和后台线程。
默认情况下创建的线程都是前台线程。
后台线程,也叫守护线程。后台线程会随着主线程的结束而结束,但是前台线程不会。
isDaemon()可以判断线程是前台还是后台线程,true是后台线程,false不是后台线程。
setDaemon(true)设置一个线程为后台线程,必须在start方法之前调用,否则会报错。
(3)线程睡眠
让当前正在执行的线程暂停一会,可以使用线程睡眠的方法,让线程进入阻塞状态。
1秒=1000毫秒
Thread.sleep(毫秒);
(4)线程让步
暂停当前正在执行的线程,把机会让给其它的线程来执行。
线程让步是为了让相同优先级的线程获得更多的执行机会,但是在实际中无法做到真正的让步,CPU不可控制。
Thread.yield();
(5)线程的优先级
线程是有优先级的,优先级的范围是1~10之间。CPU会基于优先级抢先调度机制。
setPriority(数字)方法可以设置线程的优先级,线程的优先级为5
通过Thread类可以调出来3个值:
Thread.MAX_PRIORITY 最高优先级10
Thread.MIN_PRIORITY 最低优先级1
Thread.NORM_PRIORITY默认优先级5
7)线程安全
(1)在计算机中可以运行各种各样的程序,每一个程序在运行的时候都可能包含多个独立运行的线程。当多个线程同时读写或者访问同一份共享资源的时候,可以会引发冲突。
这个时候需要引入线程同步机制,解决线程安全问题。
线程同步机制实际上是一个一个的对共享资源进行操作。
(2)线程安全的案例
去银行取钱,丈夫和妻子,2000块钱
丈夫–线程 -- 1500
夫妻–线程 -- 1500
(3)解决线程安全问题—线程同步机制
加锁
Java中提供了一个同步锁,使用synchronized给一段代码加同步锁
锁的种类:new的一个类
4、网络编程
基于TCP协议的网络编程
1)TCP协议
TCP协议是一种可靠的网络协议,通信两端的Socket让他们之间形成网络虚拟链路,两端的程序可以通过虚拟链路进行通信。
Java使用Socket对象代表两端的通信端口,通过Socket产生的IO流进行通信。
2)B/S架构和C/S架构
Browser浏览器/Server服务器架构
Client客户端/Server服务器架构
TCP协议客户端和服务器端
服务器端:ServerSocket
使用accept()方法用于监听来自于客户端的请求,如果接收到了客户端的请求,accept()方法会返回一个与客户端对应的Socket对象。如果没有接收到客户端的请求,accept()会一直等待。
客户端:Socket
主要用于设置连接的ip地址和端口号
5、异常
(1)什么是异常
生活中会遇到各种各样的状况,比如感冒发烧,电脑蓝屏等。
在程序开发中,也会发生非正常的情况,比如磁盘空间不足,图片不存在了等,针对这些情况,java语言中,引入了异常,以异常的形式对这些非正常的情况进行封装和处理。
(2)异常的分类
程序在执行时发生了一个异常,ArithmeticException,程序会结束,无法继续在向下执行了,就需要使用异常处理机制来处理这个异常。
ArithmeticException是java异常中的其中一种,异常的父父类Throwable父类Throwable
Error类 Exception类
ArithmeticException类
1)Error类
错误类,表示java运行时产生的系统内部错误,紧靠修改程序本身是不能恢复的。一般是运行java程序的java虚拟机出现了问题。
2)Exception类
异常类,该类下面有很多的子类。表示程序本身可
以处理的错误。
(3)异常的处理方式1:try…catch…
因为程序发生了异常,无法继续进行下去,所以我们可以使用try…catch这种方式来对异常进行处理。
语法:
try{
出现异常的代码
}catch(异常的种类,是Exception或者子类){
对异常的处理
}
(4)异常的处理方式2:throws抛出异常
public static int divide(int x,int y)throws Exception{
int result=x/y;
return result;
}
因为divide()方法是我们自己定义的,我们自己调用也很清楚y的值如果是0,会出现异常。
如果是别人调用divide方法,不清楚如果y的值是0就出现异常,针对这种情况,我们给divide方法抛出一个异常,谁调用该方法,必须强制来处理这个异常
(5)如何自定义异常
Java中定义了大量的异常类,但是这些异常类并不能表示程序开发中出现的所有问题。比如被除数不能是负数
①定义一个类去继承Exception
②使用throw抛出自定义的异常
6、集合 --- 容器
集合也是一个容器,在无法预知要保存的数据个数的时候,可以使用集合。
数组:int[] arr=new int[大小];
int[] arr1={值……};
集合的操作比数组简单、便捷。
增删改查
(1)ArrayList
(2)HashSet
(3)HashMap key,value
1 张三
2 李四
3 王五