关于java的new对象问题
publicclassCircle{privatePointcenter;privateintr;publicCircle(){}publicCircle(Pointce...
public class Circle {
private Point center;
private int r;
public Circle(){}
public Circle(Point center, int r){
this(center.x, center.y, r);
}
public Circle(int x, int y, int r){
this.center.x = x;
this.center.y = y;
this.r = r;
}
public static void main(String[] args){
Circle c1 = new Circle();
c1.center = new Point(0,0);
Circle c2 = new Circle(c1.center, 6);
}
}
public class Point {
int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
运行会报空指针异常,我想问一下Circle c2 = new Circle(c1.center, 6);这一句中c1.center已经初始化了,为什么还会报异常?另外这一句可不可以理解成把c1.center赋给c2.center?高手们,谢谢了! 展开
private Point center;
private int r;
public Circle(){}
public Circle(Point center, int r){
this(center.x, center.y, r);
}
public Circle(int x, int y, int r){
this.center.x = x;
this.center.y = y;
this.r = r;
}
public static void main(String[] args){
Circle c1 = new Circle();
c1.center = new Point(0,0);
Circle c2 = new Circle(c1.center, 6);
}
}
public class Point {
int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
运行会报空指针异常,我想问一下Circle c2 = new Circle(c1.center, 6);这一句中c1.center已经初始化了,为什么还会报异常?另外这一句可不可以理解成把c1.center赋给c2.center?高手们,谢谢了! 展开
展开全部
你好,修改后的代码如下,关键处我做了注释。
class Point {
int x,y;
public Point(){}
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
public class Circle {
private Point center = new Point(); //记得实例化这个的....
private int r;
public Circle(){}
public Circle(Point c, int r){
this(c.x, c.y, r);
}
public Circle(int x, int y, int r){
this.center.x = x; //开始问题根源在这,center没有实例化,默认为null
this.center.y = y; //开始问题根源在这,center没有实例化,默认为null
this.r = r;
}
public static void main(String[] args){
Circle c1 = new Circle();
c1.center = new Point(0,0);
Circle c2 = new Circle(c1.center, 6);
}
}
class Point {
int x,y;
public Point(){}
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
public class Circle {
private Point center = new Point(); //记得实例化这个的....
private int r;
public Circle(){}
public Circle(Point c, int r){
this(c.x, c.y, r);
}
public Circle(int x, int y, int r){
this.center.x = x; //开始问题根源在这,center没有实例化,默认为null
this.center.y = y; //开始问题根源在这,center没有实例化,默认为null
this.r = r;
}
public static void main(String[] args){
Circle c1 = new Circle();
c1.center = new Point(0,0);
Circle c2 = new Circle(c1.center, 6);
}
}
追问
center是非静态的,c1.center = new Point(0,0);这一句把c1对应的center实例化了,然后Circle c2 = new Circle(c1.center, 6);这一句里c1.center被传递进去了,然后调用public Circle(int x, int y, int r)这个构造方法,那这个构造方法里的this.center.x指的是c1.center.x还是c2.center.x呢?
追答
呵呵,我先给你分析下你先前的程序吧。
关键是你还没有完全理解初始化顺序。针对你先前程序的执行流程如下:
1、先初始化成员变量
private Point center ; //这个默认初始化为null
private int r; //这个默认初始化为0
2、然后进入main方法
执行->Circle c1 = new Circle(); //这句同样引起成员变量的初始化,public Circle(){} 被调用
在执行->c1.center = new Point(0,0); //普通赋值
在执行->Circle c2 = new Circle(c1.center, 6); //关键是这句,我们下面详细分析。
在执行这句的时候,又创建了一个新的对象,所以:
先引起成员变量的初始化,此时C2中的center默认值就是null了,然后调用构造方法:
public Circle(Point c, int r){ this(c.x, c.y, r); }
这个构造方法又将调用构造方法public Circle(int x, int y, int r) 好吧,问题出现了,注意:
此时构造方法中的center就是我注释中的,状态还是null,所以null.x就空指针了,如下:
this.center.x = x; //开始问题根源在这,center没有实例化,默认为null
this.center.y = y; //开始问题根源在这,center没有实例化,默认为null
this.r = r;
经过我这么详细的分析,你明白了吧。
展开全部
new Circle(c1.center, 6) 调用构造函数public Circle(int x, int y, int r) 中this.center,这个Point未初始化
把private Point center; 改成 private Point center = new Point(0,0); 就可以了
不能理解成赋值
把private Point center; 改成 private Point center = new Point(0,0); 就可以了
不能理解成赋值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public class Circle {
private Point center; //楼主你的问题出在这,java里,你要把一个类写为另一个类的成员时,必须要new出来, 这句改成 private Point center = new Point(); 同时你的Point类也要加一个无参的构造方法
}
private Point center; //楼主你的问题出在这,java里,你要把一个类写为另一个类的成员时,必须要new出来, 这句改成 private Point center = new Point(); 同时你的Point类也要加一个无参的构造方法
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询