簡體   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