JavaSE易错概念总结

tech2022-08-17  127

float比double范围大,精度差一倍

byte a=9+1; √ byte b=a+1; ×

计算机二进制存储的是补码

+=不改变变量类型

for可无循环体,while不可

成员变量:有默认值(char:’\u0000’,boolean:false,引用类型:null)

二维数组必须定义外层:int[][] arr = new int[外层][内层];

String传值仍然是地址值 String的不可变性是因为底层数组被final修饰

Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据,所以比较地址值会相等

int i = 0; i = i++; System.out.println(i); // 0

i++不是原子性 分3步,放到cpu、+1、取回,两个i++各循环100编,可能结果:2-200

boolean类型get方法是isXxx

Object类equals是==

类的初始化: main方法所在类先初始化;子类初始化前先要初始化父类;静态代码块/静态变量按顺序执行且只执行一次 顺序: 父类静态代码块/静态变量->子类静态代码块/静态变量->父类非静态代码块/非静态变量->父类构造器->子类非静态代码块/非静态变量->子类构造器

静态代码块,在类加载时可以执行,但不一定会执行 举例:如果调用类的静态成员变量是final则不运行静态代码块,但没有final默认会调用静态代码块,如果没有静态代码块则会自动生成(参考scala静态代码块反编译解析)

public class StaticTest { public static void main(String[] args) { System.out.println(“a=” + MyClass.a); System.out.println(“b=” + new MyClass().b); } } class MyClass { static { a = 10; // a在=左,可以不用MyClass.a // a = a + 1; // a在=右不用MyClass.a会报错; System.out.println(“a=” + MyClass.a); } { b = 12; // b在=左,可以不用this.b System.out.println(“b=” + this.b); } static int a = 1; int b = 2; }

final: 修饰:类、方法、成员变量、【形参】 特点:1.类不能被继承 2.方法不能被重写 3.变量是一个常量 4.修饰形参,方法内不能对形参赋新值,否则报错

abstract: 修饰:类和方法 特点:1.不能实例化 2.子类必须重写所有抽象方法才能实例化,否则仍为抽象类 3.修饰方法,没有方法体,只能存在抽象类中

异常捕获的catch中,如果return的变量是基本类型,不受finally中变量修改的影响

throw手动抛异常后面的语句不执行

创建Lock实现对象ReentrantLock,保证多线程使用同一Lock对象->调用lock()->unlock()释放(必须释放否则造成锁死 写在finally中)

String连接操作判断地址是否相同:有变量(final除外)就在堆中重新开辟空间

List构造器显式赋值给的是容量,但只有add等操作时才会改变size大小, Collections.copy(dest, list)操作时dest长度不能小于list长度,所以需要先撑开目标List大小: List dest = Arrays.asList(new Object[list.size()]);

Collections.copy(dest, list)是浅拷贝

泛型方法可以是静态的,但静态方法中不能使用类的泛型(没造对象前不能确定类的泛型的类型) 不能直接new E[],而应该是:E[] e = (E[])new Object[capacity];

数组通过Arrays工具类转成集合后,因为其本质还是数组,所以只能修改不能增删:List list = Arrays.asList(“hello”, “world”, “java”);

重写和重载题: 重写: public static void main(String[] args) { byte b = 10; test(b); // 优先匹配相同类型,没有则自动精度提升 // byte不能转char // byte = 10 => 0000 1010 // short = 10 => 0000 0000 0000 1010 // int = 10 => 0000 0000 0000 0000 0000 0000 0000 1010 } public static void test( byte b ) { System.out.println(“b”); } public static void test( int i ) { System.out.println(“i”); } public static void test( short s ) { System.out.println(“s”); } public static void test( char c ) { System.out.println(“c”); }

重载: public class TestOverride { public static void main(String[] args) { User user = new User(); System.out.println(user.sum()); // User没有sum()所以调用父类中sum() // getI()子类中有,所以动态绑定调用子类中的 // i作为属性不存在重写,所以i相当于this.i // 综上,20+10=30 } } class Person { public int i = 10; public int sum() { return getI() + 10; } public int getI() { return i; } } class User extends Person { public int i = 20; public int getI() { return i; } } 动态绑定机制:程序执行过程,如果调用了对象的【成员方法】时,会将方法和对象的实际内存进行绑定,然后调用。

最新回复(0)