我在一个包中有一个包含数据成员的类。现在,在另一个程序包中编写该类的匿名类。
package a;
public class A{
String data;
void print(){
System.out.print(data);
}
}
并在另一个包中现在制作A的匿名类。
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");
}
}
}
}
现在在这里我得到一个错误数据,它不是在A类中公开的。如何在编写匿名类的同时访问数据而不更改数据的访问说明。
答案 0 :(得分:0)
当我们在Java中声明/创建一个匿名类时。这是一个新的未知类(因为编译器提供了名称),该类扩展了您重新定义的类(在本例中为A类)。指定的Acess修饰符是default / package-private。此处存在继承,子类无法访问父级的私有成员。因此无法访问。 在简单的重写打印函数将在新类中,而String数据成员将出现在其父类中。 要访问它,应将其转换为受保护的
答案 1 :(得分:-1)
在您的代码中,您没有覆盖该功能。要覆盖正确的语法,将是
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");
}
}
}
}
在编写下面的代码时,匿名类正在创建一个新方法。因此,它不是在抱怨。
void print(){
// overriding print
System.out.print(data + " overrided");
}
您需要了解控制访问类成员的机制。
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。访问控制分为两个级别:
At the top level—public, or package-private (no explicit modifier).
At the member level—public, private, protected, or package-private (no explicit modifier).
可以使用修饰符public声明一个类,在这种情况下,该类对于所有地方的所有类都是可见的。如果一个类没有修饰符(默认值,也称为package-private),则它仅在其自己的包中可见(包被命名为相关类的组,您将在以后的课程中对其进行了解。)
在成员级别,也可以像顶级类一样使用public修饰符或no修饰符(package-private)(具有相同含义)。对于成员,还有两个附加的访问修饰符:私有和保护。 private修饰符指定只能在其自己的类中访问该成员。 protected修饰符指定成员只能在自己的包中(与package-private一样)访问,并且只能由其在另一个包中的类的子类访问。
下表显示了对每个修饰符允许的成员的访问。
第一个数据列指示类本身是否有权访问由访问级别定义的成员。如您所见,类始终有权访问其自己的成员。第二列指示与该类在同一个包中的类(无论其亲本)是否有权访问该成员。第三列指示在此包外部声明的类的子类是否有权访问该成员。第四列指示是否所有类都可以访问该成员。
访问权限级别以两种方式影响您。首先,当您使用来自其他来源的类(例如Java平台中的类)时,访问级别确定您自己的类可以使用那些类的哪些成员。其次,编写类时,需要确定类中每个成员变量和每个方法应具有的访问级别。
您可以继续阅读:
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
在您的情况下,无法在其他程序包中访问包private.Hence中的变量。希望这会有所帮助!