当前位置: 首页 > 知识库问答 >
问题:

如何向要扩展的类发送值?

向杜吟
2023-03-14

这个问题可能听起来多余,因为标题和另一个问题完全一样。然而,有一个简单的区别——我没有在构造函数中给出返回类型。话虽如此,我一定是在做其他同样愚蠢的事情,我似乎不知道是什么。我在这里看到了类似的执行工作。为什么它不适用于我的代码?

这是演示final关键字如何工作的代码的一部分(忽略注释):

class Calculate{
    double radius = 10.0;
    double pi;

    final double circumference(){  //final method cannot be overridden
        return 2*pi*radius;
    }
}

final class Circle extends Calculate{ //final class cannot be extended
    double pi;

    Circle(){}

    Circle(double pi){
    this.pi = pi;
    }

    public void soutresult(){
        super(pi);
        System.out.println("The circumference of Circle is = "+circumference());
    }
} 

问题是,这个答案显示了同样事情的良好执行,而在Netbeans中,我得到了对super的调用必须是构造函数中的第一个语句的错误。误差显示在超(pi)处。我希望能够将圆周率的值发送到计算中

package on20170322;

/**
 *
 * @author Siddhant
 */
public class Question2{
    final double pi =22/7.0; //final variable sets constant value

    public static void main(String[] args) {
        Handler handler = new Handler();
        handler.sendFinalObject();
        Circle circle = handler.getFinalObject();
        circle.soutresult();
    }
}

class Handler{
    Question2 q2 = new Question2();
    Circle circle;
    double pi;
    Handler(){
        this.pi=q2.pi;
    }
    void sendFinalObject(){
        circle= new Circle(pi);
    }
    Circle getFinalObject(){
        return circle;
    }
}

class Calculate{
    double radius = 10.0;
    double pi;

    final double circumference(){  //final method cannot be overridden
        return 2*pi*radius;
    }
}

final class Circle extends Calculate{ //final class cannot be extended
    double pi;

    Circle(){}

    Circle(double pi){
    this.pi = pi;
    }

    public void soutresult(){
        super(pi);
        System.out.println("The circumference of Circle is = "+circumference());
    }
} 

我错过了什么?

共有3个答案

冯卓
2023-03-14

根据流行的建议,我对代码做了一些修改。这是新版本。它传递非最终变量,而不是pi。我在本机中使用了pi的定义。虽然有人担心传递最后一个变量,还有一些令人遗憾的困惑,但我的目的是展示我之前阅读的另一段代码。现在,我明白了为什么我的代码没有提前运行。感谢大家的反馈,我也想知道我能做些什么来改善这一点(因为有人提到我的代码一团糟。请指出,这样我可以学习)

这是最新的版本。我已经对目标进行了描述。这显然是一个模糊的练习,我只是想让它变得有趣。如果您能提供有关如何改进(及其缺点)的反馈,我将不胜感激同时忠实于以下概述的目标。

/**
 * WAJP to calculate circumference of circle using final & this keyword
 * 
 * We shall demonstrate the following things:
 * - Final variable can only be set once during runtime
 * - Final method cannot be overridden with @Override annotation
 * - Final class cannot be extended
 * - 'this' keyword is used to target the class that it is in
 * 
 * Execution Method:
 * - There are 4 classes with Question2 as the class with main function.
 * - The Handler class handles Get-Post request and creates abstraction layer
 * - Question2 demonstrates final variable property
 * - Handler demonstrates this keyword
 * - Circle demonstrates final class property
 * - Calculate demonstrates final method property
 */
package on20170322;

/**
 *
 * @author Siddhant
 */
public class Question2{
    final double radius =10.0; //final variable sets constant value

    public static void main(String[] args) {
        Handler handler = new Handler();
        handler.sendFinalObject();
        Circle circle = handler.getFinalObject();
        circle.soutresult();
    }
}

class Handler{
    Question2 q2 = new Question2();
    Circle circle;
    double radius;
    Handler(){
        this.radius=q2.radius;
    }
    void sendFinalObject(){
        circle= new Circle(radius);
    }
    Circle getFinalObject(){
        return circle;
    }
}

class Calculate{
    double radius;

    Calculate(double radius){
        this.radius = radius;
    }

    final double circumference(){  //final method cannot be overridden
        return 2*radius*Math.PI;
    }
}

final class Circle extends Calculate{ //final class cannot be extended

    Circle(double radius){
    super(radius);
    }

    public void soutresult(){
        System.out.println("The circumference of Circle, with radius(r)="+radius+", is (p)="+circumference());
    }
//    Overriding final methods is not possible
//    @Override
//    double circumference(){
//        return 2*radius*Math.PI;
//    }
}    
濮阳耀
2023-03-14

除了许多评论外,我不太明白你在这里想做什么。

然而,导致错误的直接原因是,您试图从方法public void soutresult()调用super(),这不起作用,因为该方法不是构造函数。Super是一个非常特殊的调用,只能在构造函数中使用。

构造函数没有返回类型。您的Circle的构造函数看起来像public Circle(双testPI)调用超级(testPi);相当于说“使用testPI值设置我的计算部分”。您还需要在计算类中定义适当的公共计算(双pi)构造函数。

朱炳
2023-03-14

因为超(pi)应该从Circle(双pi)调用为

Circle(double pi){
  super(pi);
  this.pi = pi;
}

不是来自soutresult()

Super(pi)实际上是对父级构造函数的调用,在您的情况下,这不能从soutresult()调用。

此外,在您的计算类中,您必须添加一个接收类型参数的构造函数,如下所示:

Calculate(double pi){
  this.pi = pi;
}

有关super()的更多信息,请参阅Java中的super()

 类似资料:
  • 我在下棋。我想做一个抽象的piece类,然后可以通过pawn/knight/rook/等进行扩展。假设我的piece类是这样的: 我希望Pawn具有相同的sayName功能,但我希望它具有不同的movePiece功能,因为Pawn有自己独特的移动方式。我怎么做典当,使它扩展件,并覆盖件的移动件功能?

  • 问题内容: 我用来生成输出一些数据。 我面临的问题是在创建和打开电子表格时,列不会展开,因此乍一看,某些长文本(如日期格式的文本)不会显示。 我可以双击excel中的列边框以展开或拖动边框以调整列宽,但是可能会有20多个列,并且每次打开电子表格时,我都不想手动进行此操作:( 我发现了(尽管可能是错误的方法),也许可以做到这一点,但没有运气。也许我以错误的方式使用它。 示例代码段 创建此电子表格后,

  • 问题内容: 我已经通过使用ApacheCXF(v3.0.4)实现了JAX-WS客户端,并且一切正常,但是当我想在Java 8(jdk1.8.0_25)中使用安全连接(SSL / TLS)时出现了问题。 我在日志(-Djavax.net.debug = all)中看到以下异常: 经过depeer分析后,我发现问题是由于Java 8不会发送server_name(SNI),而Java 7却发送了ser

  • 这是我现在面临的问题。我有一个类,假设 ,这个类定义了一个名为 的方法,该方法返回一个 实例。类 在 内部定义,并被声明为。我想做的是定义一个扩展的类,但我也我自己的功能(方法,属性等)来扩展。我也希望返回。 问题是< code>Bar是最终的。下面是我想做的一个例子: 我想做的是: 我怎样才能做到这一点? [编辑]我正在为我的问题添加更多详细信息。我实际上正在为 Jenkins 开发一个插件,搜

  • 问题内容: 有这样的事情: 抽象类: 和扩展器: 我想要的是扩展,因为如果不处理它,然后尝试在中处理它。例如add- 但同时让类处理默认值,例如。 这是完全错误的方法吗? 到目前为止,我所做的就是添加一个接口。通常: 在课堂上: 在课堂上: 这看起来像是可用的设计吗? 并且,主要问题: 有没有什么好办法扩展该类,以便可以使用与in 中相同的切换方法?我想知道的是,有没有一个更好的设计,第二个是是否

  • 问题内容: 我正在尝试扩展Python,以用于越野比赛的结果。我想从格式为string的对象构造一个对象。我可以使用工厂设计模式和注释来完成此操作。我将如何通过覆盖和/或完成相同的任务? 使用下面的代码,构造一个对象会引发TypeError。请注意,未调用,因为未打印。 这是错误: 如果将代码从移至,则会得到以下结果。注意这次,输出显示我的函数被调用了。 问题答案: 显然,对象是不可变的,这意味着