新手请教

evel 2015-06-29 11:25:51
public class Demo1 {
public static void main(String[] args) {
Demo1 test = new Demo1();
System.out.println(test);
}
}


请教下这段代码的疑问:

1, Demo1是一个正在定义中的类,为什么在其内部还没有完全定义全,还在大括号{}内部,就可以直接实例化test呢?
2,机器对于Demo1,test的内存的使用究竟怎样的?
...全文
306 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
飏飏一蝶 2015-07-04
  • 打赏
  • 举报
回复
类可以大致分为2个区,方法区和域区 不管生成多少个对象,都公用方法区代码 而域区(即成员变量)是每个对象单独拥有的 实例化时,实际新增的对象只是为自己添加了域区, 方法区不再单独增加而是共用
dontbend 2015-07-04
  • 打赏
  • 举报
回复
在我理解,首先你要理解“构造函数”。你上面这段代码实际有个默认的构造函数"Demo1(){}" public class Demo1 { Demo1(){} public static void main(String[] args) { Demo1 test = new Demo1(); System.out.println(test); } } 先说第2个问题:当主函数调用这个类的时候,这个类要先进内存的“方法区”,相当于这段类的代码放到了内存中。 当你Demo1 test = new Demo1();执行时,这个new的实例,会在堆中开辟个内存空间,开辟空间后存储的实例,可以理解按照构造函数来创建的实例结构。 再说第1个问题:我想你一定是把这个理解成类似内循环或者递归了。所以你会迷惑。 用大白话说你会更理解:就是你创建对象的时候,要看构造函数。就是把你那些成员变量初始化。其他结构并不再执行,只是一段代码。例如方法,用到的时候再加载执行。
Iamagril 2015-07-03
  • 打赏
  • 举报
回复
引用 5 楼 jj6280645 的回复:
(1)、从main函数开始执行: 1,因为new用到了Demo1.class.所以会先找到Demo1.class文件并加载到内存中。 2,执行该类中的static代码块,如果有的话,给Demo1.class类进行初始化。 (2)、 1,在堆内存中开辟空间,分配内存地址。 2,在堆内存中建立对象的特有属性。并进行默认初始化。
5楼正解,赞一个
yaozqwise 2015-07-02
  • 打赏
  • 举报
回复
引用
楼主: 1, Demo1是一个正在定义中的类,为什么在其内部还没有完全定义全,还在大括号{}内部,就可以直接实例化test呢? 2,机器对于Demo1,test的内存的使用究竟怎样的?
Demo1是一个正在定义中的类就是一个类,不是一个正在定义中的类,实例化test的时机并不是你认为的编辑的时候就实例化了。 通过javap可以看到生成的class文件的内容。 执行java Demo1命令时,系统会加载Demo1的class文件到JVM的方法区中,然后到到Main方法做为入口去执行,执行到Demo1 test = new Demo1();时会根据方法区中保存了的Demo1的类的结构信息,创建一个Demo1的实例对象放到JAVA堆中。 所以执行new操作的时候Demo1这个类的结构信息JVM最就知道了。
wuzhenwuyule 2015-07-02
  • 打赏
  • 举报
回复
引用 5 楼 jj6280645 的回复:
(1)、从main函数开始执行: 1,因为new用到了Demo1.class.所以会先找到Demo1.class文件并加载到内存中。 2,执行该类中的static代码块,如果有的话,给Demo1.class类进行初始化。 (2)、 1,在堆内存中开辟空间,分配内存地址。 2,在堆内存中建立对象的特有属性。并进行默认初始化。
傻傻de点点 2015-07-02
  • 打赏
  • 举报
回复
说简单点,java的实例化类对象,靠的是该类的构造方法,跟该类有没有定义完没有任何关系。如果不显示地定义构造方法,java会生成一个默认的无参构造方法。这种在main函数里面才调用已经很温柔了,看看下面这个,岂不是要疯?
public class Demo1 {
	private Demo1 demo;
	
	public Demo1 getDemo() {
		return demo;
	}
	
    public static void main(String[] args) {
        Demo1 test = new Demo1();
        System.out.println(test);
    }
}
evel 2015-07-02
  • 打赏
  • 举报
回复
引用 7 楼 finemi 的回复:
底层实现不深究,只说逻辑:方法内部和对象成员互不冲突,外部创建一个类对象或者使用一个类时,他并不知道该类的方法中所存在的东西,他只知道有哪些成员而已。 结合上面说的,从运行顺序角度讲,JVM运行时该类的所有成员已经读取完毕了,当真正执行某方法时初始化一个已经确定内容的类对象当然毫无问题
貌似有点道理,但目前代码在Demo1类的内部就已经创建一个类对象test了,是不是其实只是开辟了内存空间给类对象本身,但是类内部成员还是没有定义全的? 一开始就纠结这个鸡和蛋先后问题真的让我对Java失去兴趣了。。。
evel 2015-07-02
  • 打赏
  • 举报
回复
引用 5 楼 jj6280645 的回复:
(1)、从main函数开始执行: 1,因为new用到了Demo1.class.所以会先找到Demo1.class文件并加载到内存中。 2,执行该类中的static代码块,如果有的话,给Demo1.class类进行初始化。 (2)、 1,在堆内存中开辟空间,分配内存地址。 2,在堆内存中建立对象的特有属性。并进行默认初始化。
Demo1.class是完全保存了Demo1.java之后调用javac才生成的呀?现在我就纠结在这个大括号都没有结束,怎么就能给Demo1实例化一个test呢?!
finemi 2015-07-01
  • 打赏
  • 举报
回复
底层实现不深究,只说逻辑:方法内部和对象成员互不冲突,外部创建一个类对象或者使用一个类时,他并不知道该类的方法中所存在的东西,他只知道有哪些成员而已。 结合上面说的,从运行顺序角度讲,JVM运行时该类的所有成员已经读取完毕了,当真正执行某方法时初始化一个已经确定内容的类对象当然毫无问题
猫SirSir 2015-07-01
  • 打赏
  • 举报
回复
类有个默认的构造方法,当不写构造方法的时候,执行默认的。
leeKitty 2015-06-30
  • 打赏
  • 举报
回复
1.程序代码 是先要编译一遍的
evel 2015-06-30
  • 打赏
  • 举报
回复
引用 1 楼 lcr06051210的回复:
第一个问题,我不知道如何解释,第二个问题,当你new进行实例化时,就会自动地分配一个地址空间来存放实例化的数据或对象
谢谢回复。我是新手
lcr06051210 2015-06-30
  • 打赏
  • 举报
回复
第一个问题,我不知道如何解释,第二个问题,当你new进行实例化时,就会自动地分配一个地址空间来存放实例化的数据或对象
痞子lu 2015-06-30
  • 打赏
  • 举报
回复
(1)、从main函数开始执行: 1,因为new用到了Demo1.class.所以会先找到Demo1.class文件并加载到内存中。 2,执行该类中的static代码块,如果有的话,给Demo1.class类进行初始化。 (2)、 1,在堆内存中开辟空间,分配内存地址。 2,在堆内存中建立对象的特有属性。并进行默认初始化。
evel 2015-06-30
  • 打赏
  • 举报
回复
引用 3 楼 leeKitty的回复:
1.程序代码 是先要编译一遍的
但这应该怎么编译呢?还没定义好类

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