【问题标题】:Referencing variables or methods of an Object in an ArrayList在 ArrayList 中引用对象的变量或方法
【发布时间】:2017-12-17 06:56:57
【问题描述】:

长话短说,我不知道为什么这段代码不起作用。

import java.util.*;

class sup{
  int a;

  sup(){
    a = 1;
  }
}

class subB extends sup{
  int b;

  subB(){
    b = 2;
  }
}

class subC extends sup{
  int c;

  subC(){
    c = 3;
  }
}

public class runMain{
  public static void main(String args[]){
    List<Object> classes = new ArrayList<Object>();

    classes.add(new sup());
    classes.add(new subB());
    classes.add(new subC());

    System.out.println(classes.get(0).a); //should print 1
    System.out.println(classes.get(1).b); //should print 2
    System.out.println(classes.get(2).c); //should print 3

  }
}

如评论中所述,我希望最后 3 行打印不同类中 a、b 和 c 的值。当而不是例如 System.out.println(classes.get(0)); 它打印sup@6d06d69c,我认为这只是内存位置的类名“@”,因此程序中的所有其他内容似乎都按预期工作。

【问题讨论】:

  • 我知道为什么它打印 sup@6d06d69c,正如我在文中所说的那样,这不是我的问题。我在问如何打印/访问属于该类的特定变量。
  • 我的错。这是您实际要问的问题:stackoverflow.com/questions/4512312/… 您需要将值转换为其相应的子类。
  • 如果对象没有存储在 ArrayList 中,这可以解决问题,我之前尝试过并且工作正常。只是在 ArrayList 中引用对象的变量似乎并不直观,至少对我而言,以我放入原始代码块的形式。
  • 存储位置无关紧要。您可以转换 get 返回的内容,就像转换变量一样。 ((sup)classes.get(0)).a。或者只是先将它的返回值分配给一个变量并进行转换。
  • 啊,我的错,我阅读了解决方案的错误部分。我想因为我声明了 Object 类型的 ArrayList,所以需要在访问之前对其进行强制转换。有没有类似的方法在ArrayList中的这个Object内设置变量和运行方法?

标签: java object arraylist subclass


【解决方案1】:

继承的好处包括代码重用和方法重载——您的代码都没有利用这些。在您的情况下,它可能是:

  1. 重用:超类变量a,在这种情况下,子类将没有自己的变量bc,而是将它们各自的值分配给超类-a 的类声明,假设它是公共的或受保护的。更好的编码风格会在超类中包含一个共享的 getter 方法。

  2. 方法重载:三个类中的每一个都有一个通用名称的方法,该方法返回它们各自的值。

在这个例子中,继承涉及的三个类共享一个变量和一个 getter:

import java.util.ArrayList;

public class MyClass{

static class sup{
  protected int a;

  sup(){
    a = 1;
  }

  public int a() {
      return a;
  }
}

static class subB extends sup{


  subB(){
    a = 2;
  }
}

static class subC extends sup{


  subC(){
    a = 3;
  }
}

public static void main(String[] args) {

    ArrayList<sup> classes = new ArrayList<sup>();

    classes.add(new sup());
    classes.add(new subB());
    classes.add(new subC());

    System.out.println(classes.get(0).a());
    System.out.println(classes.get(1).a());
    System.out.println(classes.get(2).a());
}

}

【讨论】:

  • 对不起,我想我这里的代码过度简化了我的问题。我打算让子类包含许多仅针对该子类的不同方法和变量,因此在超类中定义所有内容将违背我为组织创建子类的目的。
  • 如果您不共享代码或变量,或者使用静态绑定,那么为什么要使用继承?
  • 我将共享代码,超类仍然有许多子类对象使用的方法,但每个子类中将有更多专门的方法。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 2018-05-28
  • 2012-09-09
  • 2019-11-20
  • 2017-06-01
  • 2012-11-06
  • 2017-08-17
  • 1970-01-01
相关资源
最近更新 更多