Discuss / Java / 是我记错了?

是我记错了?

Topic source

🌙

#1 Created at ... [Delete] [Delete and Lock User]

protected 跨包 子类 居然 也不可以访问了

🌙

#2 Created at ... [Delete] [Delete and Lock User]

某类的protected 方法和属性在包外是不能通过该类对象进行访问的

该类对象,该类对象,该类对象

🌙

#3 Created at ... [Delete] [Delete and Lock User]

这个现象就很有趣,自己不能访问,儿子却能访问

🌙

#4 Created at ... [Delete] [Delete and Lock User]

一百度问题变得复杂起来,先丢个链接

为什么子类中不能访问另一个包中父类中的protected方法?_Yang Special的博客-CSDN博客_protected不同包的子类能不能访问父类

真的老了,精力跟不上了,被之前的包消耗完了,现在看东西都是囫囵吞枣,效率极低,估计今天看了明天就忘了,有什么方法能恢复精力么?

重命名

#5 Created at ... [Delete] [Delete and Lock User]

你需要盒六味地黄丸。

Joker.fu_95

#6 Created at ... [Delete] [Delete and Lock User]

“某类的protected 方法和属性在包外是不能通过该类对象进行访问的”

自己不看清定义不要带偏别人,都说protected修饰符只限定同类、同包或不同包子类才有访问权,你既然在不同包下访问自然只能在通过子类去访问了

🌙

#7 Created at ... [Delete] [Delete and Lock User]

谢谢 5 楼,吃了3味地黄丸 大概能看懂1/5了

请原谅我之前的回答并没有准确理解你的问题。你提到的问题是当一个类的方法和属性被声明为 `protected` 时,为什么该类在跨包访问时无法通过该类对象进行访问,但子类可以访问。

这个行为是由访问修饰符的设计决定的。`protected` 访问修饰符的作用是将成员(方法和属性)对包外是隐藏的,但允许通过继承关系给子类使用。在这种场景下,如果能够通过该类对象直接访问 `protected` 方法和属性,有可能违背了对封装性的原则,因为这样做会在很大程度上暴露类的实现细节。

让我们来看一个例子来说明这个设计决策的原因。假设有一个类 `A`,它有一个 `protected` 方法和一个 `protected` 属性 `x`。另外还有一个类 `B`,是 `A` 的子类。如果在包外可以通过 `A` 的对象直接访问 `protected` 方法和属性,例如 `A a = new A(); a.protectedMethod();` 或者 `a.x;`,那么包外的代码就可以绕过 `B` 这个子类来访问 `A` 中的 `protected` 成员,这样就打破了继承和封装的规则。

因此,Java 的设计者选择了限制通过类对象访问 `protected` 成员的方式,以保护继承关系的完整性和类的封装性。子类可以访问父类的 `protected` 成员,是因为子类是父类的一种特殊情况,其内部实现的继承关系允许了这种访问。这种设计旨在在继承和封装之间取得一个平衡。

□▼□

#9 Created at ... [Delete] [Delete and Lock User]

现在类似这样的情况:这是父类

// 在package1包中
package package1;

public class Parent {
    protected int protectedVar = 1;
}

这是不同包子类:

// 在package2包中
package package2;

import package1.Parent;

public class Child2 extends Parent {
}

那么就会这样:

// 在package1包中
package package1;

public class Child1 extends Parent {
    public void accessTest() {
        Parent p = new Parent();
        System.out.println(p.protectedVar); // 这是合法的

        Child1 c1 = new Child1();
        System.out.println(c1.protectedVar); // 这也是合法的

        Child2 c2 = new Child2();
        System.out.println(c2.protectedVar); // 这是非法的,即使Child2也是Parent的子类
    }
}

  • 1

Reply