在匿名类外部包中访问类的成员函数

时间:2018-06-21 10:35:38

标签: java package anonymous-class

我在一个包中有一个包含数据成员的类。现在,在另一个程序包中编写该类的匿名类。

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类中公开的。如何在编写匿名类的同时访问数据而不更改数据的访问说明。

2 个答案:

答案 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).
  1. 可以使用修饰符public声明一个类,在这种情况下,该类对于所有地方的所有类都是可见的。如果一个类没有修饰符(默认值,也称为package-private),则它仅在其自己的包中可见(包被命名为相关类的组,您将在以后的课程中对其进行了解。)

  2. 在成员级别,也可以像顶级类一样使用public修饰符或no修饰符(package-private)(具有相同含义)。对于成员,还有两个附加的访问修饰符:私有和保护。 private修饰符指定只能在其自己的类中访问该成员。 protected修饰符指定成员只能在自己的包中(与package-private一样)访问,并且只能由其在另一个包中的类的子类访问。

下表显示了对每个修饰符允许的成员的访问。

enter image description here

第一个数据列指示类本身是否有权访问由访问级别定义的成员。如您所见,类始终有权访问其自己的成员。第二列指示与该类在同一个包中的类(无论其亲本)是否有权访问该成员。第三列指示在此包外部声明的类的子类是否有权访问该成员。第四列指示是否所有类都可以访问该成员。

访问权限级别以两种方式影响您。首先,当您使用来自其他来源的类(例如Java平台中的类)时,访问级别确定您自己的类可以使用那些类的哪些成员。其次,编写类时,需要确定类中每个成员变量和每个方法应具有的访问级别。

您可以继续阅读:

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

在您的情况下,无法在其他程序包中访问包private.Hence中的变量。希望这会有所帮助!