java笔记

运算符优先级

1

( )

从左到右

2

! + - ++ --

从右到左(单目的+ -)

3

* / %

从左到右

4

+ -

从左到右

5

< <= > >=

从左到右

6

== !=

从左到右

7

&&

从左到右

8

||

从左到右

9

= += -= *= /= %=

从右到左


逃逸字符

\b

回退一格

"

双引号

\t

到下一个表格位

'

单引号

\n

换行

\\

反斜杠本身

\r

回车


Math类

abs 算绝对值
pow 算幂次 Math.pow(2, 3) 2的三次方 浮点型
random 随机数 Math.random()*100 0-100
round 四舍五入 Math.round(10.345) -->10
ceil 向上取整 Math.ceil(double a) 返回一个大于或等于传入参数的最小整数
floor 向下取整 同理


包裹类型

boolean

Boolean

用法:获取该类型最大最小值

char

Character

Integer.MIN_VALUE

int

Integer

Integer.MAX_VALUE

byte

Byte

long

Long

short

Short

float

Float

double

Double


Character

static boolean ...

后接

作用

isDigit(char ch)

判断这个字符是否数字

isLetter

是否字母

isLetterOrDigit

是否字母或数字

isLowerCase

是否小写字母

isUpperCase

是否大写字母

isWhitespace

是否一种空格

toLowerCase

把这个字符转换成大写

toUpperCase

转换成小写


容器类

ArrayList<String> a = new ArrayList<String>;
   有两个类型:容器的类型;元素的


子类父类关系

父类成员访问属性

在父类中的含义

在子类中的含义

public

对所有人开放

对所有人开放

protected

只有包内其它类、自己和子类可以访问

只有包内其它类、自己和子类可以访问

缺省

只有包内其它类可以访问

如果子类与父类在同一个包内:只有包内其它类可以访问 否则:相当于private,不能访问

private

只有自己可以访问

不能访问

  1. 子类的变量不能接收父类的对象

  2. 子类的对象可以赋给父类的变量

函数调用的绑定 当通过对象变量调用函数的时候,调用哪个函数这件事情叫做绑定

  1. 静态绑定:根据变量的声明类型来决定

  2. 动态绑定:根据变量的动态类型来决定
    在成员函数中调用其他成员函数也是通过this这个对象变量来调用的

覆盖override

  • 子类和父类中存在名称参数完全相同的函数,这一对函数构成覆盖关系

  • 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的类的函数

Object类

抽象类

抽象函数: 表达概念而无法实现具体代码的函数 抽象类: 表达概念而无法构造出实体的类

  • 带有abstract修饰符的函数

  • 有抽象函数的类一定是抽象类

  • 抽象类不能制造对象

  • 但是可以定义变量

实现抽象函数

  • 继承自抽象类的子类必须覆盖父类中的抽象函数

  • 否则自己成为抽象类

两种抽象

  1. 与具体相对:表示一种概念而非实体

  2. 与细节相对:表示一定程度上忽略细节而着眼大局


数据与表现分离

  • 程序的业务逻辑与表现无关

    • 表现可以是图形的也可以是文本

    • 表现可以是当地的也可以是远程

责任驱动的设计
将程序要实现的功能分配到合适的类/对象中去是程序设计中非常重要的一环


接口

  • 接口是纯抽象类

    • 所有成员函数都是抽象函数

    • 所有成员变量都是public static final

  • 接口规定了长什么样,但是不管里面有什么

实现接口

  • 类用extends,接口用implements

  • 类可以实现很多接口

  • 接口可以继承接口,但不能继承类

  • 接口不能实现接口

面向接口的编成方式

  • 设计程序时先定义接口,再实现类

  • 任何需要在函数间传入传出的一定是接口而不是具体的类

  • 是java成功的关键之一,因为极适合多人同时写一个程序

  • 也是被批点之一,因为代码量膨胀起来很快

内部类

  • 定义在别的类的内部、函数内部的类

  • 内部类能直接访问外部的全部资源

    • 包括任何私有成员

    • 外部是函数时,只能访问那个函数里final的变量

匿名类

  • 在new对象的时候给出的类的定义形成了匿名类

  • 匿名类可以继承某类,也可以实现某接口

  • Swing的消息机制广泛使用匿名类

捕捉异常

try {
  // 可能产生异常的代码
} catch (Type1 id1) {
  // 处理Type1异常的代码
} catch (Type2 id2) {
  // 处理Type2异常的代码
} catch (Type3 id3) {
  // 处理Type3异常的代码
}

拿到异常后:

  • String getMessage();

  • String toString();

  • void printStackTrace();

但是你肯定回不去了,具体的处理逻辑则取决于业务逻辑需要

捕捉任何异常

catch(Exception e) {
    System.err.println("Caught an exception");
}

抛出异常

catch(Exception e) {
    System.err.println("An exception was thrown");
    throw e;
}

如果在这个层面需要处理,但是不能做最终的决定

