当前位置: 编程技术>移动开发
本页文章导读:
▪关于java的new对象有关问题 关于java的new对象问题
关于java的new对象问题
2011-11-8 21:10
提问者:hwhzw17 | 悬赏分:20 | 浏览次数:183次
public class Circle {
private Point center;
private int r;
public Circle(){}
public Circle(.........
▪ OC将http转义字符转化作中文 OC将http转义字符转化为中文
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
......
▪ 如次代码输出是?() 如下代码输出是?()
如下代码输出是?()class Window { Window(int i) { System.out.print(i+" ");}} class House { Window w1 = new Window(1); House() { System.out.print(" 2 "); w2 = new Window(3); } Windo.........
[1]关于java的new对象有关问题
来源: 互联网 发布时间: 2014-02-18
关于java的new对象问题
| 评论
| 评论
关于java的new对象问题
2011-11-8 21:10
提问者:hwhzw17 | 悬赏分:20 | 浏览次数:183次
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?高手们,谢谢了!
2011-11-8 21:42
最佳答案
你好,修改后的代码如下,关键处我做了注释。 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; 经过我这么详细的分析,你明白了吧。
2
提问者对于答案的评价:
恍然大悟,谢谢了
public class Circle { private Point center; //楼主你的问题出在这,java里,你要把一个类写为另一个类的成员时,必须要new出来, 这句改成 private Point center = new Point(); 同时你的Point类也要加一个无参的构造方法 }
0
检举 | 2011-11-8 21:48liziblue | 二级
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); 就可以了 不能理解成赋值
[2] OC将http转义字符转化作中文
来源: 互联网 发布时间: 2014-02-18
OC将http转义字符转化为中文
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[3] 如次代码输出是?()
来源: 互联网 发布时间: 2014-02-18
如下代码输出是?()
如下代码输出是?()
class Window {
Window(int i) { System.out.print(i+" ");}
}
class House {
Window w1 = new Window(1);
House() {
System.out.print(" 2 ");
w2 = new Window(3);
}
Window w3 = new Window(4);
void f() { System.out.print(" 5 "); }
Window w4 = new Window(6);
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f();
}
}
A.1 3 4 6 2 5
A.1 2 3 4 6 5
C.2 3 1 4 6 5
D.1 4 6 2 3 5
如下代码输出是?()
class Window {
Window(int i) { System.out.print(i+" ");}
}
class House {
Window w1 = new Window(1);
House() {
System.out.print(" 2 ");
w2 = new Window(3);
}
Window w3 = new Window(4);
void f() { System.out.print(" 5 "); }
Window w4 = new Window(6);
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f();
}
}
A.1 3 4 6 2 5
A.1 2 3 4 6 5
C.2 3 1 4 6 5
D.1 4 6 2 3 5
最新技术文章: