静态代码块无法实例化对象?

静态代码块无法实例化对象?


http://img1.sycdn.imooc.com/climg//59618df80001d9e903170203.jpg

http://img1.sycdn.imooc.com/climg//59618df8000110a502860412.jpg


其余的都是getter和setter函数,没有自定义构造函数,由于static代码块优先执行,所以我把构造代码块中的name注释了,不希望名字是"花花"而是"明明"。

http://img1.sycdn.imooc.com/climg//59618df800016f2006110320.jpg


可是输出结果名字为什么是null???还是说静态代码块虽然可以通过实例化对象然后用对象调用非静态成员,但是依然不可以给非静态成员赋值或不能被访问?我也试过用one.setName("明明")但还是null?

http://img1.sycdn.imooc.com/climg//59618ed0000150bd01770157.jpg


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你好!你在非静态代码块这里又重新定义了一个对象one,和静态代码块中的对象是无关的。因为新定义的one没有个名字赋值,所以输出结果为null。祝学习愉快!

  • 馈赠 提问者 #1
    所以你是说在静态代码块中即使定义了对象并且赋值,也不能实例化对象吗?对象只能在非静态方法中赋值吗?
    2017-07-09 15:18:19
  • 馈赠 提问者 #2
    我知道这两个对象one是无关的啊。。 在静态代码块里面的one只是相当于构造方法一样给name赋值而已,就好比this.name="明明 "一样,非静态中的one只是为了调用getName()
    2017-07-09 15:21:10
  • 好帮手慕珊 回复 提问者 馈赠 #3
    不是不能实例化对象,而是你是否需要这两处的对象是同一个,如果需要是同一个要在类的最开始声明一下即Cat one;然后静态块中去创建对象one =new Cat();如果希望后面的非静态块中的代码执行完后name还是明明,就不用再创建一次one的对象了,也就是去掉Cat one=new Cat();还用之前创建的one对象就行了
    2017-07-09 20:51:23
爱宝宝真的太好了 2017-08-28 14:10:05


public class Test {
	Test one;
	private int temp;
			
	static {
		one = new Test();//这里报错cannot make a static reference to a non-static field one
		one.temp = 11111;//这里报错cannot make a static reference to a non-static field one
	}
}

老师问一下为什么这里会报错呀, 是不是需要在类成员里的Test one 前面加上static?

  • 是的,报错信息提示不能在静态代码块中使用非静态的引用one,这个就跟在静态方法中不能使用非静态变量是一样的。
    2017-08-28 15:17:32
  • 感谢!老师再请教下在static块中创建的实例对象要如何在main函数中使用,比如我在class a 中创建 public class Test { static Test one; private int temp; static { one = new Test(); one.temp = 11111; } } 如果我想在main函数中也用到这个one.temp这个对象的值该怎么具体实现呢
    2017-08-28 16:50:28
  • Test.one.temp这样就可以了
    2017-08-28 17:31:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师