受保护方法的访问修饰符

时间:2014-11-02 19:08:36

标签: java modifier

对于受保护的访问修饰符,与其关联的方法或属性应对其子类可见。这是根据定义。

但有一件事我在这里无法解释。例如,我们有以下代码: 基类:

package com.set.test;

public class ModifierBase {
    private int privateInt;
    int friendlyInt;
    protected int protectedInt;
    public int publicInt;

    private void displayPrivate(){
        System.out.println("displayPrivate");
    }
    void displayFriendly(){
        System.out.println("displayFriendly");
    }
    protected void displaoyProtected(){
        System.out.println("displaoyProtected");
    }
    public void displayPublic(){
        System.out.println("displayPublic");
    }
}

一个类将这个扩展到另一个包中。

package com.another;

import com.set.test.ModifierBase;
public class ModifierSubPackgeExtend extends ModifierBase{
    public static void main(String[] args) {
        ModifierSubPackgeExtend m = new ModifierSubPackgeExtend();
        ModifierBase mb = new ModifierSubPackgeExtend();
    }
}

m可以访问受保护和公共,这很酷。 但是,mb无法访问受保护的方法或变量。

mb.protectedInt //is not accessable
m.protectedInt //is accessible

为什么?

但对于有着同样榜样的友好:

package com.set.test;
public class ModifierExtend extends ModifierBase {
    public static void main(String[] args) {
        ModifierExtend m = new ModifierExtend();
        ModifierBase mb = new ModifierExtend();
    }
}

m和mb都可以访问友方修饰符。

m.friendlyInt
mb.friendlyInt

他们都很好。

为什么在使用基类声明并使用子类进行初始化时,对protected和declare的访问权限和对子类的初始化有不同的访问权限?

2 个答案:

答案 0 :(得分:0)

受保护的类,函数等对于当前的类,包和子包是可见的。在类的子类中也可见。

公共变量 - 对所有类都可见。

受保护的变量 - 仅对它们所属的这些类和任何子类可见。

友好变量,默认值 - 不需要修饰符,包可见。

私有变量 - 仅对其所属的类可见。

有关详情,请阅读本文档:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

答案 1 :(得分:0)

受保护的成员变量在超类中声明,但不能从同一实例访问。

在这种情况下,它将无法访问,受保护的非静态变量只有在涉及同一实例时才能从子类访问。