这个问题可能听起来多余,因为标题与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());
}
}
我错过了什么?
答案 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;
// }
}