java基础——equals类变量代码块

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){}
  1. main方法是虚拟机调用
  2. java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
  3. java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static
  4. 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
  5. 在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性。
  6. 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象态成员

8.代码块

1. 基本语法:

  [修饰符]{
    代码
  };

  • 修饰符只能为static或者不写
  • 静态代码块
  • 普通代码块/非静态代码块
  • 逻辑语句可以为任何语句(输入,输出,方法调用,循环,判断)
  • ;(分号)可写可省略
2. 代码块的好处
  • 相当于另外一种形式的构造器(对构造器的补充机制)可以做初始化操作
  • 场景:如果有多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性
3. 代码块的小细节
  • static代码块也叫静态代码块,作用就是对类进行初始化,
  • 静态代码块,随着类的加载而执行切只执行一次
  • 普通代码块,每创建一个对象,就执行
  • 普通代码块,在创建对象实例时,会被隐式的调用,被创建一次,就会调用一次。如果只是使用类的静态成员时,普通代码并不会执行
  • 构造器的最前面其实隐含了super()和调用普普通代码块。静态相关的代码块,在类加载时完毕,所以优先于构造器和普通代码块
  • 静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员
4.类什么时候被加载
  类什么时候被加载 :

 (1)创建实例时(new)
 (2)创建子类对象实例,父类也会被加载
 (3)使用类的静态成员时(静态属性,静态方法)

5.在创建一个对象时,在一个类调用顺序
  在创建一个对象时,在一个类调用顺序 :

 (1)调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义顺序调用)
 (2)调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按他们定义顺序调用)
 (3)调用构造方法

调用顺序理解:先看静态非静态,再看继承,再看非静态代码块(普通代码块),最后是构造方法;静态高于非静态,父类优先于子类
6.案例:有继承关系时,调用顺序

我们看一下创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
①父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
②子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
③父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
④父类的构造方法
⑤子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)子
⑥类的构造方法/面试题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值