J2SE的学习——Object和instanceof关键字

本文深入探讨Java中的Object类,解析toString和equals方法的重写,以及instanceof关键字的应用,通过实例展示如何改变对象的字符串表示和比较逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Object类

先对Object类进行简单的了解和学习: 学习类知识呢,当然还是应该看JDK文档,先看一下
在这里插入图片描述
也就是说所有的类都是Object类的子类 看一下主要的方法摘要:
在这里插入图片描述这次的学习主要是对这两个方法进行系统性的学习
在这里插入图片描述
在这里插入图片描述

生成构造方法,父类只有Object
在这里插入图片描述
按住Ctrl,用鼠标点击Super,进去到Object类中,查看Object类的所有方法,这里查看所有方法也可以快捷键Ctrl+o进行查看。下图的有变就是Object类的所有方法。
在这里插入图片描述基本上已经了解的差不多了,下面开始对这两个方法进行简单的学习

1、toString方法

在这里插入图片描述
返回的是对象的字符串的表示形式,现在创建一个类进行简单的测试。 代码:

package Page25;

public class People {
	private String name;

	public People(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	public static void main(String[] args) {
		People p1=new People("张三");
		System.out.println(p1.toString());
	}
} 结果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190821192439690.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzOTE4MTMw,size_16,color_FFFFFF,t_70)其实也可以这样写的

在这里插入图片描述
上面的直接对p1的输出的本质就是下面的调动的toString方法。

我们是通过Object类中的toString方法进行输出的,而所有的类都是Object的子类,因此在这里,我可以对toString这个方法进行重写,然后再输出对象的字符串的时候,输出的就是我重写出来的新的字符串。
alt+shirt+s,弹出构造框的选择,我们选择toString方法的构造。
在这里插入图片描述
生成了这样一段代码。
在这里插入图片描述

完整版代码如下:

package Page25;

public class People {
	private String name;

	public People(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	//这里其实就是重写父类的方法
	@Override
	public String toString() {
		return "People [name=" + name + "]";
	}
	
	public static void main(String[] args) {
		People p1=new People("张三");
		System.out.println(p1);
		System.out.println(p1.toString());
	}

	
}

运行结果如下:
在这里插入图片描述这里的输出显然和上面的输出不一样了,我们原本输出的是对象的字符串,但是现在输出的是这个,是因为,我们对Object类中的toString方法进行重写了,并且我们在重写构造方法的时候,继承了这个类的父类,这个类的父类就是Object,因此我们是不需要再在类名的后面extend
Object这个类了,可以直接重写这个父类中的方法,上面看到的就是重写方法之后的效果。

2、equals方法

改一下上面的People类的代码
改动之后的如下:

package Page25;

public class People {
	private String name;

	public People(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	//这里其实就是重写父类的方法
	@Override
	public String toString() {
		return "People [name=" + name + "]";
	}
	
	public static void main(String[] args) {
		People p1=new People("张三");
		People p2=new People("李四");
		System.out.println(p1.equals(p2));
	}

	
}

就是main函数中变了一下。 运行
在这里插入图片描述
点进这个方法看一下:
在这里插入图片描述
这里比较的是引用是否相同,这里的引用可以理解成指针里面学的地址,可以近似这样理解,既然比较的是引用,那么,内容一致的时候也是会false的,注意这里常量池的概念,我们是new的新对象,所以不会引进常量池的知识的。不太理解的可以看一下我对string类的相关学习,我的string类的学习。
在这里插入图片描述

都是false,可以看到我运行的结果,这样的结果是必然的,因为我们比较的是引用,那么,怎么改成比较的是内容呢,毕竟equals的使用,更多的时候是比较内容的,比较引用直接p1==p2就能得到我们要的效果!
在这里插入图片描述

现在就要把它改成比较内容了,方法很简单,就像上面的toString一样的操作,重写方法。
在这里插入图片描述
下面是生成的equals方法
在这里插入图片描述
稍微改一下重写的构造方法,不改是不行的,不改还是用的对引用的比较。
在这里插入图片描述
这里虽然是向下转型,但是这里的People是知道的,因此是安全的,一般情况下别向下转型。
下面是改完之后的运行效果
在这里插入图片描述People的源代码如下:

package Page25;

public class People {
	private String name;

	public People(String name) {
		super();
		this.name = name;
	}

	@Override
	public boolean equals(Object obj) {
		String name = ((People)obj).getName();
		return this.name==name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	//这里其实就是重写父类的方法
	@Override
	public String toString() {
		return "People [name=" + name + "]";
	}
	
	
	public static void main(String[] args) {
		People p1=new People("张三");
		People p2=new People("李四");
		People p3=new People("张三");
		System.out.println(p1.equals(p2));
		System.out.println(p1.equals(p3));
		System.out.println(p1==p2);
		System.out.println(p2==p3);
	}

	
}

2、instanceof关键字

主要作用是判断一个对象是否属于一个类
返回的是boolean类型的值。

1、创建一个父类的对象和两个子类的对象,然后分别用两个子类继承父类,然后在测试类中进行测试。 如下: 动物父类
package page25;

public class Animal {
	public void say() {
		System.out.println("我是一个动物!");
	}
} 子类猫

package page25;

public class Cat extends Animal{
	//重写一下父类的方法
	public void say() {
		System.out.println("我是一只猫!");
	}
}

子类狗 package page25;

public class Dog extends Animal{ //重写一下父类的方法 public void say() {
System.out.println(“我是一只狗!”); } }

测试类

package Page25;

public class Test {
	public static void main(String[] args) {
		Animal dog=new Dog();
		//主要用于向下转型的时候的判断,向下转型是不安全的
		System.out.println("dog是否属于animal类:"+(dog instanceof Animal));
		System.out.println("dog是否属于Dog类:"+(dog instanceof Dog));
		System.out.println("dog是否属于Cat类:"+(dog instanceof Cat));
	}
}

运行效果
在这里插入图片描述

这个类主要用于转型的时候,我写的多态的知识的时候里面有提到,可以去简单的看一下,转型其实和强转是一个道理,向上转,没毛病,向下转,可能出现数据丢失,和你把一碗水倒进一个盆子一样,盆子肯定装的下,但是你把一盆水倒进碗里,那就会出现问题了。
这个是多态学习的:多态学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值