关于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:48 liziblue  | 二级
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); 就可以了
不能理解成赋值 
【时时三省】tessy 集成测试:小白入门指导手册 有图有文字详细介绍 tessy 集成测试 操作方法。 阅读详情

相关推荐

科研党必备!用Requests+BeautifulSoup升级版Nature爬虫(含PDF下载功能)

本文介绍了一套基于Python Requests和BeautifulSoup的Nature期刊智能爬虫系统,专为科研人员设计,可自动抓取论文标题、摘要及开放获取的PDF文档。系统采用模块化设计,包含请求管理、PDF检测和邮件通知等功能,确保高效合规地获取学术资源,提升科研效率。

weixin_29041767的博客 255

Java new一个对象

不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等

Clever99的博客 4041

WRF和WPS模型在Ubuntu系统上的安装与常见问题解决指南

本文详细介绍了在Ubuntu系统上安装WRF和WPS模型的完整教程,涵盖系统环境配置、依赖库安装、源代码编译以及常见问题的解决方案。重点解决了WPS编译中intmath.f文件的修改、环境变量设置和编译器兼容性等关键难点,帮助用户高效部署气象研究与预报模型。

weixin_29213525的博客 381

java 成员对象 丢失_JAVA继承问题。一般成员和对象的问题,求大神解答!多谢。...

