为什么不同包中的子类无法访问protected成员。

我是初学者,编写了如下代码,在两个包里面。
第一个包是父类的:
package Study;

public class Parent {

private int i;
int j;
protected int m;
public int n;

}
第二个包是子类的:
package Study.Study;
import Study.*;
class Child3 extends Parent{}

public class Child2 extends Parent{

public static void main(String[] args) {

Child3 x=new Child3();
x.m=1;
Child2 y=new Child2();
y.m=2;

}

y.m=2可以访问
但是为什么 x.m=1就不可以访问

不是说protected在不同的包里面也能访问吗。
y.m和x.m都和原来的父类不在一个包里面,怎么一个可以访问,一个不可以访问。
xietengxiang 说这个是语法规定,

但是x.m和y.m都是在同一包里面的,只是和父类不同包,为什么只有y.m可以访问。。真的是不太懂。。

y.m可以访问是因为main所在的类Child2是Parent的子类,所以可以访问Parent的protected成员,与包无关。

x.m不可访问,是因为x是Child3的实例,main所在的类不是Child3或它的子类,所以不能访问成员m。

这里与同一个包无关,因为m是Parent的成员,而Parent在Study包中,与main所在的Study.Study包不同的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-07-18
x.m=1要想成功运行,需要public权限。而m在Parent类中是protected权限。这种权限虽然允许子类继承,却不允许 外部直接对子类的相关成员直接访问(比如:x.m=1)。
第2个回答  2010-07-18
Child3是默认的私有的类对象。修改成public
第3个回答  2018-06-20

子类可以调用父类的protected成员,前提是在子类自己的内部,

y.m就是在子类的内部调用了子类的成员,

x.m编译失败,是因为它属于别的类,JVM不能判定它是否是子类继承的情况。

补充:

protected可以给子类调用,怎么调用?

直接写父类的protected属性名/成员方法,或者super.属性名/成员方法,

不能用创建对象的方法,比如Fu  fu=new  Fu(); fu.name或者fu.method();因为这样写JVM解析不到是否是子类访问的情况。

public class A {
    protected String name = "父类属性";
    protected void method() {
       System.out.println("父类方法");
    }
}

不同包下的子类调用protected属性和方法:

class B extends A{
    public void show() {
       System.out.println(name);
       method();
       System.out.println(super.name);
       super.method();
    }
}
 
public class Test {
    public static void main(String[] args) {
       new B().show();     
    }
}

第4个回答  2010-07-18
大哥,这个是语法规定的,
就好比“为什么private的成员,别的类就不能访问呢”

为什么不同包中的子类无法访问protected成员。
y.m可以访问是因为main所在的类Child2是Parent的子类,所以可以访问Parent的protected成员,与包无关。x.m不可访问,是因为x是Child3的实例,main所在的类不是Child3或它的子类,所以不能访问成员m。这里与同一个包无关,因为m是Parent的成员,而Parent在Study包中,与main所在的Study.Study包不同的。

为什么子类中不能访问另一个包中父类中的protected方法
这个会出错,是因为你在不同包里访问TestBase声明的printProtected方法,所以不行,你可以在你子类的printProtected通过super来访问父类的方法。

protected可以被其他包中的所有子类访问吗?
就是说,如果你把类中的成员设为protected 那么它的所有子类都可以访问的到,不管是不是在同一个包中。

JAVA访问控制符问题--父类子类不在同一个包内的Protected问题...
protected的意思是本包可以访问..子类可以继承..某类的protected 方法和属性在包外是不能通过该类对象进行访问的(你能在包外访问一个类的默认权限的方法和属性吗?当然不能),这就是为什么在某对象所在的包的以外的任何地方,你不可以通过该类的对象引用来调用它的protected 方法和属性,哪怕是在该...

java中的protected的意思是本包中以及外包中的子类可访问 那为什么我这 ...
method方法没有加权限修饰,那么用的是默认的,默认的权限只在同一包下可以调用,Fu和Zi这两个类不在同一个包下,所以在测试调用不到。在method方法前加一个protected就可以了

protected属性的作用域仅限于当前类和其子类吗?
在面向对象编程中,protected是一种访问修饰符,它用于管理类和其成员(包括变量和方法)的可见性和访问权限。其作用域一般限于当前类和其子类,这意味着protected成员可以在其所在的类的内部被访问,同时也可以在子类中访问。让我们通过一个例子来说明这个概念。假设我们有一个名为“Animal”的基类,它有...

求大佬指点一下,java protected方法问题。
1、protected修饰的方法,能被同包的其他类访问,这时一般通过创建实例来调用 2、protected修饰的方法,只能被不同包的子类访问,这时在子类中直接调用,而不能通过创建父类实例来调用。即子类与父类不同包时,子类从父类继承而来的protected方法只能在本类中使用。换句话说,子类与父类不同包时,其他...

java 下面protected类型变量怎么不能访问呢?
protected不是子类和同包公开吗?这句话正确 二者的关系是or 那上面的结果为什么会感到很疑惑呢? 原因:在ClassB中你调用 ClassA a = new ClassA(); a.var2=3;注意:你调用的还是ClassA的保护属性,相当于一个类中调用另外一个包中类的protected成员变量,这当然是不可行的。因为你弄混了继...

protected成员能否对同一个包中对非子类可见
protected的成员可以被该类的成员以及其子类的成员访问,他还可以被同一个包下的其他类的成员访问。前提是你定义类时修饰符是 protected class a{} 还有一种默认的情况,定义类时不加protected修饰符,如class a{} 这种情况,只有类本身和同一个包下的类里可以访问。无论哪种情况protected 都可以被...

请问Java中父类的protected方法能不能被子类访问
public:所有的位置都可以访问 protected:只有在继承的时候可以访问。而不管你是不是在同一个包里面 什么都不写:只有在同一个包里面才能访问 private:只有在类内部才能访问

相似回答