Java学习笔记(十一):面向对象⑥

简介: Java学习笔记(十一):面向对象⑥

@[toc]
  
  
  

  

Object类

  
  
Object类 即 java.lang.Object类 是所有类的直接或间接父类

  1. Object类是所有Java类的根父类。
  2. 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object。
  3. Object类中的功能(方法)具有通用性(属性无)。原因:Object类是所有类的直接或间接父类。

方法:equals() / toString() / getClass() / hashCode() / clone() / finalize() / wait() / notify() / notifyAll()

  1. Object类只声明了一个空参的构造器。

  

  

Object类中的equals()方法

  

回顾 == 的使用

== :运算符

  1. 可以使用在基本数据类型引用数据类型变量中。(范围问题)
  2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(数据类型不用必须相同,只要不是布尔类型,其他七大类型都能比较)

如果比较的是引用数据类型变量:比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体。

补充:== 符号使用时,必须保证符号左右两边的变量类型一致,如果不一致编译都报错(对于基本数据类型,变量类型一致指:不带布尔类型的其他七大类型。对于引用类型,类型一致:类相同。举例:String和Date就不能\=\=比较,因为类型不一致)。

  
  

equals()方法的使用

  1. 是一个方法,而非运算符(所以基本数据类型变量不能用,总不能 int i = 10;int j = 20;i.equals(j)吧,这太离谱了,只有对象才能用方法!)。
  2. 只能适用于引用数据类型(就是上面说的)。
  3. Object类中equals()的定义:

public boolean equals ( Object obj ) {
   return (this == obj) ;
}
说明:Object类中定义的 equals() 和 == 的作用是相同的,即对于引用数据类型,比较两个对象的地址值是否相同(两个引用是否指向同一个对象实体)。

  1. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的属性是否相同。(属性就是创建对象时给构造器传的参数)
  2. 通常情况下,我们自定义的类如果想使用equals()的话,目标通常也是比较两个对象的属性是否相同。那么,我们就需要对Object类中的equals()进行重写。

重写的原则:比较两个对象的属性是否相同。

  

练习

import java.sql.Date;
public class EqualsTest {
    public static void main(String[] args) {
        
        //基本数据类型
        int i = 10;
        int j = 10;
        double d = 10.0;
        System.out.println(i == j);    // true     int和int比属于,相等返回true很正常
        System.out.println(i == d); // true     int和double比,会自动类型提升
                                    // 只要是除布尔外的其他七大数据类型,都能比较
        
        
//        boolean b =true;
//        System.out.println(i == b);这里编译都会出错,因为比较基本数据类型时,不能把布尔类型
//                                 和其他类型比
        
        
        char c = 10;    // 把ASCII码为10的字符赋值给了c,c字符的ASCII码就是10
        System.out.println(i == c); //true比较时,c先进行了类型转换,字符转了ASCII码再和i比较
        // 有点像一斤棉花和一斤铁谁重的问题
        
        char c1 = 'A';
        char c2 = 65;
        System.out.println(c1 == c2); // true 跟上面一样,字符和ASCII码会自动转换
        


        //引用数据类型
        Customer cust1 = new Customer("Tom" ,21);
        Customer cust2 = new Customer("Tom" ,21);
        System.out.println(cust1 == cust2); // false ==比的是地址,new了两次肯定是不同的地址
        
        String str1 = new String("BAT");
        String str2 = new String("BAT");
        System.out.println(str1 == str2); // false 地址不同
        
        // false 自定义类没重写equals()前,equals()和 == 一样( equals()就是== )
        System.out.println(cust1.equals(cust2));    
        //true String类在源码中已经重写好了equals()方法,比较的就是对象的属性是否相等
        System.out.println(str1.equals(str2));    
        
        Date date1 = new Date(23432525324L);
        Date date2 = new Date(23432525324L);
        System.out.println(date1.equals(date2));    //true 对象属性相同
    }
}

  

  

面试题:==和equals()的区别

  1. == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址。
  2. equals() 属于java.lang.Object类里面的方法,如果该方法没有被重写过,则默认也是 == ;

