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

时间:2016-12-29 11:30:26

标签: java

如何在我的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();
    }
}

4 个答案:

答案 0 :(得分:0)

您可以使用 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();
    }
}

答案 1 :(得分:0)

只需在您的主要方法中执行此操作,

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

    }

现在变量 num strVar 保存成员变量的值。

答案 2 :(得分:0)

从子类访问超类的实例字段很简单:只需按原样使用这些实例字段的名称。唯一需要注意的是:这些字段必须具有适当的可见性。在您的情况下,您将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]具体来说,如果子类是在与超类不同的包中声明的,那么具有默认可见性的字段将不可见。

答案 3 :(得分:0)

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