JAVA在数组中存储3个或更多类

时间:2014-01-15 00:35:30

标签: java arrays class abstract-class

我有点陷入困境,非常感谢你的帮助。正如标题所说,我想在一个数组上存储不同的类,这是在另一个类中 这将是我的代码

客户类:

public class Customer {
public List<Product> products = new ArrayList<Product>();
public void addProduct(Product p){
    products.add(p);
}

}

产品类:

public abstract class Product{ }

火腿班:

public class Jamon extends Product{ 
protected String marca;
protected int precio;

public Jamon(String marca,Double precio){
    this.marca=marca;
    this.precio=precio;
}

public void setMarca(String marca){
    this.marca=marca;
}
public String getMarca(){
    return marca;
}

public void setPrecio(int precio){
    this.precio=precio;
}
public int getPrecio(){
    return precio;
}
*/

public void comprar(){
    System.out.println("Se ha comprado el jamon");
}

我想知道的是如何将Jamon类存储在Customer类的数组中,我想要这样,因为会有多个类如Jamon从Product扩展。此外,如果所有这些类(Pepino,Jelly等)都有precios,我怎样才能添加所有的precios? 谢谢,如果您对我的问题有任何疑问,请问我(英语不是我的第一语言)美好的一天(:

2 个答案:

答案 0 :(得分:0)

正如其他人已经评论过的那样,您可以将Product的任何子类的实例添加到ArrayList<Product>。你已经完成了。

如果您希望所有产品都有precio,那么您可以在抽象类Product而不是Jamon和其他子类中定义它。将变量precio的声明从Jamon移至Product。同时将方法getPreciosetPrecio移至Product。在Product中创建一个构造函数以接受precio。在诸如Jamon的子类的构造函数中,调用super(precio)来初始化precio

然后,您将能够遍历Product中的所有ArrayList并调用getPrecio()方法将所有precio加起来。

答案 1 :(得分:0)

这是你似乎想要实现的一个小实现

public abstract class Product {
    protected double precio;

    public void setPrecio(double precio){
        this.precio=precio;
    }

    public double getPrecio(){
        return precio;
    }
}

这是另一个

public class Jamon extends Product{ 
    protected String marca;

    public Jamon(String marca,Double precio){
        this.marca=marca;
        this.precio=precio;
    }

    public void setMarca(String marca){
        this.marca=marca;
    }

    public String getMarca(){
        return marca;
    }   

    public void comprar(){
        System.out.println("Se ha comprado el jamon");
    }
}

这也是这个

public class Pepino extends Product{ 
    protected String marca;

    public Pepino(String marca,Double precio){
        this.marca=marca;
        this.precio=precio;
    }

    public void setMarca(String marca){
        this.marca=marca;
    }

    public String getMarca(){
        return marca;
    }   

    public void comprar(){
        System.out.println("Se ha comprado el pepino");
    }
}

最后

import java.util.List;
import java.util.ArrayList;

public class Customer {
    public List<Product> products = new ArrayList<Product>();

    public void addProduct(Product p){
        products.add(p);
    }

    public static void main(String[] args) {
        Customer customer = new Customer();
        Jamon jamon = new Jamon("Jabugo", 25.0);
        Pepino pepino = new Pepino("Extra picante", 8.50);
        Jamon negro = new Jamon("Pata Negra", 32.99);
        customer.addProduct(jamon);
        customer.addProduct(pepino);
        customer.addProduct(negro);
        for (Product product : customer.products) {
            System.out.println(product.getClass());
        }
    }
}

好的,所以要清楚。 Jamon和Pepino都来自Product,这意味着:

- 他们可以使用任何变量(例如precio)或方法(setPrecio或getPrecio)。由于它在抽象类中定义。一个例外是私有,在扩展类中不可访问。

- 由于客户添加了一堆元素作为产品,除非列表中的项目是铸造的,否则无法访问Jamon或Pepino中定义的方法。

- 将内部字段声明为公共变量(我指的是Customer中的产品,制作一个getter / setter)并不是很常见的做法。

- 在您的小例子中,您似乎混合了 double int 的想法,两者都代表数字,但只有第一个有小数点。如果您使用十进制值,就像在precio中一样,请将字段声明为 double ,并始终使用double。

新客户类(仅在ArrayList中存储价格,与产品相对应)

import java.util.List;
import java.util.ArrayList;

public class Customer {
    public List<Double> products = new ArrayList<Double>();

    public void addProduct(Product p){
        products.add(p.getPrecio());
    }

    public static void main(String[] args) {
        Customer customer = new Customer();
        Jamon jamon = new Jamon("Jabugo", 25.0);
        Pepino pepino = new Pepino("Extra picante", 8.50);
        Jamon negro = new Jamon("Pata Negra", 32.99);
        customer.addProduct(jamon);
        customer.addProduct(pepino);
        customer.addProduct(negro);
        for (Double productPrice : customer.products) {
            System.out.println(productPrice);
        }
    }
}