Object类
定义
Object: 是java中所有类共同的父类【内置或者自定义】,任何一个类的对象都可以使用Object类中的功能
object类中的成员方法
Object类中的成员方法:
public int hashCode() 可以看作是一个对象的地址值的另外一种体现,不同的对象可能是一样
public final Class getClass() 获取当前对象对应类的Class对象
public String toString() 将一个对象以指定的字符串格式输出, 默认情况下也可以看作是一个地址值的表现形式
java中直接输出对象名,默认调用的就是toString()方法
我们正常情况下,直接输出对象名,是想观察对象中的成员变量值的情况,重写toString()方法
两个对象的比较方式: ==
如果==两边是一个基本数据类型的变量,比较的是具体的数值大小
如果==两边是引用数据类型的变量,比较的是对象的地址值
例子
class Student1{
String name;
int age;
@Override
public String toString() {
return "Student1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class ObjectDemo1 {
public static void main(String[] args) {
Student1 s1 = new Student1();
s1.name = "张三";
s1.age = 18;
System.out.println("姓名:" + s1.name + ", 年龄:" + s1.age);
System.out.println("-----------------------------------");
Student1 s2 = new Student1();
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s1==s2);
System.out.println("-----------------------------------");
System.out.println(s1.getClass().getName());
System.out.println("-----------------------------------");
System.out.println(s1.toString()); // shujia.day07.ketang.Student1@4554617c
System.out.println(s1); // shujia.day07.ketang.Student1@4554617c
}
}
Object中的方法
一个标准类4.0版本:
成员变量:使用private关键字修饰
构造方法:提供一个无参和一个所有参数
成员方法:getXxx()和setXxx(),以及toString()
例子
class Teacher{
private String name;
private int age;
public Teacher() {
}
public Teacher(String name, int age) {
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 "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class ObjectDemo2 {
public static void main(String[] args) {
Teacher t1 = new Teacher("小虎", 18);
System.out.println(t1);
}
}
Object类中的成员方法:
public boolean equals(Object obj) Object类中的equals方法底层是使用==比较的,比较的是地址值
如果要比较内容值的话,需要在对象的类中重写该方法
protected void finalize() 做垃圾回收的
protected Object clone() 浅拷贝
Cloneable接口中什么方法都没有,像这样的接口称之为标记接口
mport java.util.Objects;
class Demo {
int a = 10;
}
class Student2 implements Cloneable {
String name;
int age;
Demo demo;
public Student2() {
}
public Student2(String name, int age, Demo demo) {
this.name = name;
this.age = age;
this.demo = demo;
}
public Student2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Student2 student2 = (Student2) o;
return age == student2.age && Objects.equals(name, student2.name);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ObjectDemo3 {
public static void main(String[] args) throws Exception {
Student2 s1 = new Student2("张成阳", 18, new Demo());
// Student2 s2 = new Student2("张成阳", 18);
//
// System.out.println(s1.equals(s2)); // s1和s2都是分别new出来的,地址值肯定不一样
// 从比较地址值变成比较成员变量值
System.out.println("-----------------------------------");
Object o1 = s1.clone();
System.out.println("o1: " + o1);
System.out.println("s1: " + s1);
System.out.println(s1 == o1);
Student2 s2 = (Student2) o1;
System.out.println(s1.demo == s2.demo);
}
}
Object中的clone方法
1.作用:复制一个属性值一样的新对象
2.使用:
需要被克隆的对象实现Cloneable
重写clone方法
public class Person implements Cloneable{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
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 +
'}';
}
/*
问题1:obj直接调用name和age调用不了,因为Object接收了Person类型的对象
属于多态,多态前提下不能直接调用子类特有内容
解决问题1:向下转型
问题2:如果传递的不是Person类型,就会出现类型转换异常
解决问题2:先判断类型,如果是Person类型,再强转成Person
问题3:如果传递null呢?,就不用判断类型了,直接给false
问题4:如果传递自己呢?就不用判断非空了,也不同判断类型了,直接给true
*/
/* public boolean equals(Object obj){
if (this==obj){
return true;
}
if (obj==null){
return false;
}
if (obj instanceof Person){
Person p = (Person) obj;
return this.name.equals(p.name)&&this.age==p.age;
}
return false;
}*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test03 {
public static void main(String[] args) throws CloneNotSupportedException {
Person p2 = new Person("涛哥", 16);
Object o = p2.clone();
Person p3 = (Person) o;//克隆了一个新对象
System.out.println(p2==p3);//比较地址值 false
System.out.println(p2.equals(p3));//true
}
}
标签:return,String,age,Object,public,name
From: https://www.cnblogs.com/03270925yhd/p/18680332