计算正方形或矩形的面积。 帮助,所以我必须应用继承,覆盖,或许根据语句重载,这里当我尝试计算矩形区域时结果是0.0我相信这是因为我的子类中的asignar(assign)方法没有覆盖一个来自超类。 此外,该程序是否有效地应用了继承和覆盖(除了我遇到的问题)?
import java.io.*;
class AreaF {
private double lado; // side
public void asignar(double b) {
lado = b;
}
public double traerL() {
return lado;
}
}
class Cuadrado extends AreaF {
public double area() {
double a;
a = Math.pow(traerL(), 2);
return a;
}
}
class Rectangulo extends AreaF {
private double altura; // height
public void asignar(double h) {
double altura = h;
}
public double area() {
double a;
a = traerL() * altura;
return a;
}
}
public class Pro2 {
public static void main(String[] args) throws IOException {
double b = 0, h = 0;
int op;
Cuadrado obj = new Cuadrado(); // square
Rectangulo obj2 = new Rectangulo(); // rectangle
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Ingrese la base: ");
try {
b = Double.parseDouble(br.readLine());
} catch (NumberFormatException x) {
System.out.println(x);
}
obj.asignar(b);
/**
* 1 - for square
* 2 - for rectangle
*/
System.out.println("Ingrese 1 para saber el area de CUADRADO, 2 para RECTANGULO");
op = Integer.parseInt(br.readLine());
if (op == 1) {
System.out.println("El area del cuadrado es: " + obj.area()); // sq
// area
} else if (op == 2) {
System.out.println("Ingrese la altura del rectangulo: "); // height
try {
h = Double.parseDouble(br.readLine());
} catch (NumberFormatException x) {
System.out.println(x);
}
obj2.asignar(h);
System.out.println("El area del rectangulo es: " + obj2.area()); // rct
// area
} else
System.out.println("Error!");
}
}
答案 0 :(得分:2)
我不确定这项任务的目标是什么,但我会选择以下类层次结构:
interface Figure { // also abstract class can be used there
abstract double area();
}
class Rectangle implements Figure {
private double width;
private double height;
Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
double area() {
return width * height;
}
}
class Square extends Rectangle {
public Square(double side) {
super(side, side);
}
}
我简化了main
方法,但我认为这个想法很明确:
public static void main(String[] args) {
final Rectangle rectangle = new Rectangle(3, 5);
System.out.println("rectangle.area() = " + rectangle.area()); // result is 15.0
final Square square = new Square(3);
System.out.println("square.area() = " + square.area()); // result is 9.0
}
因此,Rectangle
覆盖area()
的{{1}}方法,Figure
从Square
继承。
答案 1 :(得分:1)
你既不是超载也不是压倒一切。你只是在躲藏。
重载是指在类中添加一个方法,其中已存在具有相同名称但签名不同的方法。
重写是指在类中添加了一个标有@Override
属性的方法,该类的超类包含一个具有相同名称和签名的方法。
隐藏与覆盖类似,但添加的方法未标有@Override
,这就是您在此处所做的。
这个问题的答案
这个程序是否有效地应用了继承和覆盖(除了我遇到的问题)?
否。
我认为你应该改变整个设计。
注意:以下所有内容都是我自己的意见。
AreaF
应该是一个抽象类,甚至是一个接口。我认为接口更合适,但似乎你的任务需要你使用继承。所以让我们把它改成一个抽象类:
public abstract class AreaF {
public abstract double getArea();
}
我看到你有一个正方形和一个矩形作为AreaF
的基类。让我们实现它们:
public class Square extends AreaF {
private double length;
public double getLength() { return length; }
public void setLength(double length) { this.length = length; }
@Override // I overrode the getArea method in the super class
public double getArea() {
return getLength() * getLength();
}
}
这是Rectangle类:
public class Rectangle extends AreaF {
private double width, height;
// public getters and setters for width and height. You know what I mean.
@Override
public double getArea () {
return getWidth() * getHeight();
}
}
然后您可以相应地使用这些方法并获得正确的结果。
答案 2 :(得分:0)
您的代码存在很多问题。 1)缩进 2)英文名字。 3)你有一个逻辑错误。 Object1.lado = a,Object1.altura = 0;而Object2.lado = 0,Object2.altura = h ==> obj2.area = 0 ...(这是你的错误!)。
这是一个很好的代码。看看它,如果你有任何报价随意问。
import java.io.*;
class AreaF {
private final double lado;
public void asignarLado(double b) { //give mingfullnames (better in english!)
lado = b;
}
public double traerL() {
return lado;
}
}
class Cuadrado extends AreaF {
public double areaCuadrado() {
double a;
a = Math.pow(traerL(), 2);
return a;
}
}
class Rectangulo extends Cuadrado {
private double altura;
public void asignarAltura(double h) {
double altura = h;
}
public double areaRectangulo() {
double a;
a = traerL() * altura;
return a;
}
}
public class Pro2 {
public static void main(String[] args) throws IOException {
double b = 0, h = 0;
int op;
Cuadrado obj = new Cuadrado(); // square
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Ingrese la base: ");
b = Double.parseDouble(br.readLine());
obj.asignarBase(b);
System.out.println("Ingrese la altura del rectangulo: "); // height
h = Double.parseDouble(br.readLine());
obj.asignarAltura(h);
System.out.println("Ingrese 1 para saber el area de CUADRADO, 2 para RECTANGULO");
op = Integer.parseInt(br.readLine());
if (op == 1) {
System.out.println("El area del cuadrado es: " + obj.areaCuadrado());
else if (op == 2) {
System.out.println("El area del rectangulo es: " + obj.areaRectangulo());
}
else
System.out.println("Error!");
}
} catch (NumberFormatException x) {
System.out.println("Wrong arguments!");
}finally{
br.close; //allways close input resurce!
}
}
}
/// ------------------------------------------- 这是真正的O.O设计。 我使用了一个名为Area的方法的接口。 和两个类cube和rect类。这是真正的方法。
public interface Area{
public double getArea();
}
class Cuadrado implements Area {
double base;
public Cuadrado(double base){
setBase(base);
}
public void setBase(double base) {
this.base = base;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return base*base;
}
}
class Rectangulo extends Cuadrado {
private double hight;
public Rectangulo(double base,double hight){
super(base);
this.hight = hight;
}
public void setParams(double base,double hight) {
this.base = base;
this.hight = hight;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return base*hight;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Ingrese la base: ");
double b = Double.parseDouble(br.readLine());
System.out.println("Ingrese la altura del rectangulo: "); // height
double h = Double.parseDouble(br.readLine());
System.out.println("Ingrese 1 para saber el area de CUADRADO, 2 para RECTANGULO");
int op = Integer.parseInt(br.readLine());
if (op == 1) {
Area cuadrado = new Cuadrado(b); // square
System.out.println("El area del cuadrado es: " + cuadrado.getArea());
}
else if (op == 2) {
Area rectangulo = new Rectangulo(b,h);
System.out.println("El area del rectangulo es: " + rectangulo.getArea());
}
else{
System.out.println("Error!");
}
} catch (NumberFormatException x) {
System.out.println("Wrong arguments!");
}finally{
br.close(); //allways close input resurce!
}
}
}