Java超类toString()和构造函数调用

Java super class toString() and constructor calling

我知道有类似的帖子,但没有一个完全适合我想做的。我是一个更新的程序员,刚刚开始阅读Java的超级类。我已经创建了一个名为shape的超级类。然后我创建了一个名为circle的子类。我在这里遇到了两个困难,从我的子类ToString方法调用我的父类中的ToString方法,以及从我的子类到我的超类中的一个构造函数。我在下面提供了我的超级类、子类和主要测试方法。

形状类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Shape
{
   private boolean isFilled;
   private String color;

   public Shape()
   {
      this.isFilled = true;
      this.color ="Green";

   }


   public Shape(boolean x, String y)
   {
      this.isFilled = x;
      this.color = y;
   }  

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

   public boolean getFilled()
   {
      return this.isFilled;
   }

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

   public String getColor()
   {
      return this.color;
   }


   @Override
   public String toString()
   {
      String s ="Filled:" + this.isFilled +"
"
;
      String t ="Color:" + this.color;
      String u = s + t;

      return u;

   }
}

圆圈:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Circle extends Shape
{
   private double radius;


   public Circle()
   {
      this.radius = 1;
   }

   public Circle(double x)
   {
      this.radius = x;
   }


   public Circle(double radius, boolean isFilled, String Color)
   {
      super(isFilled, Color);
      this.radius = radius;

   }


   public void setRadius(double radius)
   {
      this.radius = radius;
   }


   public double setRadius()
   {
      return this.radius;
   }


   public double getArea()
   {  
      double area = this.radius * this.radius * Math.PI;

      return area;
   }


   @Override
   public String toString()
   {

      String x ="Radius:" + this.radius +"
"
;
      String y ="Area:" + getArea() +"
"
;

      String z = x + y;
      return z;

   }    
}

测试形状:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestShape
{
   public static void main(String[] args)
   {

      Circle c1 = new Circle(2.67);
      System.out.println("c1:");
      System.out.println(c1.toString());
      System.out.println();

      Circle c2 = new Circle(3, false,"Red");
      System.out.println("c2:");
      System.out.println(c2.toString());
      System.out.println();
   }
}

预期输出:

1
2
3
4
5
6
7
8
9
10
11
c1:
Radius: 2.67
Area: 22.396099868176275
Filled: true
Color: Green

c2:  
Radius: 3.0
Area: 28.274333882308138
Filled: false
Color: Red

实际输出:

1
2
3
4
5
6
7
c1:
Radius: 2.67
Area: 22.396099868176275

c2:
Radius: 3.0
Area: 28.274333882308138


您的Circle类覆盖父toString方法的行为,并且不将父结果与自己的结果组合在一起。因此,您只看到Circle#toString方法计算的内容:

1
2
3
4
5
6
7
8
9
@Override
public String toString() {
    String x ="Radius:" + this.radius +"
"
;
    String y ="Area:" + getArea() +"
"
;
    String z = x + y;
    return z;
}

即半径和面积。

如果要添加父结果,需要使用super.toString()调用它,并将其与要添加的内容结合起来,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public String toString() {
    // Call parent
    String parentText = super.toString();

    // Own stuff
    String x ="Radius:" + this.radius +"
"
;
    String y ="Area:" + getArea() +"
"
;
    String z = x + y;

    // Combine with parent
    return z + parentText;
}


您正在重写toString()方法,但不调用超级类中的方法。您需要在子类中使用以下方法。

1
2
3
4
5
6
7
8
9
10
 public String toString()
 {
   String x ="Radius:" + this.radius +"
"
;
   String y ="Area:" + getArea() +"
"
;

   String z = x + y;
   return z + super.toString();
 }


假设您希望调用父类ToString(),而不是子类,那么在子类中重写了ToString()方法(在main()方法中显式调用),这是正常的情况。

使用父控制器构造子类的事实不会影响ToString(),因为您显式调用子类的重写ToString()。

如果希望父ToString()方法是执行的方法,可以调用并打印super.toString(),而不是c1.ToString()。