如何将价值发送到您正在扩展的课程?

时间:2017-03-23 05:29:08

标签: java constructor

这个问题可能听起来多余,因为标题与this other question完全相同。但是,有一个简单的区别 - 我的构造函数中没有给出返回类型。话虽如此,我必须做一些同样愚蠢的事情,而我似乎无法弄清楚是什么。我见过类似的执行工作here。为什么它不能用于我的代码?

这是演示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());
    }
} 

问题描述

麻烦的是,this answer表明同样的事情执行得很好,而在Netbeans中,我得到call to super must be first statement in constructor错误。错误显示在super(pi)。我希望能够将的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());
    }
} 

我错过了什么?

4 个答案:

答案 0 :(得分:2)

为什么它不能用于我的代码?

因为super(pi)应该从Circle(double pi)调用

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

不是来自soutresult()

  

super(pi)实际上是对父级构造函数的调用,在您的情况下,无法从soutresult()调用此函数。

此外,在Calculate类中,您必须添加一个接收double类型参数的构造函数:

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

有关super()的更多信息,请查看super() in Java

答案 1 :(得分:0)

class Calculate{
    double radius = 10.0;
    double pi;

    Calculate(){}

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

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

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

    Circle(){}

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

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

super()只能在构造函数中调用。但是你可以在其他成员函数中调用super。 memberfunctionane 。当您使用Circle(4.3)创建一个对象时,会调用super,但是由于Calculate(double pi)初始化pi,您需要执行this.pi = pi并且不需要声明另一个具有相同名称的变量

答案 2 :(得分:0)

除了许多评论之外,我还没有完全了解你在这里想要做的事情。

但是,错误的最直接原因是您尝试从method super()拨打public void soutresult()这不起作用,因为方法不是{ {3}} 超级是一种非常特殊的调用,只能在构造函数中使用。

构造函数没有返回类型。 Circle的构造函数看起来像public Circle(double testPI)调用super(testPi);等同于说"使用testPI值设置计算部分内容。"您还需要在public Calculate(double pi)类中定义适当的Calculate构造函数。

答案 3 :(得分:0)

听从流行的建议,我已经改变了一点代码。这是新版本。它传递非最终变量而不是pi。我原本使用了pi的定义。虽然有concerns about passing a final variable和一些不幸的混淆,但我的目的是展示我之前读过的另一个snippet of code。现在,我理解为什么我的代码没有提前运行。我感谢每个人的反馈,也想知道我能做些什么来使这更好(因为someone mentioned that my code's a big mess。请指出以便我可以学习)

这是较新的版本。我评论过这个目标。这显然是一个模糊的练习,我只是想让它变得有趣。我希望得到关于如何使这更好(及其缺点!)的反馈,同时忠实于下面列出的目标。

/**
 * 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;
//    }
}