java基础
笔记的都是需要背诵的零散知识点,以顺序的方式组织
文章目录
1.equals、==、hashcode
-
== 是一个比较运算符
-
== 可以判断基本类型、引用类型
-
== 判断基本类型,判断的是值是否相等
-
== 判断引用类型,判断的是地址是否相等,即判断是不是同一个对象
-
equals 是Object类中的方法,只能判断引用类型
-
equals 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等,integer、string源码就重写了equals
-
this=obj?判断
-
向下转型?
-
student instanceof Person 判断student对象是否是Person类型
2.hashcode
- 提高具有哈希结构的容器的效率
- 返回该对象的哈希值,支持此方法是为了提高哈希表(如;hashtabel)的性能
- 两个引用,如果指向的是同一个对象,则哈希值肯定一样,反之肯定不同
- 哈希值主要根据地址号,不能完全将哈希值等同于地址,哈希值一般是用过将该对象的内部地址转换成一个整数来是实现的
- hashcode重写
- tostring:
tostring默认返回:全类名+@+哈希值的十六进制
子类往往重写tostring方法,用于返回对象的属性(自动生成)
重写tostring方法,打印对象或拼接对象时,都会自动调用该对象的tostring形式
当直接输出一个对象时,tostring方法会被默认的调用
3.finalize方法
- 当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,写自己的逻辑代码,做一些释放资源的操作(比如释放资源:数据库连接,或者打开文件…)
- 如果程序员不重写finalize,那么就会调用Object类的finalize,即默认处理
- 什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。
- 垃圾回收机制的调用,是由系统来决定(即有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制
- 我们在实际开发中,几乎不会运用finalize,所以更多就是为了应付面试.
4.断点
- 在开发中,新手程序员在查找错误时,这时老程序员就会温馨提示,可以用断点调试,一步一步的看源码执行的过程,从而发现错误所在。
- 重要提示:在断点调试过程中,是运行状态,是以对象的运行类型来执行的.A extends B; B b= new A(); b.xx();
5.类变量
- 类变量/静态变量/静态属性
- 定义语法:
访问修饰符 static 数据类型 变量名
static 访问修饰符 数据类型 变量名 - 类名**.**类变量名
- 对象名**.**类变量名
- 实例变量:对象的成员
- 类变量是该类的所有对象共享的
- 实例变量是每个对象独享的
- 静态变量在类加载的时候就初始化生成了
- 类变量的生存周期最长,随着类消亡而销毁
- 实例变量生命周期随着对象的消失而消失
6.类方法
-
类方法也叫静态方法
-
定义:
访问修饰符 static 数据返回类型 方法名(){}
static 访问修饰符 数据返回类型 方法名(){} -
类方法的调用:
类名.类方法名
对象名.方法名 -
开发自己的工具类时,可以将方法做成静态的,方便调用
-
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。比如:工具类中的方法utils Math类、Arrays类、Collections集合类
-
小结:在程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用了,比如打印一维数组,冒泡排序,完成某个计算任务等…[举例说明…]
-
类方法的细节:
(1)类方法和晋通方法都是随看类的加载而加载,将结构信息存储在方法区
(2)类方法中无this的参数
(3)普通方法中隐含着this的参数
类方法可以通过类名调用,也可以通过对象名调用。
(4)普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。
(5)类方法中不允许使用和对象有关的关键字,比如this和super。普通方法(成员方法)可以。[举例]
(6)类方法(静态方法)中只能访问静态变量或静态方法。【如何理解】字面意思静态调用动态还能叫静态?主要还是jvm的类加载机制。
(7)普通成员方法,既可以访问非静态成员,也可以访问静态成员。
(8)小结:静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员(必须遵守访问权限)
7.main方法
- 解释main方法的形式:
- public static void main(String[] args){}
- main方法是虚拟机调用
- java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
- java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static
- 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
- 在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性。
- 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象态成员
8.代码块
1. 基本语法:
[修饰符]{
代码
};
- 修饰符只能为static或者不写
- 静态代码块
- 普通代码块/非静态代码块
- 逻辑语句可以为任何语句(输入,输出,方法调用,循环,判断)
- ;(分号)可写可省略
2. 代码块的好处
- 相当于另外一种形式的构造器(对构造器的补充机制)可以做初始化操作
- 场景:如果有多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性
3. 代码块的小细节
- static代码块也叫静态代码块,作用就是对类进行初始化,
- 静态代码块,随着类的加载而执行切只执行一次
- 普通代码块,每创建一个对象,就执行
- 普通代码块,在创建对象实例时,会被隐式的调用,被创建一次,就会调用一次。如果只是使用类的静态成员时,普通代码并不会执行
- 构造器的最前面其实隐含了super()和调用普普通代码块。静态相关的代码块,在类加载时完毕,所以优先于构造器和普通代码块
- 静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员
4.类什么时候被加载
类什么时候被加载 : (1)创建实例时(new)
(2)创建子类对象实例,父类也会被加载
(3)使用类的静态成员时(静态属性,静态方法)
5.在创建一个对象时,在一个类调用顺序
在创建一个对象时,在一个类调用顺序 : (1)调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义顺序调用)
(2)调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按他们定义顺序调用)
(3)调用构造方法
6.案例:有继承关系时,调用顺序
我们看一下创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
①父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
②子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
③父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
④父类的构造方法
⑤子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)子
⑥类的构造方法/面试题