如何在我的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();
}
}
答案 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类实例访问它。