Jump to content
rikardinhuh

[problema] metodos contrutores

Recommended Posts

rikardinhuh

Boas, estou a iniciar-me em java e estou a tentar fazer uma loja em que armazena produtos atraves de prateleiras(family). . .

mas estou intigrado que fiz uma codigo "simples" e deu certo mas depois fiz um pouco mais complicado e já dá erros =S e gostaria de saber o que está errado e como posso resolve-lo...

tenho estas duas classes:

public class Product {
    String name;
    float price;
    float iva;

    Product (String name_tmp, int price_tmp){
    name = name_tmp;
    price = price_tmp;
    iva = (price*23)/100;


    }

public class ProductFamily {
    String family_name;
    String family_admin;
    int family_number;

    ProductFamily(String family_tmp, String family_admin_tmp, int family_number_tmp){
    family_name = family_tmp;
    family_admin = family_admin_tmp;
    family_number = family_number_tmp;
    }

E este é o codigo funcional:

public class Supermarket {

    String name;
    Product[] products = new Product[100];
    ProducFamily[] productfamily = new ProducFamily[10];

    Supermarket(String name_tmp, Product[] products_tmp){
    name = name_tmp;
    products = products_tmp;
    }
    Supermarket(String name_tmp, ProducFamily[] productfamily_tmp){
    name = name_tmp;
    productfamily = productfamily_tmp;
    }