String、Date等类的equals()方法已经被重写在源码里了,所以我们不用重写就直接能用来比较值。

  1. ==和equals()的执行结果,具体要看自定义类里有没有重写Object的equals()方法来判断。
  2. 通常情况下,重写equals()方法的目的是比较类中的相应属性是否都相等。

  

  

重写equals()方法的原则

  • 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
  • 自反性:x.equals(x)必须返回是“true”。
  • 传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
  • 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管重复x.equals(y)多少次,返回都是“true”。
  • 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

  

  

Object类中的toString()方法

  

  • toString方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址。

返回值:包名.类名.地址
例:封装继承多态.面向对象中最后一点内容.GeometricObject@5cad8086

  • 在进行String与其他类型数据的连接时,自动调用toString()方法
Date now = new Date();
System.out.println("now="+now);    // 相当于下面
System.out.println("now="+now.toString());
  • 可以根据需要在用户自定义类型中重写toString()方法

如String类的源码重写了toString()方法,返回字符串的值。

s1 = "hello";
System.out.println(s1);    // 相当于System.out.println(s1.toString());    都是输出"hello"
  • 基本类型数据转换为String类型时,调用了对应包装类的toString()方法
int a = 10;
System.out.println("a="+a);

  

toString()方法的使用

  1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法。
  2. Object类中toString()的定义:

public String toString () {
   return getClass().getName() + "@" + Integer.toHexString(hashCode()) ;
}

  1. 像String、Date、File、包装类等都重写了Object类中的toString()方法。

使得在调用对象的toString()时,返回属性信息。

  1. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的属性。

  
总结:
当我们想 System.out.println(自定义类的对象);输出的是属性值而非地址时,就需要重写toString()方法。
  
  
  

  

包装类(Wrapper)的使用

  

  • 针对八种基本数据类型定义相应的引用类型——包装类
  • 有了类的特点,就可以调用类中的方法

在这里插入图片描述

  

  

基本类型、包装类与String类间的转换

  

在这里插入图片描述

基本类型和包装类之间的转换

只用记住自动装箱和自动拆箱

//自动装箱:基本数据类型 --> 包装类
        int num1 = 10;
        Integer in1 = num1;    // int --> Integer
        
        boolean b1 = true;
        Boolean b2 = b1;    // boolean --> Boolean
        
        
//自动拆箱:包装类 --> 基本数据类型
        int num2 = in1;        // Integer --> int

  

基本数据类型、包装类转换到String类型

无论是基本数据类型还是包装类,都调用String类重载的valueOf(Xxx xxx)方法,即String.valueOf(Xxx xxx)

float f1 = 12.3f;
String str1 = String.valueOf(f1);     // "12.3"        float --> String

Double d1 = new Double(12.4);
String str2 = String.valueOf(d1);    // "12.4"        Double --> String

  

String类型转换到基本数据类型、包装类

调用相应的包装类的parseXxx(String)静态方法

String str1 = "123";
//        String str1 = "123a"; 这样是无论如何都转不成功的
        //错误的情况,会报错,不能String直接强制类型转换为基本类型或包装类
//        int num1 = (int)str1;
//        Integer in1 = (Integer)str1;
        
int num2 = Integer.parseInt(str1);     // 转为int类型,就Integer.parseInt()
System.out.println(num2 + 1);    // 124 转换成功

String str2 = "true";
Boolean b1 = Boolean.parseBoolean(str2);    // 转为Boolean包装类,就Boolean.parseBoolean()
System.out.println(b1);        // true
相关文章
|
5月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
331 5
|
2月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
136 1
|
2月前
|
小程序 Java 知识图谱
Java 学习笔记 —— BMI & BMR 计算器
这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
|
2月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
8月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
151 13
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
105 0
|
3月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
4月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
6月前
|
人工智能 Java 编译器
Java:面向对象
本文介绍了Java编程中的核心概念,包括包的命名规范与自动导入机制、构造方法的特点与使用、`this`和`super`关键字的作用、继承的基本规则、访问权限的设置、封装的意义、多态的实现原理以及`static`关键字的用法。通过详细解析每个知识点,并结合代码示例,帮助读者深入理解Java面向对象编程的核心思想与实践技巧。内容适合初学者及进阶开发者学习参考。
160 0
|
8月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。