接下来我从两方面阐释Java的一个十分特殊的类:
1. 理解object类
2.掌握object类中部分重要方法
Part one: Java中最特殊的类--Object
当你创建一个Java程序时,声明并初始化了一个class,倘若这个类并没有继承什么超类时,Java会告诉你,它实际上已继承了一个默认超类--java.lang.object,就这样,object成为了所有类的隐式超类。Java最初创建这个类的原因就是为了实现对象的一些基本和通用操作。
object类的作用:
1.提供任意类都需要的部分通用功能,作为根类
2.作为所有未继承类的超类,可以引用任何类对象
3.Java中数组是作为类来实现的,所有object类型变量都可以引用任何数组
object 作为超类可以引用任何子类对象,看下面的一个例子:
class Sample{ //sample类,默认继承超类object类
static int num = 10; //定义一个static成员变量
public static void main(String args[])
{
Object obj = new Sample(); //创建一个object对象,通过引用子类对象,向上转型
System.out.print("The number is " + num);
}
}
执行结果:
The number is 10
总结:需要理解的是,object是Java提供的最基本的一个根类,其它任何未继承超类的子类都默认继承object类,从而可以访问object默认的一些成员函数,也可以重写某些成员函数。至于为什么说只是“某些”,那我们就得看看Oracle JDK1.7提供的object class source code吧!
Part two : 掌握object类中部分重要方法
package java.lang;
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass(); //在运行时获取对象的类
public native int hashCode(); //返回与调用对象相关的哈希代码
public boolean equals(Object obj) { //确定两个对象是否相等
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException; //克隆一个新对象
public String toString() { //返回描述对象的字符串
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify(); //继续执行等待调用对象的线程
public final native void notifyAll(); //所以线程
public final native void wait(long timeout) throws InterruptedException;
//等待另一个线程
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { } //在未使用的对象被回收前调用
}
解释一下关键字 native,来自 波波的专栏——Java native 关键字
native关键字用法
native是与C++联合开发的时候用的!java自己开发不用的!
使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。
1.native 是用做java 和其他语言(如c++)进行协作时用的 也就是native 后的函数的实现不是用java写的
2.既然都不是java,那就别管它的源代码了,呵呵
3.native的意思就是通知操作系统, 这个函数你必须给我实现,因为我要使用。 所以native关键字的函数都是操作系统实现的, java只能调用。
4.java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了
几个重要的object方法:
1. 克隆对象
函数原型:
protected native Object clone() throws CloneNotSupportedException; //克隆一个新对象
该函数由操作系统提供实现。下面是一个简单的调用的例子:
在派生类中覆盖基类的clone()方法,并声明为public。
在派生类的clone()方法中,调用super.clone()。
在派生类中实现Cloneable接口。Cloneable接口没有任何抽象的方法,这样的成为标识接口。实现这个接口,只是为了告诉编译器这个对象可以被克隆了。
首先我们在派生类中覆盖了Object类的Clone()方法,并声明为public的。然后我们调用了super.clone()方法,这里会抛出一个异常(对于这个异常大家可以自己查看java的帮助文档),所以必须用try……catch……语句捕获,然后返回此对象。这里需要说明一下,Clone()方法返回的是Object类型的,所以需要强制类型转换
class Sample implements Cloneable{ //实现接口Cloneable
int num = 10;
public Object clone() //重写Clone()
{
Sample sm = null;
try {
sm = (Sample) super.clone(); //克隆对象,不会调用子类的构造函数
}
catch(Exception exc){
exc.printStackTrace();
}
return sm;
}
public static void main(String args[])
{
Sample s = new Sample();
Sample sm = (Sample)s.clone(); //实例化克隆对象
sm.num = 100;
System.out.println("The num of s is "+s.num);
System.out.println("The num of sm is "+sm.num);
}
}
执行结果:
The num of s is 10
The num of sm is 100
2.打印对象信息:
函数原型:
public String toString() { //返回描述对象的字符串
return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
举个例子:
class book implements Cloneable{
String name;
int pages;
book(String nam, int page)
{
name = nam;
pages = page;
}
public String toString() //重写toString()方法
{
return "The name of the book is "+name;
}
public static void main(String args[])
{
book bk = new book("'The old and sea'",158);
System.out.print(bk.toString()); //调用toString()
}
}