Object 类详解
equals
- == 是一个比较运算符既可以判断基本类型,又可以判断引用类型
- ==·如果判断基本类型,判断的是值是否相等。示例: int i=10; double d=10.0:
- ==·如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
- equals: 是Object类中的方法,只能判断引用类型
- 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如IntegerString
hashCode
- 提高具有哈希结构的容器的效率!
- 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
- 两个引用,如果指向的是不同对象,则哈希值是不一样的
- 哈希值主要根据地址号来的!, 不能完全将哈希值等价于地址。
- 后面在集合,中 hashCode 如果需要的话,也会重写
toString
- 默认返回:全类名+@+哈希值的十六进制,【查看 Object 的 toString 方法】
- 子类往往重写 toString 方法,用于返回对象的属性信息
- 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式.当直接输出一个对象时,toString 方法会被默认的调用, 比如 System.out.println(monster); 就会默认调用 monster.toString()
finaliz
- 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作
- 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来 销毁该对象,在销毁该对象前,会先调用 finalize 方法。
- 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,但是我们在实际开发中,几乎不会运用 finaliz
类方法使用注意事项和细节讨论
什么时候需要用类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):
- 类变量与实例变量(普通属性)区别类变量是该类的所有对象共享的,而实例变量是每个对象独享的。
- 加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
- 类变量可以通过类名.类变量名或者对象名.类变量名来访问,
但java设计者推荐我们使用类名.类变量名方式访问。【前提是满足访问修饰符的访问权限和范围】
- 实例变量不能通过类名.类变量名方式访问。
- 类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了就可以使用类变量了
- 类变量的生命周期是随类的加载开始,随着类消亡而销毁。
main()方法
- 在 main()方法中,我们可以直接调用 main 方法所在类的静态方法或静态属性。
- 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静 态成员
代码化
基本介绍
代码化块又称为初始化块,属于类中的成员[即是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
说明注意:
1)修饰符可选,要写的话,也只能写static
2)代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块/非静态代码块
3)逻辑语句可以为任何逻辑语句(输入输出、方法调用、循环、判断等)
4)**;**号可以写上,也可以省略。
自我理解:
- 相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作
- 如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性
代码块使用注意事项和细节讨论
1)static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就执行。
2)类什么时候被加载[重要背!]
2.1.创建对象实例时(new)
2.2.创建子类对象实例,父类也会被加载
2.3.使用类的静态成员时(静态属性,静态方法)
3)普通的代码块,在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码块并不会执行。
小结:
-
static代码块是类加载时,执行,只会执行一次
-
普通代码块是在创建对象时调用的,创建一次,调用一次
-
类加载的3种情况,
3.1、命令行启动应用时候由JVM初始化加载
3.2、通过Class.forName ()方法动态加载
3.3、通过ClassLoader.loadClass ()方法动态加载
4)创建一个对象时,在一个类调用顺序是:(重点,难点):
4.1调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
4.2调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如s果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)
4.3调用构造方法
单例设计模式
所谓类的单例设计模式, 就是采取一定的方法保证在整个的软件系统中,对某个类只能存 在一个对象实例,并且该类只提供一个取得其对象实例的方法
单例模式有两种方式:
2.1饿汉式
2.2懒汉式
单例模式应用实例
演示饿汉式和懒汉式单例模式的实现:
1)构造器私有化=》防止直接 new
2)类的内部创建对象
3)向外暴露一个静态的公共方法。Getinstance
饿汉式VS懒汉式
- 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例而懒汉式是在使用时才创建
- 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。(后面学习线程后,会完善)
- 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题
- 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。
final关键字
基本介绍
final中文意思:最后的,最终的.
final可以修饰类、属性、方法和局部变量.
在某些情况下,程序员可能有以下需求,就会使用到final:
final使用注意事项和细节讨论
1)final修饰的属性又叫常量,一般用XX XX XX来命名
2)final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一【选择一个位置赋初值即可】:
3)如果final修饰的属性是静态的,则初始化的位置只能是
4)final类不能继承,但是可以实例化对象。
5)如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。
6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法。
7) final不能修饰构造方法(即构造器)
8 ) (Integer,Double,Float, Boolean等都是final),String也是final类
9 ) final和 static往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理
本文链接:https://my.lmcjl.com/post/4832.html
4 评论