异常声明

  • 如果你的函数可能抛出异常,就必须在函数头部加以声明

  • void f() throws TooBig, TooSmall, DivZero { //...

  • void f() { ...

  • 你可以声明并不会真的抛出的异常

  • 像ArrayIndexOutOfBoundsException这样的异常不需要声明

  • 但是如果没有适当的机制来捕捉,就会最终导致程序终止

  • 如果你调用一个声明会抛出异常的函数,必须:

    • 把函数的调用放在try块中,并设置catch来捕捉所有可能抛出的异常

    • (或)声明自己会抛出无法处理的异常

异常声明遇到继承关系

  • 当覆盖一个函数的时候,子类不能声明抛出比父类的版本更多的异常

  • 在子类的构造函数中,必须声明父类可能抛出的全部异常

用例 如果要读文件

  • 打开文件

  • 判断文件大小

  • 分配足够的内存空间

  • 把文件读入内存

  • 关闭文件

errorCodeType readFile {
    initialize errorCode = 0;
    open the file;
    if ( theFilesOpen ) {
    	determine its size;
    	if ( gotTheFileLength ) {
    		allocate that much memory;
    		if ( gotEnoughMemory ) {
				  read the file into memory;
				  if ( readFailed ) {
					  errorCode = -1;
				  }
			  }else {
				  errorCode = -2;
			  }
    	}else {
			  errorCode = -3;
		  }
    	close the file;
    	if ( theFILEDidntClose && errorCode == 0 ) {
    		errorCode = -4;
		  }else {
			  errorCode = errorCode and -4;
		  }    
    }else {
    	errorCode = -5;
    }
    return errorCode;
}

用上异常机制

try {
	open the file;
	determine its size; //
	allocate that much memory;
	read the file into memory;
	close the file;    //业务逻辑
} catch ( fileOpenFailed ) {    //
	doSomething;
} catch ( sizeDeterminationFailed ) {
	doSomething;
} catch ( memoryAllocationFailed ) {
	doSomething;
} catch ( readFailed ) {
	doSomething;
} catch ( fileCloseFailed ) {
	doSomething;
}                             //处理逻辑

InputStream输入流

  • read()

  • int read()

  • read(byte b[])

  • read(byte[], int off, int len)

  • int available()

  • mark()

  • reset()

  • close()

  • skip(long n)

  • boolean markSupported()

OutputStream输出流

  • write()

  • write(int b)

  • write(byte b[])

  • write(byte b[], int off, int len)

  • flush()

  • close()

文件流

  • FileInputStream

  • FileOutputStream

  • 对文件作读写操作

  • 实际工程中已经较少使用

    • 更常用的是以在内存数据或通信数据上建立的流,如数据库的二进制数据读写或网络端口通信

    • 具体的文件读写往往有更专业的类,比如配置文件和日志文件

过滤器流 以一个介质流对象为基础层层构建过滤器流,最终形成的流对象能在数据的输入输出过程中,逐层使用过滤器流的方法来读写数据 Data

  • DataInputStream

  • DataOutputStream

用以读写二进制方式表达的基本数据类型的数据

在流上建立文本处理

PrintWriter pw = new PrintWriter(
    new BufferedWriter( new OutputStreamWriter( 
        new FileOutputStream("abc.txt"))));

读文本文件

  • Reader

  • 常用的是BufferedReader

    • readLine()

  • LineNumberReader

  • 可以得到行号

    • getLineNumber()

  • FileReader

  • InputStreamReader类的子类,所有方法都从父类继承而来

    • FileReader(File file) 在给定从中读取数据的File的情况下创建一个新的FileReader

    • FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新的FileReader

    • FileReader不能指定编码转换方式

汉字编码

  • InputStreamReader(InputStream in)

    • 创建一个使用默认字符集的InputStreamReader

  • InputStreamReader(InputStream in, Charset cs)

    • 创建使用给定字符集的InputStreamReader

  • InputStreamReader(InputStream in, CharsetDecoder dec)

    • 创建使用给定字符集解码器的InputStreamReader

  • InputStreamReader(InputStream in, String charsetName)

    • 创建使用指定字符集的InputStreamReader

PrintWriter输出

  • format("格式", ...)

  • printf("格式", ...)

  • print(各种基本类型);

  • println(各种基本类型);

Scanner输入

  • 在InputStream或Reader上建立一个Scanner对象可以从流中的文本中解析出文本表达的各种基本类型

  • next...()

流的应用 打开服务器连接端口

try {
	Socket socket = new Socket(InetAddress.getByName("localhost"), 12345); //本地,端口
	PrintWriter out = new PrintWriter( 
			new BufferedReader(
					new OutputStreamWriter(
							socket.getOutputStream())));
	out.println("Hello");
	BufferedReader in = new BufferedReader(
			new InputStreamReader(
					socket.getInputStream()));
	String line;
	line = in.readLine();
	System.out.println(line);
	out.close();
	socket.close();
} catch (IOException e) {
	// TODO: handle exception
	e.printStackTrace();
}

阻塞/非阻塞

  • read()函数时阻塞的,在读到所需内容之前会停下来等

    • 使用read()的更“高级”的函数,如nextInt()、readLine()都是这样的

    • 所以常用单独的线程来做socket读的等待,或使用nio的channel选择机制

  • 对于socket,可以设置SO时间

    • setSoTimeout(int timeOut)

对象串行化

  • ObjectInputStream类

    • readObject()

  • ObjectOutputStream类

    • writeObject()

  • Serializable接口


本文章使用limfx的vscode插件快速发布