如何在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();
}
}
从子类访问超类的实例字段很简单:只需按原样使用这些实例字段的名称即可。唯一的警告:这些字段必须具有适当的可见性。在您的情况下,您将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]具体来说,如果子类是在与超类不同的包中声明的,则具有默认可见性的字段将不可见。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句