gpt4 book ai didi

java - toString() 和重写方法的问题

转载 作者:行者123 更新时间:2023-12-02 08:57:10 26 4
gpt4 key购买 nike

我的这段代码有问题。它没有正确计算面积。我需要它来计算气缸/活塞的横截面积和气缸的表面积。如果您注意到输出,那么当我使用 getArea() 方法时,这两个值似乎是相同的值。 Java 对于使用什么 getArea() 感到困惑?强文本我试图用 getArea() [横截面积] 覆盖 getArea() [表面积],但它不起作用?

import java.util.Scanner;

class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println(
"\n\nInput the radius, then the height, then if the cylinder is filled (input 1 if it is filled and input 0 if not, and then enter the color");

double radius = scan.nextDouble();
double height = scan.nextDouble();
int filled = scan.nextInt();

boolean isFilled;
if (filled == 1) {
isFilled = true;
} else {
isFilled = false;
}

String c = scan.nextLine();
String x = scan.nextLine();

Cylinder cyl = new Cylinder(radius, height, isFilled, x);
System.out.println("\n\n This is a Cylinder and its properties");
System.out.println(cyl);

Piston small= new Piston();
System.out.println ("\n\n This is small Piston");
System.out.println(small);

Piston big = new Piston(55.6, 1234.4, true, "red", 1200, 12.3);
System.out.println ("\n\n This is big Piston");
System.out.println(big);
}
}

class Shape {
private String color = "yellow";
private boolean filled;

public Shape() {

}

public Shape(String color, boolean filled) {

this.color = color;
this.filled = filled;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

public boolean isFilled() {
return filled;
}

public void setFilled(boolean filled) {
this.filled = filled;
}

public String toString() {
return "\nThe color is : " + color + " and shape fill is : " + filled;

}

}

class Cylinder extends Shape {
private double cylinderRadius;
private double cylinderHieght;

public Cylinder() {
cylinderHieght = 10;
cylinderRadius = 2.5;
}

public Cylinder(double height, double radius) {
cylinderRadius = radius;
cylinderHieght = height;
}

public Cylinder(double height, double radius, boolean filled, String color) {
super(color, filled);
cylinderRadius = radius;
cylinderHieght = height;
}

public double getRadius() {
return cylinderRadius;
}

public double getHieght() {
return cylinderHieght;
}

public double getArea() {
double p = 3.14;
return 2 * p * cylinderRadius * cylinderRadius + 2 * p * cylinderRadius * cylinderHieght;
}

public double getVolume() {
double p = 3.14;
return p * cylinderRadius * cylinderRadius * cylinderHieght;
}

@Override
public String toString() {
return super.toString() + " \nRadius= " + cylinderRadius + " Height= " + cylinderHieght
+ " Cylinder total surface Area= " + getArea() + " volume= " + this.getVolume() + ".";
}
}

class Piston extends Cylinder{
private double shaftLength;
private double myPressure;

public Piston(){
shaftLength=1;
myPressure=1;
}
public Piston(double height, double radius, boolean filled, String color, double length, double pressure){
super(height, radius, filled, color);
shaftLength=length;
myPressure=pressure;
}
public double getShaftLength(){
return shaftLength;
}
public double getPressure(){
return myPressure;
}
@Override
public double getArea(){
return getRadius()*getRadius()*3.14;
}
public double getVolume(){
return super.getVolume();
}
@Override
public String toString(){
return super.toString()+"\n the cross sectional area of Piston = "+this.getArea()+" shaftlength="+shaftLength+" pressure="+myPressure+" .";
}
}

这是如果我输入半径为 5 和高度为 10 时的输出。

Input the radius, then the height, then if the cylinder is filled (input 1 if it is filled and input 0 if not, and then enter the color 5 10 1 Blue

This is a Cylinder and its properties

The color is : Blue and shape fill is : true Radius= 10.0 Height= 5.0 Cylinder total surface Area= 942.0 volume= 1570.0.

This is small Piston

The color is : yellow and shape fill is : false Radius= 2.5 Height= 10.0 Cylinder total surface Area= 19.625 volume= 196.25. the cross sectional area of Piston = 19.625 shaftlength=1.0 pressure=1.0 .

This is big Piston

The color is : red and shape fill is : true Radius= 1234.4 Height= 55.6 Cylinder total surface Area= 4784554.150400002 volume= 2.6602121076224005E8. the cross sectional area of Piston = 4784554.150400002 shaftlength=1200.0 pressure=12.3 .

最佳答案

澄清一下——情况似乎是这样:

  1. 您有一个类 (Cylider),它定义了一种方法 (getArea()) 来执行一件事。 Cylider 上的另一个方法 (toString()) 调用 getArea() 方法。
  2. 然后,您使用子类型 (Piston) 对 Chylidar 进行子类化,并重写 getArea() 函数来执行不同的操作.
  3. 现在,当您在 Cylider 类中编写 getArea() 方法时,您希望它使用 Cylider 版本getArea() 因为代码是在同一个类中编写的,但实际上它使用了 Piston 版本的 getArea( ) 因为你调用它的对象实际上是一个活塞

这并不是一个真正的错误,甚至不是一个需要解决的问题——它只是 Java 如何解析方法调用的一个函数。考虑到您正在使用的对象的实际类型,它会选择最具体的一个(即使在编译时该类型并不明显)不是最接近调用者视线的位置。

确实没有办法解决这个问题。我认为这表明你的设计很糟糕——或者至少不符合习惯。重写函数旨在为您提供一种不同的、更正确的方法来计算不同类型相同想法,而不仅仅是作为重用函数名称的一种方式。

最简单的更改可能是在 Cylinder 上创建一个名为 getCylinderArea() 的新方法。默认情况下,Cylider.getArea() 可以调用此函数,但如果您希望该函数仅使用普通 Cylinder,则可以在 Cylider.toString() 中显式调用它面积计算方法。

或者,也许活塞实际上不应该是Cylinder的子类型,因为即使它们共享一些特征,活塞也不能在您使用气缸的任何地方替代通用气缸——例如计算面积时。查找Substitution Principle了解更多。

不过,就我个人而言,正是出于这种原因,我倾向于完全远离继承。实际上,在这种情况下,我建议只使用接口(interface)和平面层次结构。

This StackOverflow thread如果您想了解有关调用 super 方法的更多详细信息,可能会很有趣。

关于java - toString() 和重写方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60424901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com