2016-03-15 85 views
1

我只是一个Java初学者。在做一些练习时,我遇到了一些困惑:我们可以在只有类引用的另一个类的构造函数中使用一个类的方法吗?如果不是,为什么这样呢?下面就让我试着解释:我们可以在其他类的构造函数中使用其他类的方法吗?

public class MyCircle { 

    private int radius; 
    private Point centre; 

    public MyCircle(int x,int y,int r){ 
     **centre.setX(x);** 
     **centre.setY(y);** 
     radius=r; 
    } 
    public MyCircle(Point p,int r){ 
     centre=p; 
     radius=r; 
    } 
    public int getRaduis(){ 
     return radius; 
    } 
    public void setRadius(int r){ 
     radius=r; 
    } 
    public Point getCentre(){ 
     return centre; 

    } 
    public void setCentre(Point p){ 
     centre= p; 

    } 
    public int getCenterX(){ 
     return centre.getX(); 
    } 
    public int getCenterY(){ 
     return centre.getY(); 

    } 
    public void setCentreXY(int x,int y){ 
     centre.setXY(x,y); 

    } 
    public double getArea(){ 
     return Math.PI*radius*radius; 
    } 
} 

在第一构造centre.setX()center.setY()显示错误在编译时,分别为,如果我把center = new Point(x,y)程序编译容易。

另外方法center.setX()center.setY()setcenterXY()不会产生任何问题。

下面

是Point类:

public class Point { 

    private int x; 
    private int y; 

    public Point(){ 
     x=8; 
     y=9; 
    } 
    public Point(int x,int y){ 
     this.x=x; 
     this.y=y; 
    } 

    public int getX(){ 
     return x; 
    } 

    public int getY(){ 
     return y; 
    } 

    public void setX(int x){ 
     this.x=x; 
    } 
    public void setY(int y){ 
     this.y=y;  
    } 
    public void setXY(int x,int y){ 
     this.x=x; 
     this.y=y; 
    } 

    public double distanceXY(int x,int y){ 
     int diffX=this.x-x; 
     int diffY=this.y-y; 
     return Math.sqrt(diffX*diffX+diffY*diffY); 
    } 

    public double distanceXY(Point p){ 
     int diffX=this.x-p.x; 
     int diffY=this.y-p.y; 
     return Math.sqrt(diffX*diffX+diffY*diffY); 
    } 
} 
+0

'centre.setX()'如果你不初始化您所呼叫的'空.setX()' –

+0

它不会编译,因为在构造函数中访问它之前,您尚未初始化'center'。这就是为什么当你初始化它时,它编译得很好。基本上只是'center.setX'在null上调用'setX',而'center = new Point(x,y)'将center的值设置为null以外的值。 –

+0

@OriLentz它会编译好,它不会运行。 –

回答

1

正如评论描述您的文章,呼吁centre.setX(x)centre.setY(y)将不起作用,因为您尚未初始化centre,因此没有任何对象可以拨打setX(x)setY(y)方法。

这是一个简单的修复,虽然,只是初始化centre与传递到构造函数的值,就像这样:

public MyCircle(int x, int y, int r){ 
    this.centre = new Point(x, y); 
    this.radius = r; 
} 
0

做你想要的东西的方式是使用Point构造从MyCircle构造:

public class MyCircle { 

    private int radius; 
    private Point centre; 

    public MyCircle(int x, int y, int r){ 
    center = new Point(x,y); 
    radius = r; 
} 
相关问题