JAVA 笔记
JAVA
简介
JAVA三大类:
- JAVASE
JAVAME- JAVAEE
主要特性:
- 安全性
- 面向对象
- 跨平台
- 原理:内部存在一个虚拟机
- 通过javac将 .java文件编译成.class文件
- java工具运行
- jdb调试工具
- JDK
- 开源
- 多线程
- 简单易用
- 有许多的库、核心类库
基础知识
注释:
- 单行注释:
//注释信息
- 多行注释:
/*注释信息*/
- 文档注释:
/**注释信息**/
关键字:
class:类 …
数据类型
字面量:
整数类型、小数类型、字符类型、字符串类型、布尔类型、空类型(null),常量也是有变量名的,只是值不会发生改变
- 特殊的字面量
\t
:制表符,打印时将前面的字符串长度补齐到8或是8的整数倍。最少1个,最多8个
常量
使用final
关键字修饰常量
整数类型{byte(8位)、shot(16位)、int(32位)、long(64位)}、小数类型{float(32位)、double(64位)}、字符类型{char(16位)}、字符串类型(是通过String类进行表示的)、布尔类型{boolean(只有true和false,默认值是false)}
引用类型
相当于C的指针(储存地址),用于访问类 、数组、接口、集合、枚举这五类数据
变量
- 局部变量:在方法、函数、块(使用{}括起来的部分,比如方法也属于块)中声明的变量
- 实例变量:在类中声明的变量,属于类的实例
- 静态变量(类变量):使用关键字
static
声明的变量,属于类 - 参数变量:用于构造函数或方法时接收传递的值
1 | class MyClass { |
变量命名规则
驼峰命名法:除第一个单词外,后面的单词都要首字母大写
修饰符
default
:接口中定义一个方法的默认实现public
:对所有类可见,即在其他类中可以直接访问private
:只在同一类中可见protected
:可以被同一包中的其他类访问,允许子类访问父类的某些成员,但又不希望这些成员对所有外部类可见。包通过使用
package
关键字在Java文件的顶部定义
运算符
主要列举不太熟悉的
位运算符
^
:如果对应位相同则为0,否则为1>>>
:按位右移补零操作,移动得到的空位以0补充赋值运算符
(%)=
:取模(取余数)和赋值操作符,A%=B等价于A=A%B(注意A与B的运算顺序),其他的<<=
、|=
等不一一列举了。条件运算符
(?:)
:第一个位置的条件是否满足,满足的话赋值第二个位置的值,不满足赋值第三个instanceof
:用于操作对象实例,检查该对象是否是一个特定的类型(类类型或接口类型)
循环结构
while
do...while
for(初始化;布尔表达式;更新){}
条件语句
与C语言相同
1 | if(布尔表达式 1){ |
switch语句
与C语言相同
1 | switch(expression){ |
如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出
一些核心类库
Number类和Math类
Character类
string类
StringBuffer类
数组
数组的初始化或定义:
静态初始化
1
int[] arr = {1, 2, 3, 4, 5};
动态初始化
1
int[][] arr = new int[5][4]; // 创建一个大小为5*4的数组
注意[]位置在dataType后面
For-Each循环在不使用下标的情况下遍历数组,demo:
1
2
3
4
5
6
7
8
9
10public class TestArray {
public static void main(String[] args) {
double[] myList = {1.9, 2.9, 3.4, 3.5};
// 打印所有数组元素
for (double element: myList) {
System.out.println(element);
}
}
}Arrays类
日期与时间
获取当前时间,可用于记录系统运行的状态、错误信息等
1
LocalDateTime now = LocalDateTime.now();
记录事件发生的时间
1
long timestamp = System.currentTimeMillis(); // 获取当前时间戳
计算某段代码的执行时间,以优化性能,识别瓶颈
1
2
3
4
5long startTime = System.currentTimeMillis();
// 执行一些操作
long endTime = System.currentTimeMillis();
System.out.println("执行时间: " + (endTime - startTime) + " 毫秒");定时任务,比如定期备份、数据清理等
1
2ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> System.out.println("任务执行时间: " + LocalDateTime.now()), 1, TimeUnit.MINUTES);日期和时间格式化;时间比较、处理时区等
正则表达式
定义字符串的模式,可以用于搜索、处理文本,在爬虫中有广泛的应用
Java 正则表达式 | 菜鸟教程 (runoob.com)
方法
1 | 修饰符 返回值类型 方法名(参数类型 参数名){ |
方法重载
使用同一个方法名,但是形参个数或者类型不一样,调用时,选择不同的参数类型即可调用不同的方法
命令行参数
当你需要在运行的时候使用某个变量时,在main()的括号里写入形参,运行时在后面加入变量值:
1
2
3
4
5
6
7public class CommandLine {
public static void main(String[] args){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}结果:
1
2
3
4
5
6
7
8
9$ javac CommandLine.java
$ java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100构造方法
构建一个方法初始化类的初始值,与类同名,且无论是否自己定义,类都有构造方法
1
2
3
4
5
6
7
8
9// 一个简单的构造函数
class MyClass {
int x;
// 以下是构造函数
MyClass() {
x = 10;
}
}可变参数
stream流的写入和输出
控制台的输入与输出
控制台可以理解为键盘,即java如何模拟键盘的输入输出
1
import java.io.*; //需要引用的包
使用
BufferedReader
实现控制台输入:1
2
3
4BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
int read( ) throws IOException //read()方法每次读取一个输入字符,比如键盘输入'q'
String readLine( ) throws IOException //读取字符串使用
System.out.write()
实现输出1
2System.out.write(b);
System.out.write('\n');读写文件
读:
FileInputStream
1
2
3InputStream f = new FileInputStream("C:/java/hello");
File f = new File("...");//...表示文件的路径
InputStream in = new FileInputStream(f);写:
FileOutputStream
1
2
3OutputStream f = new FileOutputStream("...");//需要写入文件的路径
File f = new File("...");
OutputStream fOut = new FileOutputStream(f);
异常处理
Java 异常处理 | 菜鸟教程 (runoob.com)
面向对象
继承
extends
可以用于声明一个类继承于另外一个类,子类拥有父类非private的属性和方法。
1 | class 父类 { |
java不支持多继承,即类C即继承于类A又继承于B。
implements
可以用于同时继承多个接口。
super
实现对父类成员的访问,用来引用当前的父类。
- java类的构造器在有参数时,需要调用super(参数的值)
- 在对父类的方法进行重写时,子类访问父类被重写的方法时需要使用super
this
指向自己的引用,引用当前对象。
final
修饰变量、方法和类。用于定义为最终类,不能继承,或被重写。
重写与重载
- 重写:子类重写父类的方法,在子类中定义与父类具有相同名称、参数列表、返回类型(也可以不同,但必须是父类返回值的派生类)的方法。在调用子类的方法时,执行的是子类的方法而不是父类的,访问权限不能比父类被重写方法的低。
final
和static
的方法不能被重写。当子类中调用父类的重写方法时,需要使用super
,一般在重写代码上方加入@overwrite
- 重载:在同一个类里,方法名相同,参数列表不同。比如,构造器的重载。
多态
包括对父类方法、接口的重写
抽象类
抽象类不能实例化对象,且必须被继承,才能被使用。
1 | public abstract class classname |
抽象方法
抽象方法只包含一个方法名,而没有方法体,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
封装
将抽象性函式接口的实现细节部分包装、隐藏起来的方法,步骤:
- 修改属性(一般限制为private)
- 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
接口
接口不能用于实例化对象
接口中所有的方法必须是抽象方法
接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public)
接口的核心功能是定义一种规范或协议,明确规定”某些东西必须具备哪些行为或功能”
枚举
使用关键词enum
,例如:
1 | enum Color |
所有的枚举值都是 public static final ,此外,枚举既可以包含具体方法,也可以包含抽象方法
包
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用,可以避免名字冲突
创建包
1
2
3
4
5
6
7/* 文件名: Animal.java */
package animals;
interface Animal {
public void eat();
public void travel();
}导入包
1
import package1[.package2…].(classname|*);
如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。通过加“.”可以引用包中的某个特定类。
反射
动态代理,避免直接修改代码。允许程序在运行时动态地获取有关类、接口、方法、构造函数、字段等的详细信息,并能够在运行时操纵这些元素。
java反射的核心类位于java.lang.reflect
包中,包括Class
、Method
、Filed
等类