枫神之路 -- 探秘 Java object 类

接下来我从两方面阐释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()
			
	}
}

猜你喜欢

转载自blog.csdn.net/qq_38812171/article/details/82082236