当前位置: 首页 > 面试题库 >

从Java中的基类访问子类字段

羊舌高峰
2023-03-14
问题内容

我有一个名为 Geometry 的基类,在该基类中存在 Sphere 子类:

public class Geometry 
{
 String shape_name;
 String material;

 public Geometry()
 {
     System.out.println("New geometric object created.");
 }
}

和一个子类:

public class Sphere extends Geometry
{
 Vector3d center;
 double radius;

 public Sphere(Vector3d coords, double radius, String sphere_name, String material)
 {
  this.center = coords;
  this.radius = radius;
  super.shape_name = sphere_name;
  super.material = material;
 }
}

我有一个包含所有 Geometry 对象的ArrayList,我想对其进行迭代以检查是否正确读取了文本文件中的数据。到目前为止,这是我的迭代器方法:

public static void check()
 {
  Iterator<Geometry> e = objects.iterator();
  while (e.hasNext())
  {
   Geometry g = (Geometry) e.next();
   if (g instanceof Sphere)
   {
    System.out.println(g.shape_name);
    System.out.println(g.material);
   }
  }
 }

如何访问和打印 球体的 半径和中心字段?提前致谢 :)


问题答案:

如果要访问子类的属性,则必须转换为子类。

if (g instanceof Sphere)
{
    Sphere s = (Sphere) g;
    System.out.println(s.radius);
    ....
}

但是,这并不是最OO的处理方式:一旦拥有更多的Geometry子类,您将需要开始强制转换为这些类型中的每一个,这很快就会变成一团糟。如果要打印对象的属性,则应在Geometry对象上有一个称为print()的方法或沿这些行的名称,该方法将打印对象中的每个属性。像这样:

class Geometry {
   ...
   public void print() {
      System.out.println(shape_name);
      System.out.println(material);
   }
}

class Shape extends Geometry {
   ...
   public void print() {
      System.out.println(radius);
      System.out.println(center);
      super.print();
   }
}

这样,您就不需要进行强制转换,只需在while循环内调用g.print()即可。



 类似资料:
  • 我正在尝试从Java切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?

  • 我理解您可以从派生类访问基类的成员,然而,我有一个函数需要指向我的基类作为一个整体的指针。例如: 有没有办法从派生类中获得指向这个基类的指针?

  • 我的子类是,我需要在我的超类中使用字段和。我知道如何在子类中使用超类变量,但我必须学会如何做相反的事情?谢谢。

  • 我在ReactJS中得到了一个子类和一个父类。我想让我的孩子访问父级的状态,这是每毫秒更新一次。孩子也应该有可能接触到一些父母的方法。 在另一个类中,我正在初始化一个子对象并对其调用Function startManager()。但随后我收到一条错误消息,说无法读取未定义的属性“start”。我是一个新的反应者,我认为我在定义孩子的属性时犯了一些错误。有人知道我做错了什么吗。谢谢

  • 我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?

  • 我有一个场景,下面是超类:- 我正在使用每子类表策略使用一个鉴别器下面是容器的hbm映射:- 下面是FieldParent的hbm映射:- java.sql.SqlSyntaxerRoreXception:ora-00904:“FieldParent1_3_”.“TypeOFSub”:无效标识符