前言:这些笔记只对笔者查缺补漏过程的知识进行记录,不对书上知识进行总结,仅仅供笔者学习、复习使用。
第一章 JAVA入门
基础操作:
编译为字节码:javac -encoding utf-8 main.java ——>得到编码兼容中文的main.class
运行:java main (不能带文件后缀、不能用xxx/xxx/main)
反编译:javap main (相关操作帮助javap -help)
知识点:
- 一个源文件最多有一个public类,如果有,则源文件名与public类同名
- 一个源文件无public类则源文件与任意文件同名即可
- 主类:public static voidc main(String args[]) 所在的类即为主类
小结:Java通过将源代码code.java文件编译为字节码文件code.class,然后通过jre在不同操作系统上得以运行,做到一次代码书写,任意系统运行。
第二章 基础数据类型
基础操作:
数据输入:
Scanner reader = new Scanner (System.in);
int a = reader.next();
...
格式化输出:
与c语言同义的%d,%c,%f,%s以及占位md%(占m位),m.nf(共m位,保留n位小数)等等
知识点:
类型 | 所占字节 Byte |
int | 4 |
byte | 1 |
short | 2 |
long | 8 |
char | 2 |
float | 4 |
double | 8 |
- 12.4默认为double类型,需要显式指定float 12.4F/f 或(float)12.4
第三章 运算符、表达式和语句
知识点:
- instanceof 运算符可以返回一个布尔值,计算左面的对象是否是右面的类或子类对象
- 对byte进行数字运算过程中byte会被转为int,得到int结果,需要将结果转换为byte再赋值
第四章 类与对象
知识点:
- 当调用方法对对象A内的某个对象成员变量B赋值时,赋予的是该传入对象C的引用,而不是拷贝对象,所以在赋值后调用A内方法对B进行改变时,C也随之改变。
- 可变参数:在方法形参声明public void f(int a,double ... b);表示有一个int参数,未知个数个double参数,取值采用b[0],b[1]...,通过.b.length()获取参数个数。
- 关联关系:A类内的成员变量有类B,则A关联于B类。
- 依赖关系:A类中方法形参列表或返回值内有含B类,则A类依赖于B类。
- public于protect区别:protect修饰的方法和变量只能被同一包内的其他类对象访问。
- 不被public、protect、private修饰的成为友好对象,访问权限与protect一致,但友好变量/方法无法被继承,在java中protect被继承后仍然是protect属性。
- 在JDK10之后,增加自动变量类型 var,但需要在声明时就进行实例化(var a = 1)。
class A{
int n;
}
class B extend A{
int n;
public ... say(){
...printf(n);
}
}
... main(){
A a = new B();
a.n = 10; // 此时是给A的n变量赋值
....printf(a.n); //输出 10
a.asy(); // 输出0
}
jar文件
- 生成jar需要:
所有的xxx.class文件
清单文件xxx.mf
- 清单文件xxx.mf内容
Mainfest-Version: 1.0
Class: 完整包名.类名
Created-By: 14
//注意所有冒号后需要有一个空格分隔开
- 使用以下指令生成jar文件
jar cfm xxx.jar xxx.mf 所有的class文件的相对路径
- 使用jar文件:
在代码中加入:
improt 包名.类名
- 编译.java时使用以下指令编译:
javac -cp .;xxx.jar 需要编译的java文件
如果jar文件不在同一文件夹则必须使用jar文件的绝对路径。
- 编译后运行使用:
java -cp xxx.jar;包名.主类
第五章 子类与继承
知识点:
- UML图
class People{
int age;
void haha(){
}
}
class Student extends People{
int grade;
void backHome(){}
}
对应的UML图
- 拓展:
类依赖在第六章有样例图,此处不再重复。
- 对于继承protect类的子类D的访问权限:访问D本身的的只需要跟D在同一包内,访问继承的则需要与需要访问的方法或变量的祖先类在同一包内。
- 上转型对象:即使用父类引用指向子类对象,调用子类函数实现多态(跟c++虚函数差不多)。
- 抽象类,接口,普通类关系图:
- 子类继承的方法只能操作继承的方法和变量(重写后可以操作自己的和继承的)
- 类关联和类依赖:关联是拥有,依赖是使用(如形参表中有相关变量)。
第六章 接口与实现
知识点:
- 接口类中允许有常量和抽象方法。在JAVA8后允许给抽象方法定义默认函数体,需要在函数返回值声明前加上关键词default,同时也允许有static方法;JAVA9后允许有private方法用于给default方法调用。 默认接口所有方法为public权限。
- 实现接口时:抽象类可以实现任意多个,而非抽象类要求全部实现。实现时需要显式定义为public权限,否则相当于从public->友好,属于权限降级,不被允许。
- 接口UML图:
- 接口回调:类似于父类变量指向子类对象调用子类函数,只不过这里的父类变量是接口变量并且只能调用被实现的抽象方法。
- 单接口(函数接口):只有一个抽象方法的接口类
- 函数接口可以使用Lambda表达式快速继承实现:
public interface Math{
public abstract int add(int a,int b);
}
//对于 Math类,可以直接这样创建一个对象
Math cacul = (a,b)->{
return a+b;
};
int result = cacul.add(1,2); //result = 3
- 接口多态:利用接口回调这个特性把不同子类对象赋值给接口变量实现调用不同子类实现的方法。
- 接口参数:当一个函数的形参表里有接口时,可以传一个 实现了此接口的类 的对象 过去,如果这个接口是函数接口,可以只传一个Lambda函数过去。
//预设有一个接口
interface Hello{
void say(int a);
}
//预设一个函数
void sayWhat(Hello hello){
hello.say(123);
}
//主函数中调用sayWhat()可以直接传Lambda函数
public ... main(){
sayWhat((int n){System.out.println("say:"+n)}) //执行结果:say:123
}
- 判断是使用接口还是抽象类:只需要继承方法则使用接口,需要继承变量属性则抽象类(接口也可以有常量,但无法继承)。
第七章 内部类与异常类
知识点:
- 可以使用private、protect修饰内部类,但内部类只供它的外嵌类使用,所以意义不大。
- 内部类可以是static类型,static内部类无法操作外嵌类的实例成员变量。
- 匿名类体中不能声明static成员和方法,也不能是抽象类,但可以是finally类。
- 匿名类:可以通过如下方法继承一个类,并重写、创建、继承父类函数等等。也可以直接实现一个接口,得到这个匿名类的对象。
public class A{
A(100){};
public void say (){
//aaaCode;
};
public void rap (){
//rapCode;
};
}
-------------------------------------------------------
... main(){
A a = new A(100){
public void say(){
//bbbCode;
}
}
a.rap(); //执行rapCode
a.say(); //执行bbbCode
}
- 当一个参数是接口函数时,可以用Lambda函数替代匿名对象
interface F{
public void say();
}
class A{
void aSay(F f){
f.say();
}
}
------------------------------------------------------
... main(){
A a = new A(){
()->{
Sys...printf("hello");
}
}
a.say(); //hello
A aa = new A(){
()->{
Sys...printf("aahello");
}
}
aa.say(); //aahello
}
- 断言关键字 assert 可以在执行时遇到错误立即停止,而非抛出异常。
assert True; //程序继续执行
int a = 1;
assert (a == 1); //程序继续执行
assert False; //程序停止执行
//如果使用下面这条断言,那么停止后还会抛出MyException异常
assert False:MyExeption
- 在try-catch-finally中,执行return后finally仍然会执行。在执行System.exit(0)后finally不执行。
- 使用throw抛出异常,使用throws在函数声明处声明可能产生的异常。
第八章 常用实用类
知识点:
正则表达式:
符号 | 意义 |
. | 任意一个字符 |
\. | 一个'.'字符 |
\\D | 任意非数字 |
\\d | 任意数字 |
\\s | 任意非空格 |
\\S | 任意空格 |
\\w | 任意可标识符字符 |
\\W | 任意不可作标识符字符 |
\\p{Lower} | 小写字母a-z |
\\p{Upper} | 大写字母A-Z |
\\p{ASCII} | ASCII码字符 |
... | ... |