Java根类 ---- Object

 java.lang.Object类是Java所有类的根类。

Java所有类都直接或间接继承自Object类,它是所有类的“祖先”。

toString()方法

为了日志输出等处理方便,所有的对象都可以以文本方式表示,需要在该对象所在类中覆盖toString()方法。如果没有覆盖toString()方法,默认的字符串是“类名@对象的十六进制哈希码”。

如:Person.java

package java2023_01_05;

public class Person {
	private String name;
	private int age;
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {  // ①
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

上述代码第①行覆盖了toString()方法。

至于返回怎样的字符串完全是自定义的,只要能够表示当前类和当前调用对象即可。

对象比较方法

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

事实上,equals()方法是继承自Object类的,所有对象都可以通过equals()方法比较,问题是比较的规则是什么?

Person.java

package java2023_01_05;

public class Person {
	String name;
	int age;

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

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

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		// 判断比较的参数也是Person类型
		if (obj instanceof Person) {
			Person p = (Person) obj;
			// 年龄作为比较规则
			if (this.age == p.age) {
				return true;
			}
		}
		return false;
	}
}

instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

PerTest.java

package java2023_01_05;

public class PerTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1 = new Person("zs", 10);
		Person p2 = new Person("ls", 10);
		System.out.println(p1 == p2);
		System.out.println(p1.equals(p2));
	}
}

运行结果如下:

Java常用类(重要 · 上篇)_Object

由上面的运行结果可知,因为他们是两个不同的对象,所以使用“==”是false,而使用“equals()”方法比较的结果是true。

包装类

在Java中有8种基本数据类型不属于类,不具备“对象”的特征,没有成员变量和方法,不方便进行对象的操作。为此,Java提供包装类将基本数据类型包装成类,每个Java基本数据类型在java.lang包中都有一个相应的包装类,每个包装类对象封装一个基本数据类型数值。

对应关系如下表所示:

基本数据类型

包装类

基本数据类型

包装类

int

Integer

double

Double

byte

Byte

long

Long

short

Short

float

Float

char

Character

boolean

Boolean

包装类都是final的,不能被继承。

包装类都是不可变类,类似于String类,一旦创建了对象,其内容就不可修改。包装类还可以分为以下三种类型:

数值包装类

  1. 共同的父类

这6个数值包装类有一个共同的父类 ---- Number。

Number是一个抽象类,要求它的子类必须实现如下6种方法:

  • int intValue()
  • double doubleValue()
  • float floatValue()
  • long longValue()
  • short shortValue()
  • byte byteValue()

通过这6种方法,数值包装类可以互相传递这6种数值。

  1. 返回数值包装类对象

每个数值包装类都提供一些静态valueOf()方法返回数值包装类对象。以Integer为例,方法定义如下:

static Integer valueOf(int i)  //将int参数i转换为Integer对象
static Integer valueOf(String s)  //将String参数s转换为Integer对象
  1. 字符串转换为基本数据类型

每个数值包装类都提供一些静态parseXXX()方法实现将字符串转换为对应的基本数据类型。以Integer为例,方法定义如下:

static int parseInt(String s)  //将字符串s转换为有符号的十进制整数
static int parseInt(String s,int radix)  //将字符串s转换为有符号的整数,radix是指定基数,基数用来指定进制。注意:这种指定基数的方法在浮点数包装类中是没有的
  1. 基本数据类型转换为字符串

每个数值包装类都提供一些静态toString()方法实现将基本数据类型转换为字符串。以Integer为例,方法定义如下:

static String toString(int i)  //将该整数i转换为有符号的十进制表示的字符串
static String toString(int i,int radix)  //将该整数i转换为有符号的特定进制表示的字符串,radix使用方法及注意事项与上同理
  1. compareTo()方法

每个数值包装类都有int compareTo(数值包装类对象)方法,可以进行包装对象的比较。方法返回值是int。

如果返回值是0,则相等;

如果返回值小于0(-1),则此对象小于参数对象;

如果返回值大于0(1),则此对象大于参数对象。

示例代码如下:

package java2023_01_05;

public class CompareDemo {

	public static void main(String[] args) {
		// 1.构造方法
		Integer objInteger = Integer.valueOf(80);
		Long objLong = Long.valueOf("80");
		Double objDouble = Double.valueOf(80.0);
		Float objFloat = Float.valueOf("80.0");
		// 2.Number类方法
		long longVar = objInteger.longValue();
		int intVar = objDouble.intValue();
		System.out.println("intVar=" + intVar);
		System.out.println("longVar=" + longVar);
		// 3.compareTo()方法
		Float objFloat2 = Float.valueOf(100);
		int result = objFloat.compareTo(objFloat2);
		System.out.println(result);
		// 4.将字符串转换为基本数据类型
		int intVar2 = Integer.parseInt("100");
		int intVar3 = Integer.parseInt("ABC", 13);
		System.out.println("intVar2=" + intVar2);
		System.out.println("intVar3=" + intVar3);
		// 5.基本数据类型转换为字符串
		String s1 = Integer.toString(100);
		String s2 = Integer.toString(100, 13);
		System.out.println("s1=" + s1);
		System.out.println("s2=" + s2);
	}
}

代码运行结果如下;

Java常用类(重要 · 上篇)_System_02

Character类

Character类是char类型的包装类。

示例代码如下:

package java2023_01_05;

public class CompareDemo {

	public static void main(String[] args) {

		// 创建数值为'A'的Character对象
		Character character = Character.valueOf('A');
		// 从Character对象返回char值
		char ch = character.charValue();
		// 字符比较
		Character character2 = Character.valueOf('C');
		int result = character.compareTo(character2);
		if (result < 0) {
			System.out.println("character小于character2");
		}
	}
}

运行结果如下:

Java常用类(重要 · 上篇)_java_03

Boolean类

Boolean类是boolean类型的包装类。

  1. 返回Boolean对象
  2. 构造方法
  3. compareTo()方法
  4. 字符串转换为boolean类型

自动装箱/拆箱

自动装箱能够自动地将基本数据类型的是指自动转换为包装类对象,而不需要构造方法。

自动拆箱能够将包装类对象自动转换为基本数据类型的数值,而不需要使用intValue()或doubleValue()等方法。

实例代码如下:

package java2023_01_05;

public class BoxClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer objInt = Integer.valueOf(80);
		Double objDouble = Double.valueOf("80.0");
		// 自动拆箱
		double sum = objInt + objDouble;
		// 自动装箱
		// 自动装箱将'C'转换为Character对象
		Character objCharacter = 'C';
		// 自动装箱true转换为Boolean对象
		Boolean objBoolean = true;
		// 自动装箱将'80.0f'转换为Float对象
		Float objFloat = 80.0f;
		// 自动装箱将'100'转换为Integer对象
		DisplayMode(100);

		// 避免出现以下情况
		Integer obj = null;
		int intVar = obj; // 运行异常①
	}

	private static int DisplayMode(int i) {
		// TODO Auto-generated method stub
		System.out.println(i);
		// 自动拆箱将Integer转换为int
		return i;
	}
}
运行结果如下:

Java常用类(重要 · 上篇)_System_04

①行代码运行异常的原因是:拆箱的过程本质上是调用intValue()方法实现的,试图访问空对象的方法和成员变量,就会抛出运行期NullPointerException异常。

2023年已步入最后一个月,年初定的目标都实现了吗?之前的11个月,你都收获了什么?临近年末,好好总结,积蓄力量,等待再次出发。期待新的开始。最后一个月,请加倍珍惜、加倍努力,向着明媚的未来继续出发!