Problemas com orientaçao a objeto! [RESOLVIDO]

15 respostas
manolo

Pessoal, estou começando a aprender os conceitos de orientação a objeto, e estou criando uma classe que faça o calculo da area de 30 triângulos!

Acabei criando um array de 30 posições para receber a altura e base de um triangulo, e uma classe com os atributos e métodos(que estou totalmente embananado!).

Já li algumas coisas sobre POO, mais tenho duvidas do que eu estou fazendo de errado nas classes abaixo.

import java.util.Scanner;
public class ExercicioTriangulo {
        
    public static void main(String[] args) {
    	
    	 MetodosTriangulo  triangulo[] = new MetodosTriangulo[30];
    	
    	Scanner input = new Scanner(System.in);
    	
    	double base;
    	double altura;
    	
    	for(int i = 1; i<=triangulo.length; i++){
    		System.out.println(" Informe a base do "+i+" triangulo: ");
    		base = input.nextFloat();input.nextLine();
    		
    		System.out.println(" Informe a altura do "+i+" triangulo:");
    		altura = input.nextFloat();input.nextLine();
    		
    	
    		triangulo[i].setTriangulo(base,altura);
    	}
    	
    	for(int i = 0; i<triangulo.length; i++){
    		System.out.println(" Triangulo"+i+" tem area:"+triangulo[i].getTriangulo());
    	}
    	
       
    }
}
public class MetodosTriangulo {
	
	private double base;
	private double altura;
	private double resultado;

  

  
  public void setTriangulo(double n, double m){
  	this.resultado=(base*altura)/2;
  	
  }
  
  public double getTriangulo(){
  	return resultado;
  }
    
    
}


Pessoal espero que alguem clarei minhas ideias, pois estou ficando louco já!

auhauhahahahahauhauhahau

Abraços. :D

15 Respostas

marcoslogan

De fato, o que é que está acontecendo? Qual é a sua dúvida. No programa aparece alguma coisa?

maior_abandonado

bom... no seu setTriangulo, mude

public void setTriangulo(double n, double m){   
    this.resultado=(base*altura)/2;   
       
  }

por

public void setTriangulo(double base, double altura){   
    this.base = base;
    this.altura = altura;
    this.resultado=(base*altura)/2;   
       
  }

você está usando a base e a altura sendoque você não os setou...

ja que você citou estar pensando em OO, crie getters e setters para a base e a altura... quanto ao por que não esta funcionando, repare que do jeito que está você está usando as variaveis locais ao objetosem terem setado elas primeiro... por isso você deve estar recebendo um zero ai no calculo...

fantomas

Oi Manolo,

Ao meu ver vc tem que ( se estiver realmente afim) ler com muita calma um livro sobre POO o mais rápido possível.

Sem questionar os resultados do processamento percebo os seguintes problemas:

1) Atributos do tipo array e lista (em POO = agregação) não fica bem com nome no singular, denota que vc não sabe exatamente como se expressar na linguagem.

MetodosTriangulo  triangulo[] = new MetodosTriangulo[30];

2) Você utilizou uma palavra encontrada na teoria, que expressa um aspecto técnico, para criar o nome de uma classe. Os nomes das classes tem que ser compativeis com os que existem no contexto que está sendo analisado; no seu caso acredito que sera apenas "Triangulo" e não "MetodoTriangulo". Pesquise sobre análise OO. A principio no seu contexto existe apenas um objeto: o Triangulo.

public class MetodosTriangulo {

3) Normalmente não se cria atributos para manter resultados de calculos em um objeto, e muito menos processar o resultado no momento em que os valores foram atribuidos. No máximo vc verifica a validade dos valores atribuidos; vc poderia querer evitar a atribuição de valores negativos para a base do triangulo. Outra razão para não fazer isto seria o fato do usuário do objeto não querer calcular nada simplesmente obter os valores do triangulo, ou seja, calculou sem necessidade. Este tipo de coisa ( o calculo ) poderia ser feito em um método a parte. Ex. obterArea() ou calcularAreaTotal(), etc...

public void setTriangulo(double n, double m){  
     this.resultado=(base*altura)/2;  
       
  }

4) Ao colocar o nome MetodoTriangulo na classe mostra claramente que vc não sabe a diferença entre método e classe.

Minha opinião.

flws

zoren

Bom, além de tudo isso, vc criou um array com o objeto

e usou os métodos sem instância-lo antes

triangulo[i] = new MetodosTriangulo();
ViniGodoy

Ia postar e vi o do fantomas. Tirou as palavras da minha boca.

pvrsouza

Eu faria assim:

public class Principal {

    public static void main(String[] args) {

        double base;
        double altura;
        Scanner input = new Scanner(System.in);
        Triangulo triangulos[] = new Triangulo[5];

        for (int i = 0; i < triangulos.length; i++) {
            System.out.println(" Informe a base do " + i + " triangulo: "+ i);
            base = input.nextFloat();

            System.out.println(" Informe a altura do " + i + " triangulo:"+ i);
            altura = input.nextFloat();

            triangulos[i] = new Triangulo(base, altura);
        }

        for (int i = 0; i < triangulos.length; i++) {
            System.out.println(" Triangulo" + i + " tem area:" + triangulos[i].getArea());
        }


    }
}
public class Triangulo {

