Object 类详解--代码块--单例设计模式

Object 类详解

equals

  1. == 是一个比较运算符既可以判断基本类型,又可以判断引用类型
  2. ==·如果判断基本类型,判断的是值是否相等。示例: int i=10; double d=10.0:
  3. ==·如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
  4. equals: 是Object类中的方法,只能判断引用类型
  5. 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如IntegerString

hashCode

  1. 提高具有哈希结构的容器的效率!
  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
  3. 两个引用,如果指向的是不同对象,则哈希值是不一样的
  4. 哈希值主要根据地址号来的!, 不能完全将哈希值等价于地址。
  5. 后面在集合,中 hashCode 如果需要的话,也会重写

toString

  1. 默认返回:全类名+@+哈希值的十六进制,【查看 Object 的 toString 方法】
  2. 子类往往重写 toString 方法,用于返回对象的属性信息
  3. 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式.当直接输出一个对象时,toString 方法会被默认的调用, 比如 System.out.println(monster); 就会默认调用 monster.toString()

finaliz

  1. 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作
  2. 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来 销毁该对象,在销毁该对象前,会先调用 finalize 方法。
  3. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,但是我们在实际开发中,几乎不会运用 finaliz

类方法使用注意事项和细节讨论

什么时候需要用类变量

当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):

  1. 类变量与实例变量(普通属性)区别类变量是该类的所有对象共享的,而实例变量是每个对象独享的。
  2. 加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
  3. 类变量可以通过类名.类变量名或者对象名.类变量名来访问,

但java设计者推荐我们使用类名.类变量名方式访问。【前提是满足访问修饰符的访问权限和范围】

  1. 实例变量不能通过类名.类变量名方式访问。
  2. 类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了就可以使用类变量了
  3. 类变量的生命周期是随类的加载开始,随着类消亡而销毁。

main()方法

  1. 在 main()方法中,我们可以直接调用 main 方法所在类的静态方法或静态属性。
  2. 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静 态成员

代码化

基本介绍

代码化块又称为初始化块,属于类中的成员[即是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。

但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。

[修饰符]{
代码

};

说明注意:
1)修饰符可选,要写的话,也只能写static
2)代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块/非静态代码块

3)逻辑语句可以为任何逻辑语句(输入输出、方法调用、循环、判断等)
4)**;**号可以写上,也可以省略。

自我理解

  1. 相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作
  2. 如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性

代码块使用注意事项和细节讨论

1)static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就执行。
2)类什么时候被加载[重要背!]
2.1.创建对象实例时(new)
2.2.创建子类对象实例,父类也会被加载
2.3.使用类的静态成员时(静态属性,静态方法)
3)普通的代码块,在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码块并不会执行。
小结:

  1. static代码块是类加载时,执行,只会执行一次

  2. 普通代码块是在创建对象时调用的,创建一次,调用一次

  3. 类加载的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懒汉式

  1. 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例而懒汉式是在使用时才创建
  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。(后面学习线程后,会完善)
  3. 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题
  4. 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。

final关键字

基本介绍
final中文意思:最后的,最终的.
final可以修饰类、属性、方法和局部变量.
在某些情况下,程序员可能有以下需求,就会使用到final:

1)当不希望类被继承时,可以用final修饰.

2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰。

3)当不希望类的的某个属性的值被修改,可以用final修饰

4)当不希望某个局部变量被修改,可以使用final修饰

final使用注意事项和细节讨论

1)final修饰的属性又叫常量,一般用XX XX XX来命名

2)final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一【选择一个位置赋初值即可】:

2.1定义时:如 public final double TAX RATE=0.08;
2.1在构造器中
2.1在代码块中。

3)如果final修饰的属性是静态的,则初始化的位置只能是

3.1定义时

3.2在静态代码块不能在构造器中赋值。

4)final类不能继承,但是可以实例化对象。

5)如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。

6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法。

7) final不能修饰构造方法(即构造器)

8 ) (Integer,Double,Float, Boolean等都是final),String也是final类

9 ) final和 static往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理

class Demo{
public static final int i=16;//
static{
System.out.println("132465“)

你可能感兴趣的:(javaEE基础,java,设计模式,开发语言,java-ee,object,代码块,intellij-idea)