初学JAVA,遇到一个protected访问权限的问题,请高人指点一下哈
我写了3个类 A1,A2,A3
分别如下:
public class A1{
    protected void f(){
        System.out.println("A1.f()");
    }
}public class A2 extends A1{}public class A3 extends A1{
    public static void main(String s[]){
        A2 a2 = new A2();
        a2.f();
    }
}
执行java A3的时候,输出A1.f()但是Object类中的一个方法好像与上边有点矛盾 就是clone()方法
我又写了2个类如下:
public class B1 implements Cloneable{}public class B2 implements Cloneable{
    public static void main(String s[]){
        B1 b1 = new B1();
        try{
            B1 b = b1.clone();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
这样在编译A2的时候就已经报clone() has protected access in java.lang.Object 这个错误
我看B1,B2,Object 这三个类的关系 与 A2,A3,A1 三个类的关系类似阿,而且f()与clone()方法也都是protected访问权限,
那么为什么会出现这样不同的结果呢?
书上是说了, clone()方法要在各自的类中重写为public权限,这个我知道。
这个问题主要是在访问权限的角度看的,请哪位高手给我一个解释阿。。

解决方案 »

  1.   

    是不是应为你没有重写clone方法啊
      

  2.   

    2楼的 谢谢回复B类出现那个访问问题确实是应为没有重写clone()方法但是我是想通过这个形式来解决一下一直困扰着我的访问权限的控制问题
      

  3.   

    两种类似的结构,好像出现了两种不同的访问控制方法。。
    难道object是系统定义的根类所以就特殊么?
      

  4.   

    你这两个程序能运行么?.......
    一个程序里只能有一个public的东西啊
    至于访问权限的问题,还在想...
      

  5.   

    重写clone()方法以后就没错了啊
    protected 方法在包内可以随便访问,在包外的时候只能被它的子类访问。
    举个例子:package a;
    class A {
    protected void f(){
    System.out.println("a");
    }
    }package b;
    class B extends A{
    public static void main(String[] args){
    A a = new A();
    a.f();     //error 在包外,不能访问,就算是A的对象也不可以。

    B b = new B();
    b.f();   //ok 。因为B是A的子类
    }
    }
      

  6.   

    或许Object真的比较特殊吧,下面这样写就没有错误:class B1 implements Cloneable{
        public static void main(String s[]){
            B1 b1 = new B1();
            try{
                B1 b = (B1)b1.clone();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    } class B2 implements Cloneable{
    }
      

  7.   

    是的 重写Clone()是没有错了
    但我主要质疑的是访问权限问题
    你没有发现 我写的那2个类体系的结构很类似么?但是访问控制是完全不同的阿
    看看对比关系          A系列:                                                   B系列:
    基础类A1有一个protected的方法f()               跟类是object 有一个protected方法clone()
    A2,A3是A1的子类,他们关系平行                     B1,B2是object的子类,关系平行
    A2没有重写A1的f()方法                             B1没有重写object的 clone()方法
    A2的对象a2                                   B1的对象b1
    A3可以调用 a2.f()                                 B2却不能调用b1.clone()怎么会出现这样的情况
    主要重访问权限角度看
      

  8.   

    楼主,你的A1A2A3是否在同一个包中?Object、B1、B2肯定不在同一个包中
      

  9.   

    up什么啊,我问你A1A2A3是否在同一个包中
      

  10.   

    我这里网络有点卡 没有看到。。
    对 A1 A2 A3是在同一个包中的,但是不是同一个文件而是3个文件
      

  11.   

    刚又试了下,不只是Object,其他类也是一样的。你两个例子中不通的地方是:A1 A2 A3在同一个包中,而Object和B1 B2在不同的两个包中
      

  12.   

    所以喽,你的A1A2A3都在一个包里,你把A1挪到别的包里,这样才跟Object、B1、B2的情况一样,这样试试然后再说Object是不是真的有“特殊待遇”吧