[英]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;
}
現在,變量num和strVar保留成員變量的值。
從子類訪問超類的實例字段很簡單:只需按原樣使用這些實例字段的名稱即可。 唯一的警告:這些字段必須具有適當的可見性。 在您的情況下,您將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.