`

关于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); 就可以了
不能理解成赋值 
分享到:
评论

相关推荐

    java中对象和对象引用的区别!

    这一点在Java中非常重要,因为它影响到了如何处理对象的复制以及对象的生命周期等问题。 - **空引用** 如果我们声明了一个引用变量但并未给它分配任何对象,那么这个引用变量就称为“空引用”或“未初始化的引用...

    Java面向对象程序设计+源代码+课后习题答案)

    在Java中,通过`class`关键字来定义类,通过`new`关键字创建对象。 2. 封装:封装是隐藏对象的内部实现细节,只对外提供公共接口进行交互。Java通过访问修饰符(如public, private, protected)实现封装,以保护...

    json格式与java类对象相互转换

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端交互,而Java作为后端开发的主要语言,常常需要将JSON格式的数据与Java类对象进行相互转换,以便于数据的处理和传输。Jackson库是...

    探讨Java的对象是怎么在内存中产生的?

    Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上经历了以下几个步骤: 1. **类加载检查**:虚拟机首先检查`new`指令的参数是否能在常量池中定位到一个类的符号引用。如果该类尚未被加载...

    Java中对象与引用

    ### Java中对象与引用 在Java编程中,深入理解对象与引用的概念对于掌握面向对象编程至关重要。本文将从以下几个方面详细解析对象与引用的基本概念及其相互间的关系。 #### 一、对象与引用的基础概念 **对象**: ...

    JAXB工具类 xml转为java对象 java对象转为xml

    Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得在Java应用程序中使用XML数据变得更加方便,无需手动编写大量的转换代码。本教程将详细介绍JAXB如何实现...

    《Java面向对象程序设计(第2版)》课件

    Java面向对象程序设计是计算机科学中的一个重要领域,尤其在软件开发中占据核心地位。第二版的《Java面向对象程序设计》课件旨在深入浅出地介绍这一关键概念,帮助学习者掌握Java语言的基础以及面向对象编程的核心...

    JAVA创建对象的四种方法

    -java 创建对象的四种方法是指在 Java 中创建对象的不同方式,它们分别是使用 new 语句创建对象、使用反射机制创建对象、使用 clone() 方法创建对象和使用反序列化机制创建对象。 - 使用 new 语句创建对象是 Java ...

    java面向对象程序设计第4章源代码

    在Java编程语言中,面向对象程序设计(Object-Oriented Programming, OOP)是一种核心的编程范式,它基于“对象”概念,将数据和处理数据的方法封装在一起。本章节的源代码着重于讲解和实践Java中的面向对象特性,...

    java-对象数组转换为json

    在IT领域,特别是Java编程中,对象数组与JSON之间的转换是一项常见且重要的操作。下面将深入探讨如何在Java中实现对象数组向JSON的转换,并反过来将JSON字符串转换为Java对象数组,同时也会提及一些相关技术和代码...

    java面向对象练习题-经典

    这是因为Java语言的运算符优先级问题,先计算x + +,然后计算(x + +)/3,结果为1。 4. 若x = 5,y = 10,则x 和x >= y的逻辑值分别为true和false。这是Java语言的基本逻辑运算符的应用。 5. 抽象(abstract)方法是...

    Java对象属性数据比较,返回变化数据

    在Java编程中,比较对象属性的数据变化是一项常见的需求,特别是在数据跟踪、日志记录或版本控制等场景。本文将深入探讨如何实现这个功能,并基于给定的文件`PriceCheckDetail.java`和`ObjectCompareUtil.java`来...

    JAVA类与对象及数组习题

    下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: 构造方法是类的特殊方法,用于初始化对象的状态。调用构造方法的方式有很多...

    Java中new的用法.pdf

    在Java语言中,new关键字是面向对象编程的核心之一,它主要用于创建对象实例。本文将详细解释在Java中new关键字的各种用法,并结合示例代码进行阐述。 1. 基本对象的创建: 使用new关键字可以创建任何类的新实例。...

    java-学习-面对对象-匿名对象

    在Java编程语言中,"面向对象"是一种核心的编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。而“匿名对象”是面向对象编程中的一个特殊概念,它指的是没有名字的、临时的对象。在Java中,匿名...

    java内存对象分配过程研究

    这个问题涉及到JVM的具体实现以及对象本身的结构。一般而言,对象在内存中的布局可以分为三个部分: 1. **对象头(Object Header)**:存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄(Age)等信息。这部分...

    用new创建对象和直接定义的区别

    `new`关键字在Java、C++、C#等面向对象语言中广泛使用,它用于在堆内存中动态分配空间并初始化一个新对象。当我们使用`new`关键字时,通常会伴随着一个类的构造函数调用,以便对新对象进行初始化。 ```java // Java...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    java面向对象基础知识点.doc

    Java 面向对象基础知识点 Java 是一门面向对象的编程语言,面向对象编程(Object-Oriented Programming,OOP)是 Java 语言的核心。了解 Java 面向对象的基础知识是掌握 Java 语言的关键,本文将对 Java 面向对象的...

    java实例化对象的过程

    在Java编程语言中,实例化对象是创建类的实例,使其具有特定状态和行为的过程。这个过程涉及到几个关键步骤,让我们深入探讨一下。 首先,我们需要一个类,它是创建对象的蓝图。在Java中,我们使用`class`关键字来...

Global site tag (gtag.js) - Google Analytics