[英]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()
方法,而Square
從Rectangle
繼承了它。
您既不重載也不覆蓋。 你只是在躲。
重載是指在已經存在同名但簽名不同的方法的類中添加方法。
覆蓋是指在超類包含具有相同名稱和簽名的方法的類中添加用@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.