gpt4 book ai didi

java - 使用子类引用访问包外部的 protected 成员

转载 作者:行者123 更新时间:2023-12-01 19:53:29 27 4
gpt4 key购买 nike

package pack1;
class A{
protected void m1(){
System.out.println("protected modifier");
}
}

package pack2;
class B extends A{
public static void main(string[]args){
B b = new B();//Valid
b.m1();

A a = new B();//Invalid
a.m2();

A a1 = new A();//InValid
a1.m1();

}
}

为什么在访问包外部的 protected 成员时我们只需要子类引用。?

为什么我们不能使用父引用来访问 protected 成员(这里 A a = new B())?

我浏览了博客和许多堆栈溢出答案,但没有找到任何答案为什么?。

那么有人可以帮助我知道为什么的答案吗?

最佳答案

您不被允许访问A,因为您仍然外部子类或包。 main 方法是静态,因此与 B 类的实例解除绑定(bind)。为了访问 A,您需要位于 B 类的内部,因此在非静态上下文中,例如

public class B extends A {
public void foo() {
m1(); // Valid call since inside subclass
}
}

我认为您误解了 static 的含义。

<小时/>

protected 的详细信息在Java 语言规范中描述。摘自JLS§6.6.2 :

A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.

Let C be the class in which a protected member is declared. Access is permitted only within the body of a subclass S of C.

该限制甚至超出了您的示例。关键是“负责实现”。将其与以下示例进行比较:

package a;

public class Point {
protected int x;
protected int y;
}
package b;

import a.Point;

public class Point3D extends Point {
public void delta(Point other) {
other.x += this.x; // Compile-time error: Cannot access other.x
other.y += this.y; // Compile-time error: Cannot access other.y
}
}

虽然Point3D类是Point的子类,但它不负责other对象的实现。因此,不允许访问其 protected 成员。

同样

public class B extends A {
public void foo() {
A other = new A();
other.m1(); // Compile-time error
}
}

因为 foo() 方法调用所属的当前实例不负责 other 的实现。因此,不允许访问。

关于java - 使用子类引用访问包外部的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50433958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com