题目:
以下代码为啥无法运行,哪里出错了?
public class Test{
public static void main(String[] s){
Foo obj1=new Foo();
}}
class Foo{
int value;
public Foo(int intValue){
value=intValue;}}
这是运行截图:
为什么会报错呢?
因为我们在下面又单独构造了一个Foo的函数导致原来的Foo()失去了系统自动匹配的默认构造方法,这时候我们只要自己再写出来一个空构造就行
具体实现就是,在代码最后写个:public Foo(){}就OK啦!
这就是老师ppt上说的:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
继续往下走:如果一个类中,既有初始化块,又有构造方法,同时还设定了字段的初始值,那么谁说了算呢?下面来看代码和运行截图:
可以看出输出的是100和300;
借此我们可以总结一下java字段初始化的规律:优先选择有参构造方法,默认值和初始化块看谁在下面,就使用谁的值。其运行顺序与调用的时间有关。
下一个动手动脑:运行代码观察运行结果,总结静态初始化块的执行顺序。代码有点长就不在这里放了,,直接放个运行截图吧:
这里我们可以看到,静态初始化块只执行了一次,虽然代码特意写了两次输出,,还有就是创建子类对象时,也会导致父类型的静态初始化块的执行。在这个程序中,爷爷辈是root,进行继承的是Mid,然后是孙子辈的leaf,,所以三个静态对象依次输出了一遍,(从这里我们还可以发现,,静态初始化块是比普通初始化块先执行的),,执行玩了静态,就执行普通的,然后执行构造方法
最后是老师留的一个思考问题:静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员?
查阅资料后,我明白了,我们其实可以在静态方法中定义一个实例化对象,再经过实例化对象,来访问非静态成员,下面通过代码进行实现。
相关资源:(4条消息) java字段初始值_Java字段初始化规律_安夫的博客-CSDN博客
(4条消息) 如何在静态方法中访问类的实例成员_aijjb22260的博客-CSDN博客
标签:初始化,构造方法,静态,动脑,啊啊啊,冻手,Foo From: https://www.cnblogs.com/zhanshuang/p/16751151.html