在匿名 class 外部包中访问 class 的成员函数
accessing members function of class in anonymous class out side package
我在一个包中有一个 class 和数据成员。现在在另一个包中写class的匿名class。
package a;
public class A{
String data;
void print(){
System.out.print(data);
}
}
在另一个包中现在制作 A.
的匿名 class
package B;
import a;
class B{
public void static main(String[] args){
A anoy = new A(){
void print(){
// overriding print
System.out.print(data + " overrided");
}
}
}
}
现在我得到一个错误 data is not public in class A. 如何在写入匿名 class 时访问数据而不将数据的访问说明符更改为 public.
在您的代码中,您没有覆盖该函数。覆盖正确的语法是
package B;
import a;
class B{
public static void main(String[] args){
A anoy = new A(){
@Override // Now compiler will complain since print method is not visible.
void print(){
// overriding print
System.out.print(data + " overrided");
}
}
}
}
当您在下面编写代码时,匿名 class 正在创建一个新方法。因此它没有抱怨。
void print(){
// overriding print
System.out.print(data + " overrided");
}
您需要了解 Class.
的成员访问控制机制
访问级别修饰符确定其他 classes 是否可以使用特定字段或调用特定方法。有两个级别的访问控制:
At the top level—public, or package-private (no explicit modifier).
At the member level—public, private, protected, or package-private (no explicit modifier).
A class 可以用修饰符 public 声明,在这种情况下 class 对任何地方的所有 class 都是可见的。如果 class 没有修饰符(默认,也称为 package-private),它仅在其自己的包内可见(包被命名为相关 class 的组——您将在稍后上课。)
在成员级别,您还可以使用 public 修饰符或不使用修饰符(package-private),就像顶级 classes 一样,并且相同的含义。对于成员,有两个额外的访问修饰符:private 和 protected。 private 修饰符指定该成员只能在它自己的 class 中访问。 protected 修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,它的 class 在另一个包中的 subclass 也可以访问。
以下table显示了每个修饰符允许的成员访问权限。
第一个数据列表示class本身是否可以访问访问级别定义的成员。如您所见,class 始终可以访问其自己的成员。第二列表示与 class 在同一个包中的 classes(不管他们的出身)是否可以访问该成员。第三列表示在此包外声明的 class 的子 class 是否可以访问该成员。第四列表示是否所有 classes 都可以访问该成员。
访问级别以两种方式影响您。首先,当您使用来自其他来源的 classes 时,例如 Java 平台中的 classes,访问级别决定了这些 classes 中哪些成员是您自己的classes可以用。其次,当你写一个 class 时,你需要决定你的 class 中的每个成员变量和每个方法应该具有什么访问级别。
您可以进一步阅读:
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
在你的例子中,你在包 private.Hence 中的变量无法在不同的包中访问。希望这有帮助!
当我们 declare/create 在 java 中匿名 class 时。它是一个新的未知数(因为编译器给出了名称)class 扩展了您重新定义的 class(在我们的例子中是 class A)。指定的访问修饰符是 default / package-private 。这里继承存在,子class不能访问父的私有成员。因此它不可访问。
在简单的重写打印函数中,将出现在新的 class 中,而字符串数据成员将出现在其父 class 中。
要访问它应该转换为 protected
我在一个包中有一个 class 和数据成员。现在在另一个包中写class的匿名class。
package a;
public class A{
String data;
void print(){
System.out.print(data);
}
}
在另一个包中现在制作 A.
的匿名 class package B;
import a;
class B{
public void static main(String[] args){
A anoy = new A(){
void print(){
// overriding print
System.out.print(data + " overrided");
}
}
}
}
现在我得到一个错误 data is not public in class A. 如何在写入匿名 class 时访问数据而不将数据的访问说明符更改为 public.
在您的代码中,您没有覆盖该函数。覆盖正确的语法是
package B;
import a;
class B{
public static void main(String[] args){
A anoy = new A(){
@Override // Now compiler will complain since print method is not visible.
void print(){
// overriding print
System.out.print(data + " overrided");
}
}
}
}
当您在下面编写代码时,匿名 class 正在创建一个新方法。因此它没有抱怨。
void print(){
// overriding print
System.out.print(data + " overrided");
}
您需要了解 Class.
的成员访问控制机制访问级别修饰符确定其他 classes 是否可以使用特定字段或调用特定方法。有两个级别的访问控制:
At the top level—public, or package-private (no explicit modifier).
At the member level—public, private, protected, or package-private (no explicit modifier).
A class 可以用修饰符 public 声明,在这种情况下 class 对任何地方的所有 class 都是可见的。如果 class 没有修饰符(默认,也称为 package-private),它仅在其自己的包内可见(包被命名为相关 class 的组——您将在稍后上课。)
在成员级别,您还可以使用 public 修饰符或不使用修饰符(package-private),就像顶级 classes 一样,并且相同的含义。对于成员,有两个额外的访问修饰符:private 和 protected。 private 修饰符指定该成员只能在它自己的 class 中访问。 protected 修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,它的 class 在另一个包中的 subclass 也可以访问。
以下table显示了每个修饰符允许的成员访问权限。
第一个数据列表示class本身是否可以访问访问级别定义的成员。如您所见,class 始终可以访问其自己的成员。第二列表示与 class 在同一个包中的 classes(不管他们的出身)是否可以访问该成员。第三列表示在此包外声明的 class 的子 class 是否可以访问该成员。第四列表示是否所有 classes 都可以访问该成员。
访问级别以两种方式影响您。首先,当您使用来自其他来源的 classes 时,例如 Java 平台中的 classes,访问级别决定了这些 classes 中哪些成员是您自己的classes可以用。其次,当你写一个 class 时,你需要决定你的 class 中的每个成员变量和每个方法应该具有什么访问级别。
您可以进一步阅读:
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
在你的例子中,你在包 private.Hence 中的变量无法在不同的包中访问。希望这有帮助!
当我们 declare/create 在 java 中匿名 class 时。它是一个新的未知数(因为编译器给出了名称)class 扩展了您重新定义的 class(在我们的例子中是 class A)。指定的访问修饰符是 default / package-private 。这里继承存在,子class不能访问父的私有成员。因此它不可访问。 在简单的重写打印函数中,将出现在新的 class 中,而字符串数据成员将出现在其父 class 中。 要访问它应该转换为 protected