问一个关于类加载和声明的问题

老冯_5 2014-03-12 10:39:07
class P1{
static
{
System.out.println(1111111111);
}
static String name="ss";
}

class Test{
public static void main(String[] args){
P1 p=null;
System.out.println(p.name);
}
}


当执行到P1 p=null;时,P1类应该没有加载近内存,因为把System.out.println(p.name);
注释掉,静态代码快没有执行。
但是System.out.println(p.name);去掉注释的时候,静态代码块却执行了,仅仅是声明了一个P1类变量加载P1类了吗?
...全文
267 20 打赏 收藏 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
u012128266 2014-03-14
  • 打赏
  • 举报
回复
System.out.println(dsdf); 编译错误啊
进击的诺基亚 2014-03-14
  • 打赏
  • 举报
回复
这个真心不懂。。。
momoyssy 2014-03-14
  • 打赏
  • 举报
回复
http://www.cnblogs.com/alexlo/archive/2013/03/05/2944573.html 这个也许能帮到你...
别闹腰不好 2014-03-14
  • 打赏
  • 举报
回复
引用 19 楼 gaofuqi 的回复:
[quote=引用 18 楼 u012463264 的回复:] [quote=引用 17 楼 gaofuqi 的回复:] [quote=引用 14 楼 u012463264 的回复:] 静态成员不属于类, 只要有一个静态成员被调用,静态的东西都会被加载,而且只会加载一次。 你要是new的是肯定是加载静态成员 。 定义以个变量指向空,类是什么也不会做的。
补补Java基础可以不,别误人子弟。。。。。[/quote] 我觉得java基础挺好。。。呵呵 你有啥见解说啊 我哪说的不对 ,你指出来。[/quote] 可能是我反应过度,语气有点重。。。只有一点“静态成员不属于类”,静态成员本来就是属于类的,实例成员属于对象的,静态变量也叫类变量,静态方法也叫类方法。。。。[/quote] 应该说静态成员不属于类对象。是属于类。
gaofuqi 2014-03-14
  • 打赏
  • 举报
回复
引用 18 楼 u012463264 的回复:
[quote=引用 17 楼 gaofuqi 的回复:] [quote=引用 14 楼 u012463264 的回复:] 静态成员不属于类, 只要有一个静态成员被调用,静态的东西都会被加载,而且只会加载一次。 你要是new的是肯定是加载静态成员 。 定义以个变量指向空,类是什么也不会做的。
补补Java基础可以不,别误人子弟。。。。。[/quote] 我觉得java基础挺好。。。呵呵 你有啥见解说啊 我哪说的不对 ,你指出来。[/quote] 可能是我反应过度,语气有点重。。。只有一点“静态成员不属于类”,静态成员本来就是属于类的,实例成员属于对象的,静态变量也叫类变量,静态方法也叫类方法。。。。
别闹腰不好 2014-03-14
  • 打赏
  • 举报
回复
引用 17 楼 gaofuqi 的回复:
[quote=引用 14 楼 u012463264 的回复:] 静态成员不属于类, 只要有一个静态成员被调用,静态的东西都会被加载,而且只会加载一次。 你要是new的是肯定是加载静态成员 。 定义以个变量指向空,类是什么也不会做的。
补补Java基础可以不,别误人子弟。。。。。[/quote] 我觉得java基础挺好。。。呵呵 你有啥见解说啊 我哪说的不对 ,你指出来。
gaofuqi 2014-03-14
  • 打赏
  • 举报
回复
引用 14 楼 u012463264 的回复:
静态成员不属于类, 只要有一个静态成员被调用,静态的东西都会被加载,而且只会加载一次。 你要是new的是肯定是加载静态成员 。 定义以个变量指向空,类是什么也不会做的。
补补Java基础可以不,别误人子弟。。。。。
yang_friend 2014-03-14
  • 打赏
  • 举报
回复
赞同14楼……
别闹腰不好 2014-03-14
  • 打赏
  • 举报
