java--成员的访问控制符

java中有四种不同权限的访问控制符(算上默认这一种),从下面的表格中能更清晰地看出四种访问控制符的权限范围

 同一个类中同一个包中不同包中的子类不同包中的非子类
privateyes   
默认yesyes  
protectedyesyesyes 
publicyesyesyesyes

 

下面分别讲述四种控制符

1.private

一个类的不同对象可以访问对方的private成员变量或调用对方的private方法

例如,在以下程序中,三种对字段a的访问都是可以的

class TestPrivate{
    private int a;
    void m(){
        int i = a;
        int j = this.a;
        int k = new TestPrivate().a;
    }
}

 由于private域或方法只能被这个类本身所访问,所以private域或方法不可能被子类所继承。当我们说“子类自动继承所有域和方法”时,是指非private的域或方法。

2.默认

顾名思义,类中的成员默认访问控制符时,称为默认访问控制。

3.protected

它的声明如下:

protected protectedVar;
protected protectedMethod([paramlist]){
    ....
}

经常需要允许子类访问定义在父类中的数据域或方法,但不允许位于不同包中的非子类的类访问这些数据域和方法,可以使用protected访问这些数据域和方法。

 

4.public

类中限定为public的成员可以被所有的类访问。

应用举例

public class Original{
    int n_friendly = 1;
    private int n_private = 2;
    protected  int n_protected = 3;
    public int n_public = 4;
    void Access(){
        System.out.println("***In same class,you can access***");
        System.out.println("friendly member" + n_friendly);
        System.out.println("private member" + n_private);
        System.out.println("protected member" + n_protected);
        System.out.println("public member" + n_public);
    }
}

class Derived extends Original{
    void Access(){
        System.out.println("***相同包的子类***");
        System.out.println("friendly member" + n_friendly);
        System.out.println("private member" + n_private);
        System.out.println("protected member" + n_protected);
        System.out.println("public member" + n_public);

        Original o = new Original();
        System.out.println("***相同包子类的其他对象***");
        System.out.println("friendly member" + n_friendly);
        System.out.println("private member" + n_private);
        System.out.println("protected member" + n_protected);
        System.out.println("public member" + n_public);
    }
}

class SamePackageClass{
    void Access(){
        Original o = new Original();
        System.out.println("***相同包其他类***");
        System.out.println("friendly member" + o.n_friendly);
        System.out.println("protected member" + o.n_protected);
        System.out.println("public member" + o.n_public);
    }
}

class AccessControl{
    public static void main(String[] args) {
        Original o = new Original();
        o.Access();  //输出1,2,3,4;   1,3,4
        Derived d = new Derived();
        d.Access();  //输出1,3,4
        SamePackageClass s = new SamePackageClass();
        s.Access();  //同样输出1,3,4
    }
}
/***除了访问相同包的子类时,其他情况private均不能访问***/

使用private修饰符可以完全隐藏该类的成员,这样,就不能从类外直接访问它们。不使用修饰符(default)就表示允许同一个包里的任何类直接访问该类的成员,但其他包中的类不可以访问。使用protected修饰符允许位于任何包中的子类同一包中的类访问该类成员。使用public修饰符一些任意类访问该类成员。

 

注意:子类可以重写其父类的protected方法,并把它的可见性改为public。但是,子类不能削弱父类中定义的方法的可访问性。例如:如果一个方法在父类中定义为public,在子类中与必须定义为public。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值