    public static void main(String[] args) {
        Supermarket market = new Supermarket("CHINOCA MARKET", new Product[]{
        new Product("azeitonas", 3),
        new Product("aminduins", 5)});
        System.out.println(market.name + "\n");
        System.out.println("TODOS OS PRODUTOS: \n");

        for(Product product : market.products){
        System.out.println("nome do produto: "+product.name);
        System.out.println("Preço: "+product.price);
        System.out.println("iva "+product.iva+"\n");
        }

Mas se fizer algo tipo isto:

public class Supermarket {

    String name;
    Product[] products = new Product[10];
    ProductFamily[] productfamily = new ProductFamily[10];
    
    Supermarket(String name_tmp,Product[] products_tmp){
    name = name_tmp;
    products = products_tmp;
    
            
    }
    Supermarket(String name_tmp, ProductFamily[] productfamily_tmp,Product[] products_tmp){
    name = name_tmp;
    products = products_tmp;
    productfamily = productfamily_tmp;
            
    }
    
    public static void main(String[] args) {
        Supermarket family1 = new Supermarket("Chocolates",new ProductFamily[]{
            new ProductFamily("Chocolates","Ze Carlos",5)},
                new Product[]{
                        new Product("Milka",15),
                        new Product("kit kat", 5)});
    }
    

        
        
        
        for(ProductFamily coise : family1.productfamily){
        
        }

Já nao funciona =S

cumps

Share this post


Link to post
Share on other sites
rikardinhuh

No for incompleto aparece : "illegal start of type", "package family1 doens't exist", "; expected"

quando escrevo family1, supostamente para aceder á variavel, nao aparece as instancias criadas... nao sei se isto akjuda em alguma coisa =S

Share this post


Link to post
Share on other sites
bruno1234

O for dá erro porque a variável product family não é publica.

Se puseres como publica resolves esse problema.

Depois pesquisa sobre get e set a variáveis de instância, para encapsulares variáveis privadas, é melhor do que começares a por tudo publico.


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Share this post


Link to post
Share on other sites
rikardinhuh

Isso emplica fazer isto?:

    public String name;
    public Product[] products = new Product[10];
    public ProductFamily[] productfamily = new ProductFamily[10];

    Supermarket(String name_tmp,Product[] products_tmp){
    name = name_tmp;
    products = products_tmp;


    }
    Supermarket(String name_tmp, ProductFamily[] productfamily_tmp,Product[] products_tmp){
    name = name_tmp;
    products = products_tmp;
    productfamily = productfamily_tmp;

    }

desculpa lá se estou a ser muito nabo mas nao funca na mesma =S

Share this post


Link to post
Share on other sites
Draakar

não estou a ver o erro mas é má prática de programação declarar variáveis como publicas devias encapsular as variáveis e fazer métodos get e set para as usares/modificares!

Share this post


Link to post
Share on other sites
KTachyon

O for não está fora do main?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
brunoais

Eh... Estás agora a começar a programar em java e andaste a programar em C ou C++ ou (inserir linguagem iterativa)?

(preciso de saber para saber como te ajudar a transformar esse código em algo mais... java)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rikardinhuh

eu dei C no semestre passado, o que complica um pouco nao pensar nessa linguagem =S

Share this post


Link to post
Share on other sites
brunoais

Nota-se... Usas java como sendo uma linguagem iterativa e não como uma linguagem direcionada a objectos.

Começando: Regra geral, todos os atributos de uma classe são privados e, no teu caso, não há necessidade de excepções. Só a própria classe tem acesso.

Ou seja:

Em vez de:

public class Product {
    String name;
    float price;
    float iva;

    Product (String name_tmp, int price_tmp){
    name = name_tmp;
    price = price_tmp;
    iva = (price*23)/100;


    }

Deve estar:

public class Product {
    private String name;
    private float price;
    private float iva;

    Product (String name_tmp, int price_tmp){
        name = name_tmp;
        price = price_tmp;
        iva = (price*23)/100;
    }

Assim essa class terá todo o controlo sobre os atributos, que é uma coisa muito importante em java.

E como é que disponibilizas estes valores a quem quer usá-los? Através de métodos.

Por exemplo, aproveitando a classe que está em cima. Queres que o iva fique disponível para quem quiser:

public class Product {
    private String name;
    private float price;
    private float iva;

    public Product (String name_tmp, int price_tmp){
        name = name_tmp;
        price = price_tmp;
        iva = (price*23)/100;
    }
     
    public float getIva(){
        return iva;
    }

Com o código assim também garantes que ninguém irá alterar o valor do iva.

O main deve ir para uma class que seja feita só para ele. Ou seja, deixa as classes que são objetos serem objetos e põe o main numa class que contenha o main e outros métodos static que aches apropriado que o main chame (isso significa que tens que criar, no mínimo, mais uma classe para o teu projeto).

Problemas principais na class Supermarket:

1º: Nunca se inicializa uma variável que é um parâmetro sem ser nos construtores. Neste caso estou a falar dos parâmetros products e productfamily que inicializas na altura errada.

2º: Os arrays são objetos. Quando envias para uma função, o que é copiado é a referencia para o objeto. Por isso, nunca copies as referencias de objectos nos construtores exceto para objetos que não têm o método clone (esta exceção não se aplica a arrays). Para copiar arrays podes usar método array copy que está bem documentado no site da oracle

Já estou cansado.. acabo isto mais tarde. Se tiveres algum problema em perceber isto pergunta.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rikardinhuh

Aprendi há pouco como usar get e set XD

2º: Os arrays são objetos. Quando envias para uma função, o que é copiado é a referencia para o objeto. Por isso, nunca copies as referencias de objectos nos construtores exceto para objetos que não têm o método clone (esta exceção não se aplica a arrays). Para copiar arrays podes usar método array copy que está bem documentado no site da oracle

aqui deste-me um nó -.-':)  

    String name;

    Product[] products = new Product[10];

    ProductFamily[] productfamily = new ProductFamily[10];

Falas destas inicializaçôes? Onde devia inicializar entao ? =S

acho que é tudo, obrigado ;D

Share this post


Link to post
Share on other sites
brunoais

aqui deste-me um nó -.-':)  

Qual é que foi a parte que não percebeste?

Falas destas inicializaçôes? Onde devia inicializar entao ? =S

No construtor do objecto.

Defines essas variáveis aí e depois inicializas no construtor.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rikardinhuh

Como inicializo no construtor para mais tarde ter acesso a elas? Oo

Share this post


Link to post
Share on other sites
brunoais

Por exemplo (usando parte do q tens):

public class Supermarket {

    String name;
    Product[] products;
    ProducFamily[] productfamily;

    Supermarket(String name_tmp, Product[] products_tmp){
        name = name_tmp;
        products = Arrays.copyOf(products_tmp, products_tmp.length);
        productfamily = new ProducFamily[10];
    }

Faz sentido?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.