回复
引用 14 楼 u012463264 的回复:
静态成员不属于类, 只要有一个静态成员被调用,静态的东西都会被加载,而且只会加载一次。 你要是new的是肯定是加载静态成员 。 定义以个变量指向空,类是什么也不会做的。
这就是为什么一个类里的 静态方法只能调用静态的成员,因为他们同时被加载。 静态成员不调用非静态的成员,因为不能保证被调用的非静态成员已经被加载。
别闹腰不好 2014-03-14
  • 打赏
  • 举报
回复
静态成员不属于类, 只要有一个静态成员被调用,静态的东西都会被加载,而且只会加载一次。 你要是new的是肯定是加载静态成员 。 定义以个变量指向空,类是什么也不会做的。
momoyssy 2014-03-13
  • 打赏
  • 举报
回复
关注。。。这个问题我一直有疑问。。。
gaofuqi 2014-03-13
  • 打赏
  • 举报
回复
类在主动使用的时候才加载,具体如下: 1.创建类的新实例; 2.调用类中声明的非常量静态字段; 3.调用类中声明的静态方法; 4.通过反射调用类; 5.初始化类的子类; 6.指定类作为启动类;
巫巫巫 2014-03-13
  • 打赏
  • 举报
回复
去掉p.name的时候没有执行是因为P1类没有加载,加上p.name的时候P1类加载了,所以静态块自动执行。
  • 打赏
  • 举报
回复
引用 9 楼 wangxf_8341 的回复:
[quote=引用 7 楼 mysticality 的回复:] [quote=引用 6 楼 wangwuyilove 的回复:] 看一下下面的例子,
class Person{
	static{
		System.out.println("wangwuyi");
	}
	static String name = "jing";
	public Person(){
		System.out.println("qing");
		System.out.println(dsdf);
	}
}

public class Static {

	public static void main(String[] args) {
		Person p = null;
		System.out.println(p.name);
	}
}
Person p= null;的时候没有初始化类,因为没有new,没有掉要构造器,但是p.name的时候初始化了类,初始化类的时候肯定是先执行静态初始化块的内容。有趣的是类的生命周期是类加载、连接、初始化、使用、卸载。然而调用p.name的时候正是初始化阶段,应该执行完了连接阶段,怎么没有把System.out.println(dsdf);这一错误检测出来那?求解释
没有new,构造函数不被调用[/quote] 你这个能编译通过吗[/quote] 你可以运行试试
淡定的峰哥 2014-03-13
  • 打赏
  • 举报
回复
引用 7 楼 mysticality 的回复:
[quote=引用 6 楼 wangwuyilove 的回复:] 看一下下面的例子,
class Person{
	static{
		System.out.println("wangwuyi");
	}
	static String name = "jing";
	public Person(){
		System.out.println("qing");
		System.out.println(dsdf);
	}
}

public class Static {

	public static void main(String[] args) {
		Person p = null;
		System.out.println(p.name);
	}
}
Person p= null;的时候没有初始化类,因为没有new,没有掉要构造器,但是p.name的时候初始化了类,初始化类的时候肯定是先执行静态初始化块的内容。有趣的是类的生命周期是类加载、连接、初始化、使用、卸载。然而调用p.name的时候正是初始化阶段,应该执行完了连接阶段,怎么没有把System.out.println(dsdf);这一错误检测出来那?求解释
没有new,构造函数不被调用[/quote] 你这个能编译通过吗
  • 打赏
  • 举报
回复
引用 7 楼 mysticality 的回复:
[quote=引用 6 楼 wangwuyilove 的回复:] 看一下下面的例子,
class Person{
	static{
		System.out.println("wangwuyi");
	}
	static String name = "jing";
	public Person(){
		System.out.println("qing");
		System.out.println(dsdf);
	}
}

public class Static {

