簡體   English   中英

覆蓋 Java 的問題(繼承)

[英]Overriding issues with Java (inheritance)

計算正方形或長方形的面積。 幫助,所以我必須應用繼承,覆蓋,也許根據語句重載,當我嘗試計算矩形的面積時,結果是 0.0 我相信這是因為我的子類中的 asignar(分配)方法沒有覆蓋那個來自超類。 另外,這個程序是否有效地應用了繼承和覆蓋(除了我遇到的問題)?

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!");
    }
}

我不太確定這個任務的目標是什么,但我會使用以下類層次結構:

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覆蓋了Figure area()方法,而SquareRectangle繼承了它。

您既不重載也不覆蓋。 你只是在躲。

重載是指在已經存在同名但簽名不同的方法的類中添加方法。

覆蓋是指在超類包含具有相同名稱和簽名的方法的類中添加用@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();
    }
}

然后您可以相應地使用這些方法並獲得正確的結果。

你的代碼有很多問題。 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! 
        }

    }
}

///------------------------------------------- 這是真實的面向對象設計。 我使用了一個接口,其中包含一個名為 Area 的方法。 和兩個類立方體和矩形類。 這是真正的方法。

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

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM