protected 是怎么一回事?
class A {
protected void show() {
System.out.println("aaaaaaaaaaaaa");
}
}public class B extends A{

public static void main(String[] args) throws Exception {
B b = new B();
b.show(); //可以访问。
}
}
那么为什么Object类的protected Object clone()方法,子类访问不了了呢?
protected藏了个什么秘密啊?
我试着想看一下Object的原形,发现有问题。
下面Object是一个类,而不是抽象类。
那么“public native int hashCode();”怎么解释啊?怎么这么矛盾?
下面有好多的方法没有方法体。
public class Object {    private static native void registerNatives();
    static {
        registerNatives();
    }    public final native Class<? extends Object> 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 { }
}

解决方案 »

  1.   

    native是本地方法
    protected方法子类可以访问
      

  2.   

    protected方法子类可以访问 and all the other classes in the same package
      

  3.   

    那为什么子类不能访问Object类的protected Object clone()方法?
      

  4.   

    ,子类可以访问clone方法啊。。
    package test;public class TestObject implements Cloneable {
    int i = 123; /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    TestObject t = new TestObject();
    try {
    Class c = t.clone().getClass();
    System.out.println(c);
    } catch (Exception e) {
    e.printStackTrace();
    } }}
      

  5.   

    对不起,你还不了解我要说什么?
    上面的问题:那为什么子类不能访问Object类的protected Object clone()方法?
    好象并没有人回答啊?
    实现了 implements Cloneable  当然能调用了!
    我问的是一个奇怪的语法问题。
    每个类多继承了Object,不加接口,按语法理解是可以调用了啊?
      

  6.   

    The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown.
    The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.
    JDK1.4doc中的说明
      

  7.   

    protected Object clone()
                    throws CloneNotSupportedException创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。一般来说,对于任何对象 x,如果表达式: 
    x.clone() != x是正确的,则表达式: 
    x.clone().getClass() == x.getClass()将为 true,但这些不是绝对条件。一般情况下是: 
    x.clone().equals(x)将为 true,但这不是绝对条件。 
    按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。 按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。 Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。 Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
      

  8.   

    楼上的说的很清楚了,继承Object的类是可以调用clone方法的,你自己试一下就知道了,不过会抛出CloneNotSupportedException错误,而Cloneable接口里面并没有clone方法
      

  9.   

    protected方法子类是可以访问的,也局限在类里面访问
    如果到类那去访问这个方法也是访问不到的
    因为你调用这个方法在B类里面,不信你可以在另外一个包里面新建一个C类,在里面构造一个B类对象,再调用它的方法试试看,就不行了
      

  10.   

    gojofg2006() 非常感谢!!!
    lbfhappy(千里冰封) 理解我要说什么。谢谢。知道了,我犯了逻辑错误!!!非常开心。
    上面问题可以结束了。由此也产生了另一个
    :类库中的方法怎么没有实现的方法体,就像C++一样的声明一样,反而我们倒是能访问。
    如果我们写一个没有方法体的类来,是编译不了的,类库中的就可以。
      

  11.   

    不是abstract class 和 interface ,是class。
    在一楼的下面不是有一个例子吗?
    public class Object {...}
    稍微看一下,里面有很多个没有方法体。
      

  12.   

    唉,没查到,不明白native是干嘛的,貌似是jni?
    @_@