Java基础知识!
Java基础知识!
月伴飞鱼不同版本JDK安装网站:https://adoptium.net/zh-CN/
继承,封装,多态
面对对象语言的特性:封装、继承、多态。
封装:
封装也叫作信息隐藏或者数据访问保护。
类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。
继承:
- 表示类之间的
is-a
关系。- 继承最大的一个好处就是代码复用。
- 假如两个类有一些相同的属性和方法,就可以将这些相同的部分,抽取到父类中,让两个子类继承父类。
- 这样,两个子类就可以重用父类中的代码,避免代码重复写多遍。
多态:
- 子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
- 多态提高了代码的可扩展性和复用性。
值传递还是引用传递
Java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的数据拷贝。
如果参数是引用类型,因为栈中存的是对象的地址值,所以传递的是该参量所引用的对象在堆中地址值的拷贝。
编译期与运行期
编译期是指把源码交给编译器编译成计算机可执行文件的过程,运行期是指把编译后的文件交给计算机执行,直到程序结束。
在
Java
中就是把.java
文件编译成.class
文件,再把编译后的文件交给JVM
加载执行。
接口和抽象的区别
抽象类带来的很大的作用就是实现代码复用,比如当有多个子类有相同的属性或方法时,我们可以抽象出一个公共的类,然后子类继承这个抽象类,当然,这个公共类可以是普通父类,也可以是抽象类。
- 但是抽象类中的方法可以交给子类去实现,让子类有不同的功能。
接口实现了约定和实现相分离,降低了代码间的耦合性,提高代码的可扩展性。
- 调用者只需要关注抽象的接口,不需要了解具体的实现,具体的实现代码对调用者透明。
反射
在Java运行状态时,只要给定类的名字,就能知道这个类的所有信息,可以构造出指定对象,可以调用它的任意一个属性和方法。
- 这种动态获取信息以及动态调用对象的方法的功能是反射机制。
静态变量什么时候初始化
静态变量的初始化时机分为两种情况,即在类加载阶段和在第一次使用时。
类加载阶段
在类加载过程中,当类被加载到内存中时,静态变量会被初始化。
静态变量的初始化是在类加载阶段的准备阶段进行的,此时会为静态变量分配内存并设置默认值。
第一次使用时
当静态变量在第一次使用前没有被初始化时,会在第一次使用时进行初始化。
这种情况下,静态变量的初始化是在类加载阶段的初始化阶段进行的。
静态变量的初始化顺序:
当一个类中存在多个静态变量时,静态变量按照声明的顺序依次进行初始化。
关键字
Final
Final可以用来修饰变量、方法或者类。
修饰变量:
- 这个变量一旦被赋值就不能被修改了,如果尝试给其赋值,会报编译错误。
修饰方法:
- 该方法不可以被重写。
修饰类:
- 这个类不可被继承。
注意:Final修饰对象时,只是引用不可变,而对象本身的内容依然是可以变化的。
- 这一点同样适用于数组。
Static
修饰类变量:
- 如果该变量是 public 的话,表示该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.static 变量 访问。
修饰方法:
代表该方法和当前类是无关的,任意类都可以直接访问(如果权限是 public 的话)。
被 static 修饰的方法,在类初始化的时候并不会初始化,只有当自己被调用时,才会被执行。
修饰方法块:
- 方法块(静态块)常常用于在类启动之前,初始化一些值。
- 静态块只能调用同样被 static 修饰的变量,并且 static 的变量需要写在静态块的前面,不然编译会报错。
Transient
transient用来修饰类变量,意思是当前变量无需进行序列化。
非静态初始化块(构造代码块):
给对象进行初始化,对象一建立就运行,且优先于构造函数的运行。
非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。
可以将所有构造函数共性的东西定义在构造代码块中。
静态初始化块:
给类进行初始化,随着类的加载而执行,且只执行一次。
与构造代码块的区别:
- 构造代码块用于初始化对象,每创建一个对象就会被执行一次。
- 静态代码块用于初始化类,随着类的加载而执行,不管创建几个对象,都只执行一次。
- 静态代码块优先于构造代码块的执行。
执行顺序:
所有的静态初始化块都优先执行,其次才是非静态的初始化块和构造函数,它们的执行顺序是:
- 父类的静态初始化块
- 子类的静态初始化块
- 父类的初始化块
- 父类的构造函数
- 子类的初始化块
- 子类的构造函数
Long
Long 自己实现了一种缓存机制,缓存了从 -128 到 127 内的所有 Long 值。
如果是这个范围内的 Long 值,就不会初始化,而是从缓存中拿,缓存初始化源码如下:
1 | private static class LongCache { |