Java高级语法

91 阅读13分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

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…

     因为程序发生了异常,无法继续进行下去,所以我们可以使用trycatch这种方式来对异常进行处理。
语法:
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   王五