初学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权限,这个我知道。
这个问题主要是在访问权限的角度看的,请哪位高手给我一个解释阿。。
我写了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权限,这个我知道。
这个问题主要是在访问权限的角度看的,请哪位高手给我一个解释阿。。
难道object是系统定义的根类所以就特殊么?
一个程序里只能有一个public的东西啊
至于访问权限的问题,还在想...
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的子类
}
}
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{
}
但我主要质疑的是访问权限问题
你没有发现 我写的那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()怎么会出现这样的情况
主要重访问权限角度看
对 A1 A2 A3是在同一个包中的,但是不是同一个文件而是3个文件