20:魔法值
编程中 应该消除魔法值 【代码中出现的常量数据】
因为数据本身是不具有语义化的 所以为了提高代码的可读性 我们需要消除魔法值
有的时候魔法值多的时候 我们需要创建一个单独的类去维护这些常量
21:static关键字
修饰静态的 如果不添加则代表非静态的
字段和函数添加static关键字的时候 此时属于类级别,调用的时候使用类名进行调用
修饰字段:
非静态字段 每个对象特有
静态字段 属于类级别 所有当前类对象共有
static 修饰函数 为静态函数
所有的静态函数都可以写成非静态函数,非静态函数调用需要通过对象调用 有的时候使用对象调用浪费内存
22.数组
Java中也是有数组的,但是和js中不同
Java中的数组是定型和定容的
定型:只能存储一种数据类型
定容:容量是固定的
Java中创建数组的格式
数据类型【】名字 = new 数据类型[容量]
数据类型【】名字 = new 数据类型【】{初始值,初始值}
数据类型【】名字 = new {初始值,初始值}
Arrays:官方写好的数组工具类 Arrays
数组扩容:Java中数组是定容的,一旦超出容量就是会抛出异常:数组越界异常
23.封装:
封装 就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或者功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类 其中数据和函数 都是类的成员
ArrayToo1 工具类封装:里面写的是功能函数,需要使用的时候不需要再写代码只需调用函数
MyArray 面向对象封装:体现了面向对象思想
面向对象思想始于封装
24.异常
public static int getMax(int[] arr){
int max = arr[0]
for (int i = 1;i<arr.length;i++){
if (max <arr[i] ) max = arr[i];
}
return max;
}
在我们封装的功能函数 getMax获取最大值中,其实是有问题的: 我们首先获取了 数组中索引为0的数 据。然后再依次判断后面的数据是否比之前的大。但是 如果我们的数组没有数据 此时就没有最大值一说。 所以我们封装的函数 需要进行安全判断。
此时 返回 return -1 不行 因为有歧义 return null 不行 因为 数据类型不匹配
return missing return value 此时只有return 也不行
return 错 此时返回的是字段码 return 错
在我们封装的函数中 有可能出现 因为传入的参数有问题 导致整个函数无法正常执行的情况
所以Java 官方就提供了一套新的语法规则 专门解决函数中参数有问题导致无法正常返回的情况。
1.2,此时我们就是需要通过异常来解决问题
有返回值的函数 一定要有一个可以执行的 return 或者throw
正常返回数据 return
异常提示信息 throw
1.3 执行方,抛出异常
25. 执行方:抛出异常
在函数中 遇到参数或者其他问题导致程序无法执行的时候 我们需要在函数中 进行异常抛出 提示调用这 对数据进行检查
throw 异常对象
throw new RuntimeException (“对不起,请检查参数是否合法”)
RuntimeException 是异常中一个对象 称之为 运行时异常
26.调用方:处理异常A 异常转移
异常转移是默认的方式,它是将当前异常再次转移给当前的调用者,由当前调用者进行处理, 语法规则是 在函数的参数列表后面 添加一个 throws关键字,关键字后面跟上要转移 异常类型
例如:public static void main(String[] args) throws RuntimeException
此时当前函数的调用者需要对异常进行处理了 他依然可以选择 异常转移的方式,此时如果所有的调用者都选择转移的形式处理异常,就会最终转移到 JVM JVM负责处理当前异常,打印异常跟踪栈信息,并且退出
调用方:处理异常B 异常捕获
异常捕获需要借助 try{} catch(异常类型 名字){}
其中try{可能出现异常的代码}catch(异常类型 名字){出现异常之后的解决方案}
代码在执行的时候 是这样执行的 首先执行try中的代码 如果没有异常则拉倒 catch不会执行 如果其中一句代码有问题 此时就会停止执行try中后续代码的执行 并且catch中的内容
catch中如何处理异常、
public static void main(String[] args) {
try {
int[] arr = {};
int max = ArrayTool.getMax(arr);
System.out.println(max);
}catch (RuntimeException e){
// 1 记录日志 部署项目
// 2 打印异常跟踪栈信息
e.printStackTrace();
// 3 回滚数据 等等
}
System.out.println("你好世界"); }
分类捕获异常
catch可以写多个 此时出现异常之后 会一次检查是否当前catch的异常
如果是当前异常则进入catch代码块
此时我们就是可以通过这种手段 分类捕获异常
这个功能应用于不同的异常 实施不同处理方案的场景
如果所有的异常处理的方式都不一样 分类捕获异常的时候需要 父类异常放在后面
27.finally 代码块
try{
可能出现异常的代码
}catch(异常类型 名字)
处理异常的方案
}finally{
关闭资源等操作
}
finally代码块 无论是有没有异常的出现 都会去执行finally代码块中的代码
28.常用类 测试函数
我们之前写的代码 都是通过main运行 来测试功能是否实现,但是一个Java类只能有main 函数 我们当时否是写了删 删了写 这样不利于我们对代码进行保留 并且运行时长等内容都没有 我们开始使用测试函数
第一步创建一个测试类 (注意一定不能叫Test)
public class JavaTest {}
第二步 在测试类中 添加测试函数 (公共无参无返回值的函数)
public class JavaTest {
public void test01a(){
}}
第三步 在测试函数上面 添加一个@Test 注解
第四步 添加注解的引用
29.String 面试题
1.String 能否被继承? 问什么?
不能被继承 因为是被final 修饰的类不能被继承
2.String是否有length()函数?数组是否有length()函数?
String有length函数 但是 数组没有 数组有length属性
3.==和equals 的区别
==是判断的是引用的地址是否相同
equals是判断的内容是否相同
4.请问一下的代码创建了几个字符串对象
String s1 =‘’123“
String s2 =new String(“456”)
第一句代码创建了0个或者1个 当数据常量池中已经存在123的时候 此时就是创建了0个 如果没有就是创建一个
第二句带啊创建了1个或者2个,首先new String 是在堆区创建了一个对象然后再去常量池中是否存在,如果存在就是1个如果不存在 就是两个