1 父类使用子类属性问题
一般来说子类可以使用父类非private定义的字段,但是父类是不能使用子类的字段的。
例如定义一个父类SuperClass,一个子类SubClass,都拥有相同的字段name
public class SuperClass {
private String name="super";
protected void printName()
{
System.out.println(name);
}
}
public class SubClass extends SuperClass{
private String name="sub";
@Override
protected void printName()
{
System.out.println(name);
}
public static void main(String[] args)
{
SubClass subClass=new SubClass();
subClass.printName();
}
}
子类复写父类printName方法。执行Main方法后打印如下:
sub
此时调用子类的printName()方法,输出子类的name字段。当注释掉子类复写方法pritName()时。
public class SubClass extends SuperClass{
private String name="sub";
// @Override
// protected void printName()
// {
// System.out.println(name);
// }
public static void main(String[] args)
{
SubClass subClass=new SubClass();
subClass.printName();
}
}
此时输出结果:
super
调用父类的printName()方法打印父类的name字段,但是有时候我们希望在父类中操作子类的字段。那么可以将字段的创建交给子类来完成。
public abstract class SuperClass {
private String name;
public SuperClass( ) {
name=createName();
}
protected void printName()
{
System.out.println(name);
}
abstract protected String createName();
}
public class SubClass extends SuperClass{
private String name;
@Override
protected String createName() {
name="sub";
return name;
}
public static void main(String[] args)
{
SubClass subClass=new SubClass();
subClass.printName();
}
}
当创建subClass时候会执行SuperClass的构造函数,此时会调用createName()方法,执行subClass的createName()方法将子类的name引用返回交给父类。这时父类的name字段就指向子类的name字段。
此时输出结果为:
sub