object+(父类引用指向之类对象)方法之间的调用关系
object关键字
clone方法(下方红字)
public class Test {
public static void main(String[] args) {
Dog wangcai = new Dog("旺财");
wangcai.test();
Dog dahuang = new Dog("旺财");
System.out.println(wangcai.equals(dahuang));
Object obj = new Cat();
// 获取该引用指向的对象的类型
System.out.println(obj.getClass());
// 当使用System.out.println 来打印一个对象的时候,就是在打印对象toString()的返回值
System.out.println(wangcai.toString());
System.out.println(wangcai);
}
}
public class Dog implements Cloneable{
private String name;
private int age;
public Dog() {
super();
// TODO Auto-generated constructor stub
}
public Dog(String name) {
super();
this.name = name;
}
public void test() {
try {
Dog d =(Dog) this.clone();
System.out.println(d);
System.out.println(d.name == this.name);(浅表拷贝 成员变量还是原来的成员变量 对象是新创建的对象 但貌似地址不一样????)
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* hashCode 用来辅助判断两个对象是否相等
* 如果两个对象的hashCode不相等 则两个对象肯定不相等,就不用再执行equals方法了
* 如果两个对象的hashCode 相等, 不能判断两个对象是相等的,在去执行equals方法
*
*
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}
*instance of的用法
https://www.cnblogs.com/ysocean/p/8486500.html 详细攻略
boolean result = obj instanceof Class
其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其 接口的实现类,结果result 都返回 true,否则返回false。
注:编译器会检查 obj 是否能转换成右边的class类型
重写object里equals方法
为什么要重写equals方法
对象判断是否i相等==与equals作用一样所以要重写equals
Dog类里

test类里
public static void main(String[] args) { Dog wangcai = new Dog("旺财"); Dog dahuang = new Dog("旺财"); System.out.println(wangcai.equals(dahuang));
hashcode和equals方法
可以source里调用
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
getClass()方法
父类引用指向子类对象
Object obj = new Cat(); =号左边为编译时类型 =号右边为运行时类型 一般类型相等 但也有不同的时候
Object obj = new Cat(); // 获取该引用指向的对象的类型 System.out.println(obj.getClass()); 编译结果为:class override.Cat
toString()方法
当使用System.out.println 来打印一个对象的时候,就是在打印对象toString()的返回值 System.out.println(wangcai.toString()); System.out.println(wangcai); 运行结果一样
快速查看对象的成员值的时候
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}
(有关父类引用指向子类对象)方法重写里方法的调用
方法的调用看引用,方法的执行看对象
父类引用调方法,子类对象执行方法。
父类的引用可以调用子类重写过父类的方法,但是不能调用子类特有的方法。
public class Test {
public static void main(String[] args) {
Object obj = new Student(1001, "stu1", 10);
(在student类里以及重写过obj里的equals方法)
Student stu2 = new Student(1001, "stu1", 10);
System.out.println(obj.equals(stu2));
}
浙公网安备 33010602011771号