动手动脑!!!!!!!!!准备冻手准备冻手!!!!!!!!!!!我说冻手你是不是二龙啊啊啊啊啊啊啊
题目:
以下代码为啥无法运行,哪里出错了?
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,,所以三个静态对象依次输出了一遍,(从这里我们还可以发现,,静态初始化块是比普通初始化块先执行的),,执行玩了静态,就执行普通的,然后执行构造方法
最后是老师留的一个思考问题:静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员?
查阅资料后,我明白了,我们其实可以在静态方法中定义一个实例化对象,再经过实例化对象,来访问非静态成员,下面通过代码进行实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能