class Fu{Fu(){super();System.out.println("进入父类构造器!");this.show();//1.这个show的运行结果是:子类 show 重写!0,num的值是0.return;}void show(){System.out.println("重写!");}}class Zi extends Fu{int num = 8;Zi(){super();//--...

weixin_35436993的博客 296

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数

相关性分析:求解相关系数并绘制热力图进行对比

weixin_67565775的博客 8万+

线性代数笔记【空间曲面】

二次曲面 曲面可以看成是一个动点或一条动曲线按照一定条件或规律运动产生的轨迹 曲面的方程即是该动点的坐标所满足的方程 空间解析几何中,一般会涉及到由曲面写方程和由方程看曲面两种类型问题 曲面与曲面方程 球面方程 球面:空间内与定点的距离等于定长的点的集合 这一定点叫球心,定长叫半径 标准方程 (x−x0)2+(y−y0)2+(z−z0)2=r2(x-x_0)^2+(y-y_0)^2+(z-z_0)^2=r^2(x−x0​)2+(y−y0​)2+(z−z0​)2=r2 球心P0(x0,y0,z0)P_0(

qq_40500005的博客 3246

Java中new对象的过程问题

文章目录1、写在前面的话2、类加载过程类加载概述加载验证准备解析初始化3、创建对象在堆区分配对象需要的内存对所有实例变量赋默认值执行实例初始化代码在栈区开辟空间4、补充 1、写在前面的话 联系我上次写的关于Java内存的文章,对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈、Java 堆、方法区这三个最重要内存区域之间的关联关系,如下面的这...

weixin_45082647的博客 1175

Xshell 连接 VMware虚拟机操作 截图和使用

vmwareVMware总部位于美国加州帕洛阿尔托(Palo Alto),是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任,实现任意云端和设备上运行、管理、连接及保护任意应用Xshell(安全终端模拟软件)Xshell [1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。

小 tom的博客 800

java 一个对象new两次_Java中频繁new一些对象会有什么问题?

后果就是会造成内存溢出或者频繁的进行垃圾回收导致应用性能下降。内存溢出按照你目前的写法,在某一个时刻,同时有多个请求时,会创建大量的对象,请求时对象被引用无法回收,就会有内存溢出的风险。这就限制了程序并发能力。频繁的垃圾回收假设请求不是同一个时刻的。但随着时间的推移,jvm创建的对象会线性增加。说到这里,我们先看下JVM的垃圾回收是怎样进行的?大多数情况下,对象在新生代Eden区中分配。当Eden...

weixin_39626369的博客 3564

YOLOv11全方位改进指南:卷积层、轻量化、注意力、损失函数等创新优化一览

YOLOv11通过八大核心模块的创新设计,在保持YOLO系列实时性的同时显著提升检测精度。本文提出的可变形卷积DCNv4多模态注意力动态解耦头等创新方案,已在工业质检、自动驾驶、无人机巡检等领域成功应用。完整项目地址预训练模型:包含从nano到x六个规格在线演示创新声明首次在YOLO系列集成DCNv4,小目标检测AP提升8.2%提出多模态混合注意力(MMAttention),兼顾通道与空间关系动态标签分配策略使训练效率提升40%

QQ_778132974的博客 1019

从零开始玩转边缘 AI:Jetson Nano 深度学习环境搭建与 YOLOv5 部署指南

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

LXY_LOVE36的博客 233

java new对象释放_Java中频繁new一些对象会有什么问题?

很多人觉得产生大量的垃圾于是gc的压力就会很大,这是非常非常错误的。没有用的对象并不会使得gc变慢,相反的,无法被释放的对象才会对gc产生压力。换言之gc的快慢不取决于有多少垃圾,而取决于对象中有多少不是垃圾。GC的基本假设是most objects die young。所以如果没有需要被移去下一gen的对象,young gen/eden space的回收不要太快,指针重置而已。所以创建很多生命周...

weixin_39725193的博客 1728

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于java new 创建对象的问题

为什么80%的码农都做不了架构师?>>> ...

weixin_33728268的博客 108

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

提醒自己:new java 对象数组的问题

问题描述:定义 class A,A中有成员变量 int a, 操作 A[] array = new A[10], 再操作 arry[i].a = 1时,报错:NullPointExpection。         原因: 详见博客:关于java的对象数组         简而言之就是:第一次new数组的操作,没有在内存中给数组每个元素分配空间,要依次new出数组中每个元素对象。

667

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java new对象卡住_java:new一个对象涉及的初始化问题

Java程序的初始化一般遵循3个原则(优先级依次递减):- 静态对象(变量)优于非静态对象(变量)的初始化,其中,静态对象(变量)只初始化一次,非静态对象(变量)可能会初始化多次。- 父类优先于子类进行初始化。- 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,他们依然在任何方法(包括构造函数)被调用之前先初始化。public class HelloA {static {Syst...

weixin_29499357的博客 485

问个比较菜的问题,在JAVA中new完对象后有没有办法消除对象,节省手机内存。

谢谢。

hepianshi3109的博客 350

JAVA for循环外new 对象与循环内new对象的问题

最近写代码的时候,一直在思考这个问题,现在空了,写篇文章记录一下吧! 先来看一段源代码,三种场景:public static List<Demo> for1(){ System.out.println("1."+System.currentTimeMillis()); Demo demo = null; List<Demo> demos = new

莫哈的博客 2万+

java:new一个对象涉及的初始化问题

Java程序的初始化一般遵循3个原则(优先级依次递减): - 静态对象(变量)优于非静态对象(变量)的初始化,其中,静态对象(变量)只初始化一次,非静态对象(变量)可能会初始化多次。 - 父类优先于子类进行初始化。 - 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,他们依然在任何方法(包括构造函数)被调用之前先初始化。 public class HelloA { ...

番茄炒西红柿 1976

Java之死循环中new对象出现OOM问题

Java死循环while/for中无限new对象可能会出现OOM问题,也可能不会出现OOM问题。后续更新。。。

ldcaws的专栏 2926

Java 对象的赋值和new出对象再赋值的问题

接着把map.get(1)的对象的引用赋给 studentTwo ,即此时 studentTwo 指向map.get(1)的对象的内存,暂且命名为内存2.场景1:首先 new 出一个 Student 对象, 这时会在内存开辟一块新的内存,暂且命名为内存1,这时,studentTwo保存内存1的地址;这时,内存1因为没有被对象引用,成为垃圾,等待JVM的回收.也就是内存1是多余的,并没有被使用.以上场景的代码逻辑上没有错误,就是性能上不同,所以下面的分析是从性能考虑上分析,让代码更高效.

Smile_729day的博客 1185

Java String对象的经典问题(new String())

http://sarin.iteye.com/blog/603684/ 先来看一个例子,代码如下: Java代码   public class Test {      public static void main(String[] args) {          String str = "abc";          String str1 = "abc";

杨文的专栏(南京Java讲师) 746

java 集合的动态初始化块_Java中new对象的过程问题

一.写在前面的话对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈、Java 堆、方法区这三个最重要内存区域之间的关联关系,如下面的这句代码:1.假设这句代码出现在方法体中,那”Object obj”这部分的语义将会反映到Java 栈的本地变量表中,作为一个 reference 类型数据出现。2.而”new Object()”这部分的语义将会反...

weixin_39933438的博客 250

java类的加载时机和对象new的顺序相关的问题总结

一、什么情况下下必须对类进行初始化? 1.遇到new,getstatic, putstatic, invokestatic这四条字节指令的时候,如果类没有进行初始化,则需要触发其初始化。这四条字节指令的常见场景:使用new实例化对象,读取或设置静态字段(如果被dinal修饰、已在编译器把结果放入常量池的静态字段除外),以及调用一个类的静态方法。场景基本与上方字节指令对应。 2.使用java....

dyingstraw的博客 383

Java子类new对象时执行顺序的问题

父类Meal,子类ProPreLunch ,当new ProPreLunch ()时,代码执行顺序为:父类静态块/静态变量(按代码的先后顺序执行)→子类静态块/静态变量(按代码的先后顺序执行)→父类非静态代码块/非静态变量(按代码的先后顺序执行)→父类构造方法→子类非静态代码块/非静态变量(按代码的先后顺序执行)→子类构造方法 代码如下: 父类:public class Meal { sta...

weixin_44086166的博客 555
上一篇: Android AIDL远程服务使用示例
下一篇: 用java匿名类来简化调试
whatsyourname
博客等级 码龄23年 13粉丝 326原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值