Day15 面向对象进阶——接Day14

本文介绍了Java中的访问修饰符、Object类的基础知识,如equals()方法的深入理解,以及final关键字的作用。通过实例讲解了如何使用访问修饰符控制类、方法和属性的可见性,以及如何重写Object类的方法以满足自定义需求。
摘要由CSDN通过智能技术生成

Day15 面向对象进阶——接Day14

一、访问修饰符

1、含义:修饰类、方法、属性,定义使用的范围

2、经验:
2.1.属性一般使用private修饰,因为封装
2.2.属性或者方法如果需要被子类使用,一般使用protected修饰
2.3.方法如果不需要被外界使用,一般使用private修饰

2.4.方法一般使用public修饰

注意:1.修饰类只能使用public和默认的访问权限
2.修饰方法和属性可以使用所有的访问权限

访问修饰符本类本包其他包子类其他包
privateOK
默认的OKOK
protectedOKOKOK
publicOkOKOKOk

二、Object

​ 1、含义:基类也叫做超类,Object是所有类的祖先类

​ 2、注意:如果一个类没有明确继承的父类,默认继承Object

​ 3、Object方法的使用

​ 3.1. equals:比较两个对象内存地址是否相同

​ 3.2. hashCode:获取对象的hash值

​ 3.3. getClass:获取类的字节码文件对象

​ 3.4. toString:获取对象的字符串表示

​ 4、标杆作用:Object作为所有类的父类,定义了几个方法,方便子类去重写

​ 4.1. equals的标杆作用:比较两个对象是否相同,不同的对象比较规则不一样,所以子类重写即可

​ 4.2. toString的标杆作用:每个子类都有不同的属性,重写toString直接打印该对象中所有的属性,方便观察数据

​ 5、举例:

class Person {
    private String name;
    private int age;

public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

@Override
public String toString() {
    return "Person{name='" + name + "', age=" + age + "}";
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
        return false;
    }
    Person person = (Person) obj;
    return age == person.age && name.equals(person.name);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice", 30);
        Person person2 = new Person("Bob", 25);// 使用toString方法System.out.println(person1.toString());// 使用equals方法比较两个对象System.out.println("Are person1 and person2 equal? " + person1.equals(person2));// 使用hashCode方法获取对象的哈希码System.out.println("HashCode of person1: " + person1.hashCode());System.out.println("HashCode of person2: " + person2.hashCode());
}

}

分析:在这个示例中,Person类重写了toStringequalshashCode方法,这些方法都是从Object类继承而来的。在Main类中,我们创建了两个Person对象,并演示了如何使用toString方法打印对象的字符串表示,使用equals方法比较两个对象是否相等,以及使用hashCode方法获取对象的哈希码。

通过重写Object类的方法,我们可以根据自定义类的需求来定制这些方法的行为,从而更好地管理对象的字符串表示、相等性比较和哈希码计算。

三、深入String的equals()方法

​ 1、 含义:在Java中,String类重写了equals()方法,用于比较两个字符串对象的内容是否相等。

​ 2、 面试题:String是如何比较两个字符串是否相同的
​ 2.1.比较两个字符串的地址是否相同
​ 2.2.比较两个字符串的字符个数
​ 2.3.循环比较字符的Unicode码

public class Test01 {
	public static void main(String[] args) {
		
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1 == str2);//false
		System.out.println(str1.equals(str2));//true
		
		System.out.println(str1);
		System.out.println(str2);
		
		System.out.println("-------------------------------");
		
		MyString m1 = new MyString("abc");
		MyString m2 = new MyString("abc");
		
		System.out.println(m1 == m2);//false
		System.out.println(m1.equals(m2));//true
		
		//注意:打印对象,默认调用toString()
		System.out.println(m1);
		System.out.println(m2);
	}
}
public class MyString {

	private char[] value;
	
	public MyString(String original) {
		//"abc"
		//['a','b','c']
		value = original.toCharArray();//将字符串转换为字符数组
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		
		MyString my = (MyString) obj;
		
		char[] v1 = this.value;
		char[] v2 = my.value;
		
		//比较字符长度
		if(v1.length != v2.length){
			return false;
		}
		
		for (int i = 0; i < v1.length; i++) {
			//比较字符的Unicode码是否相同
			if(v1[i] != v2[i]){
				return false;
			}
		}
		return true;
	}
	
	@Override
	public String toString() {
		return String.valueOf(value);//将字符数组转为字符串
	}
}

四、final

1、含义:最终

2、作用:

​ 2.1. 修饰类:该类不能被继承

​ 2.2. 修饰方法:该方法不能被重写

​ 2.3. 修饰变量:变成常量,不能重新赋值

注意:常量的命名规则:全大写,单词之间用下划线隔开

常量的生命周期:存在常量池中,直到项目结束才会被销毁

3、经验:
如果不想让该类有子类(不想该类有扩展),就是用final修饰
final和static一般一起修饰属性,该属性变成静态常量
Object的equals内存图Object的equals内存图

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值