Day15 面向对象进阶——接Day14
文章目录
- Day15 面向对象进阶——接Day14
- 一、访问修饰符
- 二、Object
- 三、深入String的equals()方法
- 四、final
一、访问修饰符
1、含义:修饰类、方法、属性,定义使用的范围
2、经验:
2.1.属性一般使用private修饰,因为封装
2.2.属性或者方法如果需要被子类使用,一般使用protected修饰
2.3.方法如果不需要被外界使用,一般使用private修饰
2.4.方法一般使用public修饰
注意:1.修饰类只能使用public和默认的访问权限
2.修饰方法和属性可以使用所有的访问权限
访问修饰符 | 本类 | 本包 | 其他包子类 | 其他包 |
---|---|---|---|---|
private | OK | |||
默认的 | OK | OK | ||
protected | OK | OK | OK | |
public | Ok | OK | OK | Ok |
二、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
类重写了toString
、equals
和hashCode
方法,这些方法都是从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内存图