【JAVA内置包装类02】JAVA Object类

Object类概述

1. Object 是 Java 类库中的一个特殊类,也是所有类的父类。

2. Java 允许把任何类型的对象赋给 Object 类型的变量。

3. 当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。

 两个类表示的含义是一样的:

【public class MyClass{…}】 等价于 【public class MyClass extends Object {…}】

4. 由于 Java 所有的类都是 Object 类的子类,所以任何 Java 对象都可以调用 Object 类的方法。

Object 类的构造方法

构造器/构造方法/构造函数

说明

Object()

构造一个新对象。

Object 类的方法

修饰符和类型/方法 说明
protected Object clone() 创建与该对象的类相同的新对象
boolean equals(Object obj) 比较两对象是否相等
protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,对象垃圾回收器调用该方法
Class<?> getClass() 返回一个对象运行时的实例类
int hashCode() 返回该对象的散列码值
void notify() 激活等待在该对象的监视器上的一个线程
void notifyAll() 激活等待在该对象的监视器上的全部线程
String toString() 返回该对象的字符串表示
void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
void wait​(long timeoutMillis) 导致当前线程等待,直到它被唤醒(通常是被通知或中断),或直到经过一定的实际时间。

void wait​(long timeoutMillis, int nanos)

导致当前线程等待,直到它被唤醒(通常是被通知或中断),或直到经过一定的实际时间。

5. public class Object

Module java.base

Package java.lang  //Object类在lang包中

Class Object  //Object类

java.lang.Object

public class Object

Class Object is the root of the class hierarchy(类层次结构). Every class has Object as a superclass(超类). All objects(所有对象), including arrays(包括数组), implement(实现) the methods of this class.

Since(从以下版本开始):

1.0


 

public class Object 的构造方法

 


 

toString() 方法

toString() 方法返回该对象的字符串,当程序输出一个对象或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的 toString() 方法返回该对象的字符串表示。

Object 类的 toString() 方法返回“运行时类名@十六进制哈希码”格式的字符串,但很多类都重写了 Object 类的 toString() 方法,用于返回可以表述该对象信息的字符串。

哈希码(hashCode),每个 Java 对象都有哈希码属性,哈希码可以用来标识对象,提高对象在集合操作中的执行效率。

先看以下代码:

  1. // 定义Demo类,实际上继承Object类
  2. class Demo {
  3. }
  4. public class ObjectDemo01 {
  5. public static void main(String[] args) {
  6. Demo d = new Demo(); // 实例化Demo对象
  7. System.out.println("不加toString()输出:" + d);
  8. System.out.println("加上toString()输出:" + d.toString());
  9. }
  10. }

输出结果为:

不加toString()输出:Demo@15db9742
加上toString()输出:Demo@15db9742

以上的程序是随机输出了一些地址信息,从程序的运行结果可以清楚的发现,加和不加 toString() 的最终输出结果是一样的,也就是说对象输出时一定会调用 Object 类中的 toString() 方法打印内容。所以利用此特性就可以通过 toString() 取得一些对象的信息,如下面代码。

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public Person(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public String toString() {
  9. return "姓名:" + this.name + ":年龄" + this.age;
  10. }
  11. public static void main(String[] args) {
  12. Person per = new Person("C语言中文网", 30);// 实例化Person对象
  13. System.out.println("对象信息:" + per);// 打印对象调用toString()方法
  14. }
  15. }

输出结果为:

对象信息:姓名:C语言中文网:年龄30

程序中的 Person 类中重写了 Object 类中的 toString() 方法,这样直接输出对象时调用的是被子类重写过的 toString() 方法。


 

equals() 方法

在前面学习字符串比较时,曾经介绍过两种比较方法,分别是==运算符和 equals() 方法,==运算符是比较两个引用变量是否指向同一个实例,equals() 方法是比较两个对象的内容是否相等,通常字符串的比较只是关心内容是否相等。

其使用格式如下:

  1. boolean result = obj.equals(Object o);

其中,obj 表示要进行比较的一个对象,o 表示另一个对象。

例 1

编写一个 Java 程序,实现用户登录的验证功能。要求用户从键盘输入登录用户名和密码,当用户输入的用户名等于 admin 并且密码也等于 admin 时,则表示该用户为合法用户,提示登录成功,否则提示用户名或者密码错误信息。

