繁体   English   中英

如何访问抽象类的实例变量到类?

[英]How is it possible to access the instance variable of aa abstract class to a class?

如何在DemoAbs类中使用此抽象类实例变量?

这是D类:

abstract class D {
    int i=10;
    String str="java";

    D(){
        System.out.println("called abstract class constructor");
    }

    abstract void m1();
    void m2() {
        int i=20;
        System.out.println("called m2() in abstract class !");
    }
}

这是DemoAbs类:

public class DemoAbs extends D{

    // access instance variable here from abstract class

    DemoAbs() {
         System.out.println("called DemoAbs class constr");

    }

    @Override
    void m1() {
        System.out.println("inside m1() method");
    }

    public static void main(String[] args) {
        DemoAbs d=new DemoAbs();
        d.m1();
        d.m2();
    }
}

您可以使用super关键字从子类的方法访问超类非私有变量

您的代码(已修改):

abstract class D {
    int i = 10;
    String str = "java";
    private String newStr = "java not accessible";
    D() {
        System.out.println("called abstract class construtar");
    }
    abstract void m1();
    void m2() {
        int i = 20;
        System.out.println("called m2() Abstrate class !");
    }
}

public class DemoAbs extends D {
    // access instance variable here from abstract class
    DemoAbs() {
        System.out.println("called DemoAbs class contr");
    }

    @Override
    void m1() {
        System.out.println(super.i); // added
        System.out.println(super.str); // added
        //System.out.println(super.newStr); -- Not accessible
        System.out.println("inside m1() method");
    }

    public static void main(String[] args) {
        DemoAbs d = new DemoAbs();
        d.m1();
        d.m2();
    }
}

只需在您的主要方法中做到这一点,

public static void main(String[] args) {
        DemoAbs d=new DemoAbs();
        d.m1();
        d.m2();
        int num = d.i;
        String strVar = d.str;

    }

现在,变量numstrVar保留成员变量的值。

从子类访问超类的实例字段很简单:只需按原样使用这些实例字段的名称即可。 唯一的警告:这些字段必须具有适当的可见性。 在您的情况下,您将i字段定义为具有默认可见性,该可见性可能并不总是有效[1]。 为确保该字段对子类可见,应使用protected可见性对其进行定义。

这是您的程序(略作修改),显示了此内容:

abstract class D {
  protected int i=10;
  protected String str="java";

  D(){
    System.out.println("called abstract class constructor");
  }

  protected abstract void m1();

  void m2() {
    System.out.println("called m2() in abstract class! i=" + i);
  }
}




public class DemoAbs extends D{

  // access instance variable here from abstract class

  DemoAbs() {
    System.out.println("called DemoAbs class constr");
  }

  @Override
  protected void m1() {
    i = 30;
    System.out.println("inside m1() method");
  }

  public static void main(String[] args) {
    DemoAbs d=new DemoAbs();
    d.m1();  // Output: "inside m1() method"
    d.m2();  // Output: "called m2() in abstract class! i=30"
  }
}

请注意,对d.m2()的调用将产生输出,显示为"i=30" 这是因为对d.m1()的调用执行了赋值i = 30 (请参见DemoAbs.m1()主体),从而将i从其初始值更改(将10更改为D声明)。

[1]具体来说,如果子类是在与超类不同的包中声明的,则具有默认可见性的字段将不可见。

您可以为抽象类D中的实例变量定义getter方法,并使用DemoAbs类实例访问它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM