当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于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

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3