默认访问字段继承

时间:2013-11-29 09:58:16

标签: java inheritance default protected

具有default的类的字段或方法是否存在于子类中,当它们存在于同一个包中时,或者它们是否仍应声明为protected

示例:

package mypackage;

class A{
  int x = 3;
}    

class B extends A{
}

B类是否也是字段x

5 个答案:

答案 0 :(得分:3)

见说明:

enter image description here

希望它能解决问题

<强> [编辑]

从表格中为默认修饰符,例如:

  

只能从声明的包裹中访问它们。

表示如果班级AB保留在同一个套餐中,您可以打印出x

class B extends A{

    public static void main(String[] args) {        
        new B().init();     
    }

    private void init() {
        System.out.println(x);
    }   
} 

但是,如果我们将类B放到不同的包中,则会引发错误:The type mypackage.A is not visible。所以在这里你必须设置public修饰符。

答案 1 :(得分:1)

使用default访问权限时,属性仅对同一包中的类可见。

但是通过protected访问,相同包和子类中的所有类都可以访问它们(无论包是什么)。选择与您相关的内容。

  

B类是否还有一个字段x?

B继承了x

的属性A

答案 2 :(得分:0)

是的,您可以使用继承访问publicdefault(如果类在同一个包中)和protected数据成员:

public class A {
    int a;
}

public class B extends A {

    B() {
        a = 5;
    }

答案 3 :(得分:0)

对于默认子类[如果在同一个包中]有权使用方法/数据成员。

class B extends Class A{
     System.out.println(new B().x); //will surely work in your case(Example shown).
}

答案 4 :(得分:0)

具有默认访问权限的类成员可用于同一包中的所有类。如果类使用默认可见性的let say字段扩展一个,那么如果它在同一个包中,它将有权访问其继承的字段

package original;
public class A{
    int x = 1;
}

package original;
public class B extends A{
    void test(){
        x = 2;// works because B inherited `x` and it is visible here
    }
}

但是如果扩展类是在不同的包中创建的,那么原始的,具有默认访问权限的成员将无法访问。

package other;
class Outsider extends original.A{
    void test(){
        x = 2;// compilation error, x is not visible here
    }
}

如果你想让这个局外人类编译,你需要制作x protected所以它可以被这个类继承。

相关问题