Object
Object类是Java种所有类直接或间接的父类。
clone()方法
克隆对象的方法
protected native Object clone() throws CloneNotSupportedException;
- clone方法用protected修饰,本包内可用 包外有继承关系的子类中也可用
- .调用的地方同样需要抛出异常
- .要被克隆的类型必须实现Cloneable接口
//java.lang.Object
public class TestClone extends Object{
public static void main(String[] args)throws Exception{
Teacher t1 = new Teacher("Jay");
Teacher t2 = t1.clone();
t1.name = "Gay";
System.out.println(t2.name); //Jay
Student s1 = new Student("Bob");
Student s2 = s1.clone();
//抛出异常,java.lang.CloneNotSupportedException: Student,因为Student类没有实现Cloneable接口
System.out.println(s2.name);
}
}
class Student{
String name;
public Student(String name){
this.name = name;
}
@Override
public Student clone()throws CloneNotSupportedException{
Object obj = super.clone();
return (Student)obj;
}
}
class Teacher extends Object implements Cloneable{
String name;
public Teacher(String name){
this.name = name;
}
@Override
public Teacher clone()throws CloneNotSupportedException{
Object obj = super.clone();
return (Teacher)obj;
}
}
finalize()方法
对象“遗言”的方法,
protected void finalize() throws Throwable {
}
-
gc在回收一个对象之前 会去调用的方法
-
如何主动的召唤gc
- System.gc();
- Runtime.getRuntime().gc();
-
如果在第n行主动调用了gc,gc不能保证立刻出现且回收内存
public class TestFinalize{
public static void main(final String[] args) {
while (true) {
final Teacher tea = new Teacher("Jay");
// Runtime.getRuntime().gc();
System.gc();// 主动召唤垃圾回收器 gc
}
}
}
class Teacher {
String name;
public Teacher(final String name) {
this.name = name;
System.out.println("一个老师站起来~");
}
@Override
public void finalize(){
System.out.println("一个老师倒下去~");
}
}
toString()方法
将一个对象体现成字符串形式
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
equals()方法
定义一个类型的比较规则
public boolean equals(Object obj) {
return (this == obj);
}
举例
public class TestEquals{
public static void main(String[] args){
/*
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));
*/
Cacti cc = new Cacti();
String str1 = new String("ETOAK");
String str2 = null;
System.out.println(str1.equals(cc));
Student s1 = new Student("Jay");
Student s2 = null;
System.out.println(s1.equals(cc));//?
}
}
class Cacti{}//仙人球
class Student{
String name;
public Student(String name){
this.name = name;
}
@Override
public String toString(){
return name;
}
@Override
public boolean equals(Object obj){
//将自己的需求学会通过覆盖这个方法描述出来
//让equals更加健壮 防止参数为null
if(obj == null) return false;
//让equals更加健壮 防止参数类型错误
if(!(obj instanceof Student)) return false;
//让equals更加高效 不做无用的比较
if(obj == this) return true;
//1st.找到参与比较的两个对象v
Student s1 = this;//调用方法的那个学生
Student s2 = (Student)obj;//作为参数传入的那个学生
return s1.name.equals(s2.name);
}
}
class Teacher{
String name;
public Teacher(String name){
this.name = name;
}
@Override
public String toString(){
return name;
}
@Override
public boolean equals(Object obj){
if(obj == null) return false;
if(!(obj instanceof Teacher)) return false;
if(obj == this) return true;
Teacher t1 = this;
Teacher t2 = (Teacher)obj;
return t1.name.equals(t2.name);
}
}
hashCode()方法
定义一个对象的散列码(哈希码)
public native int hashCode();
举例
//哈希表
/*
哈希表又名散列表 = 将一大组数据分散排列成若干小组
46 27 79 34 99 87 53 19 x
s1 s2 s3 s4 s5 s6 s7 s8
[0]
[1] 53
[2] 34 46
[3] 19 99 79 27
*/
public class TestHashCode{
public static void main(String[] args){
}
}
class Student{
String name;
int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString(){
return name + " : " + age;
}
@Override
public boolean equals(Object obj){
if(obj == null) return false;
if(!(obj instanceof Student)) return false;
if(obj == this) return true;
Student s1 = this;
Student s2 = (Student)obj;
return s1.name.equals(s2.name) && s1.age == s2.age;
}
//equals方法返回true的两个对象 哈希码应当生成相同的整数
@Override
public int hashCode(){
return name.hashCode() + age;
}
}