如何从基类访问字段的值?

时间:2013-10-02 12:29:10

标签: java inheritance

我想从Java中的基类访问类的字段。我可以用点网做。 看到例子:

public class a{

// here I want to read the value of name or f1 or f2 or every other field values from derived classes
}
public class b extends a{
  public string name;
}
public class c extends a{
  public string f1;
  public string f2;
}

怎么做?

3 个答案:

答案 0 :(得分:3)

如果没有显式命名子类,则无法读取您的类不拥有的字段。所以,这可行如下:

((c)this).f1;

然而,这样做会带来很难的代码味道:您现在将a体现的抽象与其特定的实现/扩展之一联系起来。你最好重新考虑你的设计。

关于代码约定的重要说明

在Java中,您必须使用CamelCase和使用小写的包来命名您的类,否则可能会出现一些非常糟糕的名称解析异常。更不用说任何Java用户都会完全忘记阅读您的代码。

答案 1 :(得分:2)

你真的不想这样做,因为它违背了继承的想法。

但是,您可以设置由派生类实现的抽象函数。这是很好的编程风格。这些函数可以访问派生类和基类中的成员数据。

像(i)使用反射和(ii)转换为派生类这样的事情是黑客攻击,应该避免。原因是更改派生类不应该触发基类更改的必要性。

答案 2 :(得分:0)

在这种情况下,您应该做的是在类a中定义抽象方法,类b和c必须实现。然后,您可以从a调用这些方法以获取由b和c设置的值。

public abstract class a{

// here I want to read the value of name or f1 or f2 or every other field values from derived classes
    abstract String getName();
    abstract String getF1();
    abstract String getF2();
}

public class b extends a{
  private String name;

  @Override
  public String getName() { return name; } 

  @Override
  public String getF1() { return null; }

  @Override
  public String getF2() { return null; }
}

public class c extends a{
  public String f1;
  public String f2;


  @Override
  public String getName() { return null; } 

  @Override
  public String getF1() { return f1; }

  @Override
  public String getF2() { return f2; }
}