1.getClass方法:通过一个对象实例返回一个class,通过这个class可以创建新的对象,多用于反射中
示例如下:
Student student1=new Student();//student实例对象
Class studentClass =student1.getClass();//通过getClass方法获取student类
try {
Object student2=studentClass.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2.tosString方法
tostring方法是为了方便进行输出,该方法返回一个string对象
当使用 System.out.println等类似语句的时候,会自动调用tostring方法打印对象的信息
可以通过方法重载来重写tostring方法来打印类的详细信息
示例如下:
//student类
public class Student {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Student [name=" + name + ", id=" + id + "]";
}
public static void main(String[] args) {
Student student1 = new Student();// student实例对象
student1.setId(111);
student1.setName("Peanut");
System.out.println(student1.toString());
//结果为Student [name=Peanut, id=111]
}
}
//
3.equals
值类型(基本数据类型)比较的是内容是否相同
例如:基本数据类型 int a=5; int b=5; 指的是a和b内容相同
引用类型(除基本数据类型以外的)比较的是两个对象在堆中的引用地址,不同的对象引用地址不同
“==”比较的是两个对象的引用地址是否相同
例如:Student stu1= new Student(); Student stu2= new Student(); 他们在堆中的引用地址是不同的
Object类中equals的默认的实现方式是 : return this == obj,此时equals和==是等价的
但是实际使用中,我们往往使用equals来确认两个对象是否等价(两个对象的内容是否一样),而不是确认他们的唯一性,这时我们往往要重写equals方法。
重写equals需要遵循的原则:
调用equals返回true)对象必须产生相同的散列码,也就必须同时重写hashCode
自反性: x.equals(x) 一定是true
对null: x.equals(null) 一定是false
例如:重写一个student类的equals方法,只要name相等就判定为相等
public class Student {
public String name;
public Student(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) // 1.传入的对象就是它自己,如s.equals(s);肯定是相等的;
return true;
if (obj == null) //2. 如果传入的对象是空,肯定不相等
return false;
if (!(other instanceof Coder) //3. 如果不是同一个类型的,如Studnet类和Animal类,甚至other为null
// 也不用比较了,肯定是不相等的
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (name.equals(other.name)) { // 4.比较自定义的数据域,如果name属性相等,则返回相等
return true;
}
return false;
}
}
4.hashCode方法
对象的散列码是为了更好地支持哈希机制的java集合类,当我们在使用以hash开头的集合类hashcode就会被隐式的调用来创建哈希映射关系。
public int hashCode()方法返回对象的int类型的散列码
重写了equals方法的对象必须同时重写hashCode方法?(假如不重写的话,两个相同对象的hash映射的值就是不同的,那么将对象存入到hash中就会存储到不同的域,查找的时候是基于域来查找的,就会出现找不到的情况)
如果两个对象调用equals方法后后返回的值为true,那么这两个对象也必须返回同样的散列码。
如果两个对象调用equals方法后后返回的值为false,那么这两个对象返回的散列码可以相同。
编写hashCode
、定义一个int类型的变量 hash,初始化为 7。
接下来让你认为重要的字段(equals中衡量相等的字段)参入散列运,算每一个重要字段都会产生一个hash分量,为最终的hash值做出贡献(影响)
定义重要字段的类型 定义他的的hash分量
最后把所有的分量都总和起来,注意并不是简单的相加。选择一个倍乘的数字31,参与计算。然后不断地递归计算,直到所有的字段都参与了。
int hash = 7;
hash = 31 * hash + 字段1贡献分量;
hash = 31 * hash + 字段2贡献分量;
.....
return hash;
中小型应用中,简单的写法:
@Override
public int hashCode() {
int result = 20;
result = result * 31 + name.hashCode();
result = result * 31 + age;
……
return result;
}
native方法部分:native方法的效率一般都远高于java中的非native方法
5.notify、notifyAll,wait方法
他们都是控制线程的状态的方法:
(1)如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
其中wait方法有三个over load方法:
wait()
wait(long)
wait(long,int)
wait方法通过参数可以指定等待的时长。如果没有指定参数,默认一直等待直到被通知。
(2)如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
(3)如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
详细参考:http://longdick.iteye.com/blog/453615
6.Clone:用来另存一个当前存在的对象
函数的参数类型是引用类型(自定义的类时),传递的类型是引用传递,任何时候传递的只是一个对象的引用即指针引用,在任何用=向对象变量赋值的时候都是引用传递,
Clone方法就用在我们要用a2保存a1对象的数据,而又不希望a2数据被改变的时候不会影响到a1
首先实现cloneable接口 implements cloneable
然后重载clone方法
Public object clone(){
}
Clone 是一个native方法 native方法的效率一般都远高于java中的非native方法,所以我们要clone一个对象而不是直接new一个类
JNI java native interface
clone方法返回一个object对象
浅层复制:被复制的对象仅仅复制考虑的对象,而不复制它所引用的对象
深层复制:连他引用的对象也一起被复制,指向新的对象 复制的对象的引用对象都复制一遍
7.fianalize方法
Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
Java中所有类都从Object类中继承finalize()方法。
当垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法。在Java中,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。
那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。