之前虽然学完了,但是后来没有记录,从新开始记录。记笔记真的很重要,很重要,很重要。
JDK、JRE、JVM以及工具类
1、三者的区别
2、工具类
Javac | 将Java源文件编译成.class文件 |
---|---|
Java | 使用jvm将.class文件运行 |
jar | JAR(Java ARchive,Java 归档)是一种与平台无关的文件格式,可将多个文件合成一个文件。类似于zip文件 |
数制
八进制 0***;
十六进制0x***;
可以直接用Integer类中的方法
Integer中也有常量池-128到127,这些数字直接放在常量池中只会创建一个
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 == i2);
//结果是true
//数字改为130结果为false
变量相加以及强制类型转换
变量相加类型自动提升
byte b1 = 3, b2 = 4, b;
b = b1 + b2; //编译报错
b = 3 + 4;
String s = "hello";
System.out.println(s+b1+b2);
System.out.println(b1+b2+s);
System.out.println(b1+b2+s+b1+b2);
//hello34
//7hello
//7hello34
//这种 byte和 char 变量做运算要求返回int类型
//如果最开始是String 则是连接
//中间是String 就先计算String前的再连接
byte、short 都是对补码进行扩展,正数高位补0,负数高位补1
char是无符号数 所以高位补0
强制类型转换
整形类型的强制转换就是若目标类型的长度小于源类型的长度,则在源类型低位直接截取目标类型的长度的数据。
强制类型转换有两种显示的强制类型转换和隐式的强制类型转换
上面为显示的
隐式的:在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符号右操作数强制转换为赋值符号左操作数的类型,然后进行赋值。
方法重载和方法重写
方法重载是方法的参数不同从而分辨是哪个方法
多个构造方法就是方法重载
方法重写(覆盖)是方法体中的内容不同
多态、抽象类、接口的具体实现类中的方法就是覆盖重写override
区别点 | 重载方法 | 重写方法 |
---|---|---|
发生范围 | 同一个类 | 子类 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可修改 | 子类方法返回值类型应比父类方法返回值类型更小或相等 |
异常 | 可修改 | 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等; |
访问修饰符 | 可修改 | 一定不能做更严格的限制(可以降低限制) |
发生阶段 | 编译期 | 运行期 |
native关键字
native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中
例如 hashcode()
Java方法参数的传递
都是值传递,方法传引用类型的时候也是引用类型地址的一个复制,当你在交换操作这些不对原来的内容进行修改的时候 ,原来的是不会变的,也就是方法不能修改传递给它的任何参数变量的内容。
public class Demo {
public static void main(String[] args) {
Student s1 = new Student("小张");
Student s2 = new Student("小李");
swap(s1, s2);
System.out.println("s1:" + s1.getName());
System.out.println("s2:" + s2.getName());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
System.out.println("x:" + x.getName());
System.out.println("y:" + y.getName());
x.setName("haha");
y.setName("lalala");
}
}
//x:小李
//y:小张
//s1:lalala
//s2:haha
hashcode和equals
为什么两个对象有相同的 hashcode 值,它们也不一定是相等的?
因为 hashCode()
所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashCode
。
我们刚刚也提到了 HashSet
,如果 HashSet
在对比的时候,同样的 hashcode 有多个对象,它会使用 equals()
来判断是否真的相同。也就是说 hashcode
只是用来缩小查找成本。
为什么重写 equals
时必须重写 hashCode
方法?
如果两个对象相等,则 hashcode 一定也是相同的。两个对象相等,对两个对象分别调用 equals 方法都返回 true。但是,两个对象有相同的 hashcode 值,它们也不一定是相等的 。因此,equals 方法被覆盖过,则 hashCode
方法也必须被覆盖。
深拷贝和浅拷贝
深拷贝拷贝了一个对象,浅拷贝拷贝的是对象的引用
类
构造器能不能被重写
Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。
Java为什么总是有一个无参构造
Java 程序在执行子类的构造方法之前,如果没有用 super()
来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super()
来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
成员变量和局部变量的区别
1、成员变量是类的一部分随类的产生而产生,随类的消失而消失,局部变量是方法中的一部分随着方法调用的结束而消失
2、成员变量可以被public、static、final等修饰 局部变量只能被final修饰
3、成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。