	public static void main(String[] args) {
		Person p = null;
		System.out.println(p.name);
	}
}
Person p= null;的时候没有初始化类,因为没有new,没有掉要构造器,但是p.name的时候初始化了类,初始化类的时候肯定是先执行静态初始化块的内容。有趣的是类的生命周期是类加载、连接、初始化、使用、卸载。然而调用p.name的时候正是初始化阶段,应该执行完了连接阶段,怎么没有把System.out.println(dsdf);这一错误检测出来那?求解释
没有new,构造函数不被调用[/quote] 这个是肯定的,我的问题是类的生命周期中“连接”的作用不是“类是否合法”吗??我感觉上面的类有问题怎么没有检测出来???
影子传说_Hades 2014-03-13
  • 打赏
  • 举报
回复
引用 6 楼 wangwuyilove 的回复:
看一下下面的例子,
class Person{
	static{
		System.out.println("wangwuyi");
	}
	static String name = "jing";
	public Person(){
		System.out.println("qing");
		System.out.println(dsdf);
	}
}

public class Static {

	public static void main(String[] args) {
		Person p = null;
		System.out.println(p.name);
	}
}
Person p= null;的时候没有初始化类,因为没有new,没有掉要构造器,但是p.name的时候初始化了类,初始化类的时候肯定是先执行静态初始化块的内容。有趣的是类的生命周期是类加载、连接、初始化、使用、卸载。然而调用p.name的时候正是初始化阶段,应该执行完了连接阶段,怎么没有把System.out.println(dsdf);这一错误检测出来那?求解释
没有new,构造函数不被调用
  • 打赏
  • 举报
回复
看一下下面的例子,
class Person{
	static{
		System.out.println("wangwuyi");
	}
	static String name = "jing";
	public Person(){
		System.out.println("qing");
		System.out.println(dsdf);
	}
}

public class Static {

	public static void main(String[] args) {
		Person p = null;
		System.out.println(p.name);
	}
}
Person p= null;的时候没有初始化类,因为没有new,没有掉要构造器,但是p.name的时候初始化了类,初始化类的时候肯定是先执行静态初始化块的内容。有趣的是类的生命周期是类加载、连接、初始化、使用、卸载。然而调用p.name的时候正是初始化阶段,应该执行完了连接阶段,怎么没有把System.out.println(dsdf);这一错误检测出来那?求解释
xuxin_xjb 2014-03-13
  • 打赏
  • 举报
回复
执行到P1 p=null;时不会加载类,在执行p.name时,由于是调用P1类的静态变量,就会加载P1类。然后就会加载P1类中的静态块或静态变量。
老冯_5 2014-03-12
  • 打赏
  • 举报
回复
别沉。。。。求解释
代码下载链接: https://pan.quark.cn/s/a8fbca3925b4 《鸿蒙OS开发环境构建》指南系统性地阐述了配置和筹备鸿蒙OS开发所需的各种工具和条件的具体方法。鸿蒙OS,亦称HarmonyOS,是由华为研发的一款面向全场景的分布式操作系统,其目标是提供跨平台、多设备间无缝协作的使用体验。本指南涉及了从Linux服务器到Windows工作站的完整开发流程。指南中提及了MobaXterm,这是一款用于连接Linux源码服务器的软件,使得开发人员能够在Windows环境中远程访Linux服务器。同时,HiTool作为烧录工具,用于将编译后的系统镜像写入开发板。IPOP.EXE则是一款串口终端软件,用于执行串行通信和调试任务。Embedded Studio用于开发设备驱动程序,而DevEco Studio是华为提供的图形化应用程序开发平台,支持C/C++语言,拥有代码编辑、编译、烧录和调试功能,被视为OpenHarmony智能设备开发者的首选集成开发环境。在硬件配置方面,指南列出了必需的设备,包括Linux服务器(推荐Ubuntu 16.04及以上版本),Windows工作台(兼容XP/7/10),以及Hi3518EV300 IoT Camera单板。开发期间,Windows工作台通过USB线与单板相连接,以实现数据传输。此外,为了开展开发工作,还需要安装putty、IPOP、tftp服务器等辅助软件,以及HiTool用于烧录操作。在软件系统要求方面,Linux服务器需要安装bash、Python3.7+、gn、ninja、LLVM等构建工具,这些工具对于生成和执行编译脚本具有关键作用。在Windows工作台上,建议采用Visual Studi...

62,620

社区成员

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

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