当前位置: 首页 > 知识库问答 >
问题:

无法从带有对象的超类访问字段

钱华晖
2023-03-14

我试图找到一种很好的方法来迭代并打印出ArrayList中的对象。

问题是我似乎无法到达用户键入对象信息(例如颜色和品牌)的字段。

对象的新实例如下所示:

Vehicle C = new Car(4, "Blue", "Honda");

汽车(以及自行车、公共汽车等其他类别)是汽车的子类。

车辆等级:

public class Vehicle {

public int pass = 0;
public int cost = 0;
public int size = 0;
public String brand = "";
public String color = "";

public Vehicle(){}

}

汽车等级:

public class Car extends Vehicle{

// constructor
public Car(int passengers, String col, String brandOfVehicle){
    if (passengers < 0 || passengers > 4){
        throw new IllegalArgumentException();
    }else
        pass = passengers;
        cost += pass*15 + 100;
        size = 5;
        color = col;
        brand = brandOfVehicle;
}

}尝试迭代对象时:

        Iterator<Object> it = Ferry.iterator();
    while(it.hasNext()){
        Object i = it.next();
        System.out.println(i + " ");
    }

当迭代对象时,我希望达到I.color中的颜色和品牌字符串。但是我猜想,由于我是一个新的对象,它可能无法访问与汽车、公共汽车等相关的字段和方法?

有什么办法绕过这个问题吗?或者这可能不是真正的问题?

共有3个答案

姬坚成
2023-03-14
    Iterator<Vehicle > it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i + " ");
}

您无法访问属性,因为您强制转换为Object类型,这是您的车辆的超类。

何涵忍
2023-03-14

对象投射到vihelle并使其工作:

Iterator<Object> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = (Vehicle)it.next();
    System.out.println(i + " ");
}

您还可以检查是否有来自车辆的子类,然后进行转换。

或者,如果只有车辆可以访问渡轮,您可以将列表更改为:

Iterator<Vehicle> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i + " ");
}
孟树
2023-03-14

我不知道Ferry的类型是什么,但也许Ferry.iterator()应该返回一个迭代

然后<代码>它。next()将返回对车辆的引用,这将允许您访问车辆的所有公共成员。

Iterator<Vehicle> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i.color);
}

如果渡轮可以包含非车辆的物体,则必须使用铸造:

Iterator<Object> it = Ferry.iterator();
while(it.hasNext()){
    Object i = it.next();
    if (i instanceof Vehicle)
        System.out.println(((Vehicle)i).color);
}
 类似资料:
  • 我是java初学者,我不理解这行代码是什么意思 平均值。为什么不能访问自己的方法。请详细解释如果类A正在实例化,那么为什么它的方法不可访问。

  • 我正在努力解决一个奇怪的问题。 控制台是 如您所见,第一行输出了GeneratorField对象的名称,但是为什么第二个命令失败了? 我正在使用Freemarker 2.3.20 谢啦

  • 问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接

  • 在我的项目中,我使用XStream序列化/反序列化我的实体。 在应用程序中,所有的事情都很好,但当我尝试创建一些单元测试时就不行了。 我有一个抽象类,它有一个字段和公共访问器。我有一个类扩展了。 我的XStream配置如下所示: 当我运行我的应用程序时,没有任何问题。但当我尝试创建单元测试时,XStream引发异常: Edit 我在测试中尝试了,它引发了同样的异常。但当我尝试时,没有问题。我知道这

  • 我不确定我是不是漏了一步。 我有一个s3 bucket,我需要能够从一个AWS SDK PHP脚本访问我写的运行在我的EC2上。我创建了一个IAM角色以允许访问。 IAM Allow_S3_Access_to_EC2 我的Bucket策略中没有任何关于我的EC2甚至我附加的IAM角色的内容。我也需要在我的桶策略中添加一些东西吗?这就是我困惑的地方。 我所经历的是,当一个新的对象被创建,我试图从我的

  • 问题内容: 我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。可以使用子类对象调用超类的函数吗? 考虑上面的代码。 它在这里打印 子类去 。相反,我必须打印 超类去 。 问题答案: 不,这是不可能的,如果您认为需要,请重新考虑您的设计。覆盖方法的全部要点是替换其功能。如果一个不同的类对该类的内部工作非常了解,那么您将完全取消封装。