Java访问级别修饰符

访问级别修饰符决定其他类是否可以访问该类的某个字段或某个方法。

有两种访问控制种类;

1.Top Level(针对类的修饰)

包括public和package-private(不明确指定修饰符,什么都不写,即默认情况)两种修饰符;

2.Member Level(针对成员的修饰)

包括public,private,protect,package-private四种修饰符。

 

对于类的访问控制,public表示被修饰的类对任何地方的类都可见。如果不写访问修饰符,即package-private情况,被修饰类只对该类所属包的类可见。

对于成员的访问控制,public和package-private的定义和类的访问控制完全一样,成员新增了两个访问修饰符分别是private和protect,private表示该成员只能被所属的类访问,protect包括了package-private的可见性,多出了对该类子类的可见性,子类可以在该类的同一个包,也可以在其他包。

JAVA的访问控制看上去还是很简单,但有一点我觉得有点迷惑,就是如果一个类的访问修饰符为package-private(不明确指定修饰符),那么该类的成员比如一个方法的修饰符定义为public有什么意义?因为该类在别的包都不能访问了,那该类的方法肯定也就无法调用了。但是这样定义程序并不报错,因此肯定有其存在的道理。在网上搜索了一下类似的疑问,发现了一个很好例子可以解释这个疑问。

代码
package test;   
public abstract class Test {   
    
public abstract void test();   
    
public static Test getInstance(){   
        
return new SubTest();   
    }   
}   
class SubTest extends Test{   
    @Override  
    
public void test() {   
        System.
out.println("SubTest's test()");   
    }   
}   
测试用代码:   
import test.Test;   
public class Main {   
    
public static void main(String[] args) {   
        Test t 
= Test.getInstance();   
        t.test();   
    }   
}  

 

 这是现在我知道的唯一一种可以让package-private修饰的类的public或protect方法可以被其他包访问的方法,我想这样写是因为可以间接实现让一个子类重写的方法的访问级别较父类的方法降低,因为重写方法降低访问级别是不允许的。这样假设继承或实现了一个public方法,但是可以让其他包无法得知他的方法,除非通过其父类来访问。算是增加了访问控制的灵活性。

 

posted @ 2010-03-17 07:33  .NET JAVA园  阅读(4477)  评论(1编辑  收藏  举报