Duvida sobre Oritentação a Objetos

Boa tarde a todos do Guj.
Sou iniciante, e estou estudando java aos poucos, no momento a parte de orientação a objetos.
Bem estou com um pequeno projeto pessoal, coisa simples mesmo, apenas tem lá no projeto um JFrame, com um botão para calcular, um textField de ‘lado’ do quadrado e outro textField ‘area’ do mesmo. Dai criei uma classe quadrado.java e o principal que contem o Jframe.
Gostaria muito que dessem uma olhada no código e me informassem se o que fiz é realmente Orientação a Objetos( inclusive se são boas práticas), se falta alguma coisa e se estou no caminho certo da coisa.

public class quadrado {
double lado;
double area;
    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }

    public double getLado() {
        return lado;
    }

    public void setLado(double lado) {
        this.lado = lado;
    }

    void calcula_area(){
        this.area = this.lado*this.lado;
    }

}

Este é no caso o codigo do botão Calcular

quadrado quad = new quadrado();
quad.setLado(Double.valueOf(tf_lado.getText()));
quad.calcula_area();
tf_resposta.setText(String.valueOf(quad.getArea()));

Muito Obrigado desde já. :slight_smile:
Até breve.

Sim, o que você fez é orientação a objetos e você está no caminho certo. Apenas duas considerações:

1 - É recomendável que os atributos sejam protected, já que os métodos de acesso a seus atributos são public, seus atributos devem ficar protegidos.

2 - Não há necessidade do atributo area, você poderia retornar a multiplicação no método calcula_area().

Abraço.

Bom OO vai além de criar uma classe, com atributos e métodos getters e setters.

Utilizando teu exemplo e, se agora fosse preciso criar uma classe Triangulo, o que você reaproveitaria de Quadrado? Só atributos?

Nesse caso, era preferível ter criado uma classe FiguraGeometrica (seguindo o CamelCase), contendo os atributos lado e area.
Então, criar as classes Quadrado, Triangulo e quaisquer outras que fossem precisas, inserindo outros atributos específicos (altura, no caso da Triangulo, pi, no caso de Circulo, por exemplo) e sobrescrever o método calculaArea, fazendo com que, de acordo com o tipo de FiguraGeometrica, o cálculo fosse readequado.

Aí utilizaríamos 2 dos principais conceitos de OO, herança, pois Quadrado e Triangulo seriam herdeiras de FiguraGeometrica e polimorfismo, pois o método calculaArea seria reescrito de acordo com cada classe filha.

Outra coisa, java, por convenção, não aceita o underscore em nomes de classes, atributos e métodos.
A especificação javaBeans determina que seja utilizado o camelCase, sendo que para os nomes de classes, a primeira letra é maiúscula e, para atributos e métodos, a primeira é minúscula:
Classes:
File
Quadrado
Filme
Casa
ParteDoCorpo
JOptionPane
ArrayList

Atributos:
area
duracao
porta
areaTotal
perimetroDaFigura

Métodos:
calculaArea()
contaDuracao()
setPorta(Porta porta)

Etc.

Como estamos falado de um quadrado,
eu eliminaria o atributo “area”, já que a área do quadrado é lado * lado
Inicializaria o dado com um valor default
colocaria o atributo lado como private - para que somente a classe Quadrado possa alterar este atributo
acrescentaria a verificação nos métodos “setters” - a não ser que vc queira um quadrado de lado negativo (impossível)
No método setArea, altero o lado em virtude do valor da area

Mais ou menos isto:
public class Quadrado {  
    private double lado = 10; //atributo como private e com um valor padrão
      
    public void setLado(double lado) {  
    	if (lado > 0){  //verifica se o dado de entrada é válido
    		this.lado = lado;
        }
    }
    
    public void setArea(double area) {  
    	if (area > 0){   //verifica se o dado de entrada é válido
    		this.lado = Math.sqrt(area);  //calcula o valor do lado em virtude da área
        }
    }  
      
    public double getLado() {  
    	return this.lado;  
    }  
    
    public double getArea() {  
    	return this.lado*this.lado;  
    }
}

Desta forma você mantem o encapsulamento e ainda garante a consistência dos atributos da classe.

Muito Obrigado a todos pelas respostas, ajudaram muito mesmo, devo agradecer também a rapidez para responderem. Só gostaria de mais uma coisa, não é bem uma duvida, é mais um pedido mesmo. Só para esclarecer melhor de como deixar o atributo area de lado, alguem poderia dar exemplos simples de como fazer métododos CalculaArea, para um triangulo por exemplo.
Até Breve!

Dê uma olhada nessas classes:

public class Escaleno {
	
	protected double ladoA, ladoB,ladoC;

	public Escaleno(double ladoA, double ladoB, double ladoC) {
		this.ladoA = ladoA;
		this.ladoB = ladoB;
		this.ladoC = ladoC;
	}

	public double getLadoA() {
		return ladoA;
	}

	public void setLadoA(double ladoA) {
		this.ladoA = ladoA;
	}

	public double getLadoB() {
		return ladoB;
	}

	public void setLadoB(double ladoB) {
		this.ladoB = ladoB;
	}

	public double getLadoC() {
		return ladoC;
	}

	public void setLadoC(double ladoC) {
		this.ladoC = ladoC;
	}
	
	public double Area(){
		return Math.sqrt(Perimetro()*(Perimetro()-ladoA)*(Perimetro()-ladoB)*(Perimetro()-ladoC));
	}
	
	public double Perimetro(){
		return ( ladoA + ladoB + ladoC )/2;
	}
public class Isosceles {
	
	protected double ladoA, ladoB;

	public Isosceles(double ladoA, double ladoB) {
		this.ladoA = ladoA;
		this.ladoB = ladoB;
	}

	public double getLadoA() {
		return ladoA;
	}

	public void setLadoA(double ladoA) {
		this.ladoA = ladoA;
	}

	public double getLadoB() {
		return ladoB;
	}

	public void setLadoB(double ladoB) {
		this.ladoB = ladoB;
	}
	
	public double Area(){
		return Math.sqrt(Perimetro()*(Perimetro()-ladoA)*(Perimetro()-ladoB)*(Perimetro()-ladoB));
	}
	
	public double Perimetro(){
		return ( ladoA + ladoB + ladoB )/2;
	}

}
public class Equilatero {
	
	protected double lado;

	public Equilatero(double lado) {
		this.lado = lado;
	}

	public double getLado() {
		return lado;
	}

	public void setLado(double lado) {
		this.lado = lado;
	}
	
	public double Area(){
		return (Math.pow(lado, 2)*Math.sqrt(3))/4;
	}

}

Veja se te ajuda. Abraço.

Para caulcular a área do Triangulo, vc precisaria da base e da Altura, neste caso vc teria uma classe Triangulo (filha da classe FiguraGeometrica), a classe Triangulo iria sobrescrever o método calculaArea();

  public double calculaArea(){
     return  ((this.base*this.altura)/2);
   }