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

简介: 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“)


目录
相关文章
|
24天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
47 2
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
146 4
|
3月前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
142 20
|
4月前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
4月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
62 2
|
5月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
4月前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
30 0
|
5月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
77 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等