在这里使用 equals() 方法将用户输入的字符串与保存 admin 的字符串对象进行比较,具体的代码如下:

  1. import java.util.Scanner;
  2. public class Test01 {
  3. // 验证用户名和密码
  4. public static boolean validateLogin(String uname, String upwd) {
  5. boolean con = false;
  6. if (uname.equals("admin") && upwd.equals("admin")) { // 比较两个 String 对象
  7. con = true;
  8. } else {
  9. con = false;
  10. }
  11. return con;
  12. }
  13. public static void main(String[] args) {
  14. Scanner input = new Scanner(System.in);
  15. System.out.println("------欢迎使用大数据管理平台------");
  16. System.out.println("用户名:");
  17. String username = input.next(); // 获取用户输入的用户名
  18. System.out.println("密码:");
  19. String pwd = input.next(); // 获取用户输入的密码
  20. boolean con = validateLogin(username, pwd);
  21. if (con) {
  22. System.out.println("登录成功!");
  23. } else {
  24. System.out.println("用户名或密码有误!");
  25. }
  26. }
  27. }

上述代码在 validateLogin() 方法中又使用 equals() 方法将两个 String 类型的对象进行了比较,当 uname 对象与保存 admin 的 String 对象相同时,uname.equals("admin") 为 true;与此相同,当 upwd 对象与保存 admin 的 String 对象相同时,upwd.equals("admin") 为 true。当用户输入的用户名和密码都为 admin 时,表示该用户为合法用户,提示登录成功信息,否则提示用户名或密码有误的错误信息。

该程序的运行结果下所示:

------欢迎使用大数据管理平台------
用户名:
adinm
密码:
admin
用户名或密码有误!
------欢迎使用大数据管理平台------
用户名:
admin
密码:
admin
登录成功!



 
getClass() 方法

getClass() 方法返回对象所属的类,是一个 Class 对象。通过 Class 对象可以获取该类的各种信息,包括类名、父类以及它所实现接口的名字等。

例 2

编写一个实例,演示如何对 String 类型调用 getClass() 方法,然后输出其父类及实现的接口信息。具体实现代码如下:

  1. public class Test02 {
  2. public static void printClassInfo(Object obj) {
  3. // 获取类名
  4. System.out.println("类名:" + obj.getClass().getName());
  5. // 获取父类名
  6. System.out.println("父类:" + obj.getClass().getSuperclass().getName());
  7. System.out.println("实现的接口有:");
  8. // 获取实现的接口并输出
  9. for (int i = 0; i < obj.getClass().getInterfaces().length; i++) {
  10. System.out.println(obj.getClass().getInterfaces()[i]);
  11. }
  12. }
  13. public static void main(String[] args) {
  14. String strObj = new String();
  15. printClassInfo(strObj);
  16. }
  17. }

该程序的运行结果如下:

类名:java.lang.String
父类:java.lang.Object
实现的接口有:
interface java.io.Serializable
interface java.lang.Comparable
interface java.lang.CharSequence


 

接收任意引用类型的对象

既然 Object 类是所有对象的父类,则所有的对象都可以向 Object 进行转换,在这其中也包含了数组和接口类型,即一切的引用数据类型都可以使用 Object 进行接收。

  1. interface A {
  2. public String getInfo();
  3. }
  4. class B implements A {
  5. public String getInfo() {
  6. return "Hello World!!!";
  7. }
  8. }
  9. public class ObjectDemo04 {
  10. public static void main(String[] args) {
  11. // 为接口实例化
  12. A a = new B();
  13. // 对象向上转型
  14. Object obj = a;
  15. // 对象向下转型
  16. A x = (A) obj;
  17. System.out.println(x.getInfo());
  18. }
  19. }

输出结果为:

Hello World!!!

通过以上代码可以发现,虽然接口不能继承一个类,但是依然是 Object 类的子类,因为接口本身是引用数据类型,所以可以进行向上转型操作。

同理,也可以使用 Object 接收一个数组,因为数组本身也是引用数据类型。

  1. public class ObjectDemo05 {
  2. public static void main(String[] args) {
  3. int temp[] = { 1, 3, 5, 7, 9 };
  4. // 使用object接收数组
  5. Object obj = temp;
  6. // 传递数组引用
  7. print(obj);
  8. }
  9. public static void print(Object o) {
  10. // 判断对象的类型
  11. if (o instanceof int[]) {
  12. // 向下转型
  13. int x[] = (int[]) o;
  14. // 循环输出
  15. for (int i = 0; i < x.length; i++) {
  16. System.out.print(x[i] + "\t");
  17. }
  18. }
  19. }
  20. }

输出结果为:

1 3 5 7 9

以上程序使用 Object 接收一个整型数组,因为数组本身属于引用数据类型,所以可以使用 Object 接收数组内容,在输出时通过 instanceof 判断类型是否是一个整型数组,然后进行输出操作。

提示:因为 Object 类可以接收任意的引用数据类型,所以在很多的类库设计上都采用 Object 作为方法的参数,这样操作起来会比较方便。

猜你喜欢

转载自www.cnblogs.com/pinkowonote/p/12358651.html