gpt4 book ai didi

java - protected 构造函数和包私有(private)(无修饰符)构造函数之间的区别?

转载 作者:行者123 更新时间:2023-11-30 02:02:30 24 4
gpt4 key购买 nike

Possible Duplicate

那里给出的最佳答案指出 protected 构造函数可以使用 super() 调用,但不能使用 new 实例化?为什么这样?如果这是原因,那么 package-private(无修饰符)和 protected 构造函数之间有什么区别?下面的代码对我来说没有任何区别。

package pack1;

public class Rr {
protected Rr() {
System.out.println("Rello");
}
}

package pack2;

class Tt extends pack1.Rr {
Tt() {
super(); //works
pack1.Rr r = new pack1.Rr(); //error
}
}

class Uu {
public static void main(String args[]) {
Tt t = new Tt();
}
}

最佳答案

可以通过其子类对象访问 protected 方法。

注意,这里的“子类”非常重要,它的意思是“通过子类的方式”,而不是“子类内的任何地方”。

让我们看一个例子。

以下是 2 类:

package one;
public class A {
protected A() {} // protected constructor
public A(int i) {} // public constructor

protected void foo() {} // protected method
}

package two;
import one.A;
public class B extends A {
public void bar() {
this.foo(); // correct

A a = new A(0); // call A's public constructor to construct an A instance.
a.foo(); // compiler error: the method foo from the type A is not visible.
}
}

第一次调用是允许的,但第二次不允许,为什么?

就像我说的,第一个是通过“子类方式”访问,其中this是A的子类实例;然而第二个只是“在子类中”(这里B对A来说没有任何意义,它只是一个普通的类,所以它不能访问A的 protected 方法)。

<小时/>

另一个例子是Object.clone。这是根类Object 的 protected 方法。您可能会说它可以从任何类创建的任何对象访问,但答案是大写“NO”:只有那些使用“子类方式”的代码才能访问它。

下图说明了这一点:

this.clone(); // ok

Object o = new Object();
o.clone(); // compiler error: the method clone from the type Object is not visible.

关于java - protected 构造函数和包私有(private)(无修饰符)构造函数之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362400/

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