Java基础
回顾:
- 抽象类
- 半成品,没有完成的类,不能进行创建实例
- 抽象方法的作用:
- 作为通用方法在父类中定义
- 要求子类必须实现
- final
- 常量,不可变,创建以后不可以进行改变他的值,就是一个最重的数值
- 方法,不能重写
- 类,不能继承
- static
- 静态属于类,而不属于实例
- 使用场景:
- 共享的数据
- 工具方法
Math.sqrt()
Integer.parseInt()
String.valueOf()
-
- 静态初始化块
class A {
static {
类加载时,只执行一次
}
}
- 访问控制符
- public, protected, [default], private
- 尽量使用小范围, 便于维护修改
- 接口
- 作用: 结构设计工具,用来解耦合,隔离实现
- 极端的抽象类
- 接口中只能定义:
- 公开的常量
- 公开的抽象方法
- 公开的内部类内部接口
- interface 代替 class
- implements 代替 extends
- 类可以实现多个接口
- 接口之间继承
interface A extends X,Y,Z {
}
FileInputStream FileOutputStream
//进行添加了读写的buff的操作,提高了读写的效率
ObjectInputStream ObjectOutputStream
序列化:把对象的信息按制固定的格式转成相应的信息
方法:ObjectOutputStream writeObject(Object object),将对象转成一串字节值,发送
和OOS要有一个相接的流进行发送,
ObjectInputStream readObject(Object object), 将序列化数据,重新恢复对象
package day1401_序列化;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Test1 {
public static void main(String[] args) throws Exception {
/*
* 将学生的实例序列化保存到f2
*
* f2文件上面进行插入一个文件的输出流 Fos和文件流进行相接
* 在插入一个序列化的输出流(oos)
*
* OOS------FOS------f2
*
*/
Student student = new Student(9527,"唐伯虎","男",26);
//首先先创建文件的字节的输出流,将字节输出流插入到文件上面
FileOutputStream fos=
new FileOutputStream("F:\\f2");
//将程序的序列流与文件的字节的输出流进行连接,这样才能把序列化的对象放在文件f2中
ObjectOutputStream out =
new ObjectOutputStream(fos); //括号里面的就是要连接的流
//将学生的实例进行序列化输出
out.writeObject(student);
//这里关闭的是ObjectOutputStream out创建的流
out.close();
}
}
反序列化:
将序列化的对象进行输出
package day1401_序列化;
//这是将序列化的对象返回出来
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Test2 {
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("f:\\f2");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Object readObject = objectInputStream.readObject();
//进行对象的强转
Student student=(Student) readObject;
System.out.println(student);
}
}
序列化的版本id
控制旧版本的数据,不能恢复成新版本的类型
如果不定义,编译器会根据类的定义的信息,计算产生一个版本的id,版本的定义是固定的,除了修饰符号,其他的是固定的
字符的编码:
ASC-II
0-127 包含英文的字符,标点,和控制指令的字符
iso-8859-1
0-255 扩展了ASC-II,到255,包含西欧字符
cjk
编码:中日韩
GBK 国标码
iso-8859-1 扩展成为双字节编码,中文用双字节表示
Unicode:统一码 万国码
常用的字符表,双字节,生僻字符表,三字节或以上
UTF-8
Unicode 传输的格式,英文单字节,某些符号三字节,中文的符号三字节,特殊的符号四字节
java的char类型,采用Unicode
把字符进行输出保存,都要转化成为其他的编码进行输出
InputStreamReader和OutputStreamWriter
编码的转化流
OutputStreamWriter
把Java的Unicode编码char字符,转成其他的编码输出
InputStreamReader
读取其他的编码表,转化为Unicode
package day1403_编码转换流;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Test {
public static void main(String[] args) throws Exception {
function("abc","GBK","f:\\abc\\f3");
function("abc","UTF-8","f:\\abc\\f4");
}
/*
* 字符编码:encoding
* 字符集:charset
*/
private static void function(String s, String chaeset, String path) throws Exception {
/*
* 先创建文件流插在文件的path上面
* 在创建编码转换流插在文件流上
* OSW-----FOS----path
*/
FileOutputStream out = new FileOutputStream(path);
//后面添加的是编码的参数
OutputStreamWriter output= new OutputStreamWriter(out,chaeset);
//这一步就是实现编码转换之后编码的形式
output.write(s);
output.close();
}
}
利用不同的编码表进行打印所有的编码汉字
package day1403_编码转换流;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Test2 {
public static void main(String[] args) throws Exception {
/*
* Unicode 编码表,中文的编码的范围
* \u4e00-\u9fa5
*/
function("GBK","f:\\abc\\f5");
function("UTF-8","f:\\abc\\f6");
}
public static void function(String charset, String path) throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream(path);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,charset);
for(char i='\u4e00';i<'\u9fa5';i++) {
int count=0;
outputStreamWriter.write(i);
count++;
if (count==30) {
outputStreamWriter.write('\n');
System.out.println();
count=0;
}
}
outputStreamWriter.close();
}
}
线程
进程:在操作系统中,并行执行的任务
线程:进程内部进行操作的任务
创建线程:两种方法
继承Thread
定义Thread的子类,重写run()方法,线程启动后,执行run()方法中的代码
package day1404_线程;
public class Test1{
public static void main(String[] args) {
//进行创建T1的对象,利用start方法运行
T1 t1 = new T1();
T1 t2 = new T1();
//线程启动后会进行自动的打印
t1.start();
t2.start();
System.out.println("main");
}
static class T1 extends Thread{
//重写run方法
public void run() {
String name = getName();
for (int i = 1; i < 3; i++) {
System.out.println(name+"-"+i);
}
}
}
}
实现Runnable
定义Runnable接口的子类
实现run()方法
创建Thread实例,把Runnable对象交给线程
线程启动后,执行Runnable对象的Run()方法
package day1404_线程;
public class Test2 {
public static void main(String[] args) {
//创建代码,将代码的实例交给线程进行运行
R1 r1 = new R1();
//将实例以参数的形式交给线程
Thread t1=new Thread(r1);
Thread t2=new Thread(r1);
//线程启动后,自动的执行r1.run()
t1.start();
t2.start();
}
static class R1 implements Runnable{
//封装代码的执行
public void run() {
//获取正在执行当前代码的线程(当前线程),得到现成的实例
Thread currentThread = Thread.currentThread();
//获取线程名称
String name=currentThread.getName();
for (int i = 0; i < 1000; i++) {
System.out.println(name+"-"+i);
}
}
}
}
新生,消亡,是"非活动的"状态
其他,活动的状态(alive)
方法:
Thread.currentThread()
获取正在执行代码的现成的实例,
静态的方法thread().sleep(毫秒值时长)
getName(),setName()
start()
interrupt()
打断一个线程的暂停的状态,被打断的线程,会出现interruptExpection
setDaemon(true)
后台的线程,守护线程
虚拟机会等待所有的前台的 线程结束后,自动的退出,不会等待后台线程的结束
join()
当前的线程结束,等待被调用的线程结束后,再继续执行
练习三:sleep()
进行一秒一秒的打印时间
package day1404_线程;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test3 {
public static void main(String[] args) {
//刚开始进行创建进程的时候是不执行代码的
Thread thread=new Thread() {
//括号里面是匿名内部类,继承父类Thread
//进行重写run方法
public void run() {
while (true) {
Date date = new Date();
//格式化工具
SimpleDateFormat simpleDateFormat=
new SimpleDateFormat("HH:mm:ss");
String format = simpleDateFormat.format(date);
System.out.println(format);
//在此处暂停1秒
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println("没有错误");
}
}
}
};
thread.start();
}
}
interrupt方法将沉睡的程序捅醒
new Thread() {
public void run() {
//把t线程同醒,打断t线程的暂停的状态
System.out.println("按回车健捅醒t线程");
new Scanner(System.in).nextLine();
thread.interrupt();
}
}.start();
}