覆盖Java的问题(继承)

时间:2016-03-30 00:25:08

标签: java inheritance overloading override

计算正方形或矩形的面积。 帮助,所以我必须应用继承,覆盖,或许根据语句重载,这里当我尝试计算矩形区域时结果是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!");
    }
}

3 个答案:

答案 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}}方法,FigureSquare继承。

答案 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! 
        }

    }
}