文章目录
- Object类(java.lang)
Object类(java.lang)
Object
类是Java语言中的根类,即所有类的父类`
重点:
- public String toString()`:返回该对象的字符串表示。
public class User {private String username;private String password;public User() {}public User(String username, String password) {this.username = username;this.password = password;}public static void main(String[] args) {User user = new User("admin","123456");System.out.println(user.toString());}
}
我们创建了一个User类对象,User类对象的用户名为admin,密码为123456,并且我们调用了对象的toString()方法。这里我们的User类中并没有定义toString()方法,也没有继承任何类和实现任何接口,这里就涉及到了Object类,该类是所有类的父类,如果一个类没有特别指定父类,那么默认则继承自Object类。
通常我们会重写toString方法,来获得我们所想看到的结果,而不是只看到这个对象在堆内存中的内存地址。
public class User{private String username;private String password;public User() {}public User(String username, String password) {this.username = username;this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public static void main(String[] args) {User user = new User("admin","123456");System.out.println(user.toString());}
}
- public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
public class User {private String username;private String password;public User() {}public User(String username, String password) {this.username = username;this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public static void main(String[] args) {User user1 = new User("admin","123456");User user2 = new User("admin","123456");System.out.println(user1.equals(user2));}
}
通常情况下,我们都希望通过比较对象的内容来判断俩个对象是否相等,而不是比较内存地址。因此在日常开发中,我们也会重写equals方法。
import java.util.Objects;public class User {String username;String password;public User() {}public User(String username, String password) {this.username = username;this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}@Overridepublic boolean equals(Object o){if (this == o ){return true;}if (o == null || getClass() != o.getClass()){return false;}User user = (User) o;return username == user.username && Objects.equals(username,user.username) && password == user.password && Objects.equals(password,user.password);}public static void main(String[] args) {User user1 = new User("admin","123456");User user2 = new User("admin","123456");System.out.println(user1.equals(user2));}
}
这里我们重写了Object类,也就是父类中的equals()方法,首先对俩个对象进行了==判断,如果俩个对象的内存地址相等,则表示相等,然后我们判断传入的对象是否为空并且俩个比较的对象要是同一个类型,最后如果以上的判断都成立,我们将传入的对象进行了向下转型(也就是多态),通过一个Objects类来帮我们进行判断值是否相等。
Objects源码:
这里我们可以学习一下代码的编写,可以看到在Objects源码中先判断了俩个对象的内存地址是否相等,如果相等则不用进行后面代码的判断,提高了代码的效率,还要注意的就是,第二个括号中的判断并不是直接判断a对象是否等于b对象,而是先判断a对象是否为空,这里有个很重要的原因,这也是我们初学者常遇见的一个异常(空指针异常),当我们的a对象为空的时候,a对象调用equals()方法,就会报空指针异常。因此这里先进行了判断避免了空指针异常的发生。
代码举例:
当我们判断一个字符串是否为空字符串的时候,我们有俩种写法
写法一:
public class CompareToString {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();System.out.println(str.equals(""));}
}
写法二:
public class CompareToString {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();System.out.println("".equals(str));}
}
很显然,第二种写法更优,因为当我们把一个引用类型的变量来调用equals()方法时,如果这个引用类型的变量为null,就会出现空指针异常,但是如果我们将一个空字符调用equals()方法来比较的时候,当str为空的时候并不会报空指针异常。
注意:
String类中已经重写了equals()方法;
欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。