主方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybYBQgLd-1638078560859)(C:\Users\精神小伙\AppData\Roaming\Typora\typora-user-images\image-20211109104744073.png)]
名字必须为main 方法为public static void , 方法必须接收一个字符串数组的参数 string[] args 和string args[]相同 是两种数组声明方式.
访问控制符
做题首先要专心,然后要滴眼药水.不要当瞎子
JVM优化
运行结果
class反编译结果
很简单,静态方法属于静态绑定,编译器根据引用类型所属的静态类型为它绑定其对应的方法。此语句会翻译成invokestatic,该指令的调用中不会涉及this,所以不会依赖对象! 还有引用类型=null,其实就是指该引用在堆中没有对应的对象,但是编译的时候还是能根据声明找到其所属的静态类型。
对象初始化
A为new操作符, 会调用构造函数
B为readObject方法,是从文件中反序列化还原对象
C为通过反射机制:
反射,如果你采用的是静态的newInstance()方法,其执行的构造器一定是无参的构造器,反射执行不了带参的构造器
D为clone,直接从相应对象内存中复制,不需要初始化
在初始化阶段《Java虚拟机规范》规定了有且只有六种情况必须立即对类进行初始化
- 遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类型没有进行过初始 化,则需要先触发其初始化阶段。能够生成这四条指令的典型Java代码场景有:
- 使用new关键字实例化对象的时候。
- 读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外) 的时候。
- 调用一个类型的静态方法的时候。
- 使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需 要先触发其初始化。
- 当初始化类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
- 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先 初始化这个主类。
- 当一个接口中定义了JDK 8新加入的默认方法(被default关键字修饰的接口方法)时,如果有 这个接口的实现类发生了初始化,那该接口要在其之前被初始化。
反射
反射还是得学
普通的java对象是通过new关键字把对应类的字节码文件加载到内存,然后创建该对象的。
反射是通过一个名为Class的特殊类,用Class.forName(“className”);得到类的字节码对象,然后用newInstance()方法在虚拟机内部构造这个对象(针对无参构造函数)。
也就是说反射机制让我们可以先拿到java类对应的字节码对象,然后动态的进行任何可能的操作,
包括在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时调用任意一个对象的方法这些都是反射的功能。
使用反射的主要作用是方便程序的扩展。
节点流/处理流
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
- 节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
- 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接
JAVA常用的节点流:
常用处理流(关闭处理流使用关闭里面的节点流)
-
缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
-
转换流:InputStreamReader OutputStreamReader 实现字节流和字符流之间的转换。
-
数据流 DataInputStream DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来.
流的关闭顺序
- 一般情况下是:先打开的后关闭,后打开的先关闭
- 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
- 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。
剑指 Offer 10- I. 斐波那契数列 - 力扣(LeetCode) (leetcode-cn.com)
import java.util.*;
class Solution {
public int fib(int n) {
Scanner in = new Scanner(System.in);
if(n==0){
return 0;
}
int a1 = 0,a2 = 1,a3 = 1;
for(int i=2;i<=n;i++){
a3 = (a2+a1)%(1000000007);/
a1 = a2;
a2 = a3;
}
return a3;
}
}
剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public int minArray(int[] numbers) {
int i = 0;
for(;i<numbers.length-1;i++){
if(numbers[i]>numbers[i+1]){
return numbers[i+1];
}
}
return numbers[0];
}
}
剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode) (leetcode-cn.com)
import java.util.*;
class Solution {
public static boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (dfs(board, words, i, j, 0)) {
return true;
}
}
}
return false;
}
public static boolean dfs(char[][] board, char[] words, int i, int j, int k) {
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length
|| board[i][j] != words[k]) {
return false;
}
if (k == words.length - 1) {
return true;
}
board[i][j] = '\0';
boolean ret = dfs(board, words, i - 1, j, k + 1) || dfs(board, words, i, j - 1, k + 1) || dfs(board, words, i + 1, j, k + 1)
|| dfs(board, words, i, j + 1, k + 1);
board[i][j] = words[k];
return ret;
}
}