    private double base;
    private double altura;
    private double area;

    //melhor já setar no construtor pra este caso
    public Triangulo(double base, double altura){
        this.base = base;
        this.altura = altura;
    }

    public double getArea() {
        return this.area = (this.base * this.altura) / 2;
    }
}
sergiotaborda

pvrsouza:
Eu faria assim:

(…)

Com certeza a melhor maneira.
Melhor que isso só se não usar arrays.

manolo , veja que a diferença não é apenas no codigo é no conceito. Vc disse que tinha 30 triangulos, mas a sua classe se chama MetodosTriangulo , isso causa um de-sincronismo entre o seu modelo e o seu codigo. E isso leva aos erros. Além disso, se vc quer a área não faz sentido ter um método getTriangulo que retorna um numero. ou é getArea ou retorna um objeto Triangulo.

Felipe_Gomes

A dúvida do manolo permitiu o esclarecimento de vários conceitos importantes sobre POO.
Para mim que sou iniciante está sendo ótimo ler os posts.

Parabéns à comunidade!

pvrsouza

Confesso que esta lista tb me ensina muito!!

manolo

[b]Opa pessoal, fiquei muito feliz pelo retorno de todos, muito obrigado :thumbup:

Acabei de ir a faculdade pegar o livro do Horstmann, core JAVA 2. Estou dando uma lida no capitulo sobre POO, mais acho que todos aqui já passarão por essa dificuldade inicial ao conceito de orientação a objetos, que na minha opinião e bem chatinho no começo!

Queria agradecer ao “fantomas”, que deu algumas dicas que achei de suma importância! E também ao “pvrsouza”, pois testei o código e ficou como o esperado. Obrigado!

O que estou dando uma boiada legal, e esse lance do this, mais vou correr atras para saber o que é :slight_smile:

Pessoal, muito obrigado pela ajuda de todos, tenho que resolver mais 3 exercícios aqui espero que de certo, mais foi muito valiosa a opniao de vcs, vlwww.

Abraços.[/b]

pvrsouza
manolo:
Queria agradecer ao "fantomas", que deu algumas dicas que achei de suma importância! E também ao "pvrsouza", pois testei o código e ficou como o esperado. Obrigado!
Falow! Tamos ai para ajudar e ser ajudado! :)
manolo:
O que estou dando uma boiada legal, e esse lance do this, mais vou correr atras para saber o que é :)

O "this" significa que o atributo ou método pertence ao Objeto. Quando vc estudar o modificador "static" vc vai ver que isso faz diferença, já que um atributo static pertence a classe e não ao objeto.

O this é obrigatório quando vc quer diferenciar um parametro do atributo do objeto que tenha o mesmo nome. Mas, quando esta necessidade não acontece, é uma boa prática colocar o "this" para referenciar os atributos e métodos. Veja:
public class Estudo {

    private String minhaVariavel;

    public void setMinhaVariavel(String minhaVariavel){
        //this.minhaVariavel é a variável do objeto.
        //minhaVariavel é a variável que vem do parâmetro.
        this.minhaVariavel = minhaVariavel;
    }

}

No caso de atributo static ficaria diferente, já que ela pertence a classe:

public class Estudo {

    private static String minhaVariavel;

    public void setMinhaVariavel(String minhaVariavel){
        //Estudo.minhaVariavel é a variável da classe. POr isto o nome da classe vai primeiro.
        //minhaVariavel é a variável que vem do parâmetro.
        Estudo.minhaVariavel = minhaVariavel;
    }

}

Eu tb sou novato em Java, então se eu estiver errado me avisem! :D

ViniGodoy

O livro Core Java é para quem já programa em alguma outra linguagem (C++). Nesse caso, é um dos melhores livros que existem (e inclusive o que mais gostei de ler). Para quem não programa muito ainda ele não é recomendado. Há diversos trechos que ele fala coisas como: “O comando while funciona da maneira tradicional”, assumindo que quem lê está familiazado com “a maneira tradicional”.

Bons livros para quem ainda tem dificuldade nessa parte são o do Deitel ou o Use a Cabeça Java.

pvrsouza

E eu acredito que o Deitel tenha que vir primeiro. Para pessoa não familizarizada, o Use a Cabeça Java é meio confuso. Pelo menos eu achei. Estou lendo o Deitel e complemento meu estudo com o Use a Cabeça Java para fixar mais os conceitos.

manolo

[b]Vou dar uma olha nesses livros sugeridos. Realmente estou achando o Core Java meio esquisito, vou pegar o Deitel hoje e fazer uma comparação!

Vlwww pessoal.[/b] :smiley:

pvrsouza

Bons estudos!

Criado 8 de março de 2010
Ultima resposta 8 de mar. de 2010
Respostas 15
Participantes 9