动手动脑!!!!!!!!!准备冻手准备冻手!!!!!!!!!!!我说冻手你是不是二龙啊啊啊啊啊啊啊

题目:

以下代码为啥无法运行,哪里出错了?

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博客

posted @   孟昊  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示