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)); }

  

 

posted @ 2019-09-28 21:57  我今天也很帅  阅读(352)  评论(0)    收藏  举报