📢博客主页:🏀九九舅舅酒酒🏀
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!👏
📢本文由 【九九舅舅酒酒】 原创,首发于 CSDN🙉🙉🙉
📢由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨个人主页
📖精品专栏(不定时更新)【JavaSE】 【MySQL】【LeetCode】【Web】【操作系统】
目录
二 如何在她(main方法)说出HelloWorld之前打招呼?
如何实现在main()方法执行前输出"Hello,World"
It is easy to say,show me your code.
写在前面
回首来路,自选择Java,遑论风雨,拧着头向前,有时不懂得问题逐渐搁置,久而久之,基础不牢,地动山摇,最近再回头过来看Java基础知识,以不同的角度再去看,收获良多,特记之。
由于本人水平有限,只是在学小白一枚。知识的理解难免有不当之处,代码可能存在错误的地方,有任何问题欢迎评论区留言指出,感激不尽!
创作不易,烦请三连支持一下!~
Java学习之旅,我们一起学习,共同进步!~
一 你真的搞懂我们的主函数了吗!?
相信极大多数人选择一门编程语言之后最先接触的就是输出HelloWorld吧!?
Java面向对象的浪漫~只有Java程序猿才懂。可是不断学习,不断深入的过程中!
无论在编译器控制台,还是在屏幕上花里胡哨的输出,或者是cmd小黑框里,又或者在网页上输出。
主函数的浪漫,又有谁懂?
复制下面这行代码
粘贴到文本文件里
public class A {
public static void main(String[] args) {
System.out.println("HelloWorld!~");
}
}
建立一个:A.java的.java文件(java源文件)
在上面打开cmd
我们在命令行里使用javac命令对刚才的java源文件进行编译
可见文件夹内生成了一个java.class的 .class文件(编译后的文件)二进制字节码文件!~
打开发现是乱码。
我们再用java命令 将java.class 加载到JVM上进行运行
当你向世界说你好时,世界也在面向你!~
上述一套操作流程下来,只是为了熟悉cmd内使用java 和 javac命令
接下来,请复制下面的代码 并 新建一个 B.java文件
public class B {
static public synchronized final void main(String[] args) {
System.out.println("HelloWorld!");
for (String string : args) {
System.out.println(string);
}
}
}
这次,我们在使用java命令运行 B.class时
使用java B object oriented programming
HelloWorld!
object
oriented
programming
你从我的世界经过,并留下了一句Hello,我亦在目不转睛的凝视着你~
初识面向对象语言,HelloWorld!浪漫亦不过如此
上面的原理
main是JVM识别的特殊方法名,是程序的入口方法。字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段!~
补充
1)定义.java文件可以参考我之前的文章,更改文件扩展名
2)此外应该还有朋友注意到了我们的主方法 main()方法 还有其他的定义格式public 与 static 没有先后顺序关系,位置可以更换,也可以加上final修饰符 和 synchronized修饰!~
static public synchronized final void main(String[] args)
二 如何在她(main方法)说出HelloWorld之前打招呼?
如何实现在main()方法执行前输出"Hello,World"
众所周知,在Java语言中,main是程序的入口方法,在程序运行时,最先加载的就是main方法,
但这是否意味着main方法就是程序运行时第一个被执行的模块?
答案必然是否定的。
因为Java的面向对象特性决定了Java中以类为最基本的单位,在类加载完成时才会顺着类内主函数的入口进入main()方法。执行main()方法的内容!~
public class C {
static{
System.out.println("Hello");
}
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
代码如上,结果如下!~
三 Java程序初始化的顺序是怎样的【面试必备!~】
理论铺垫
通过上面的测试,我们发现了Java中类加载的顺序是最优先的
Java程序的初始化一般遵循三个原则(优先级依次递减)
1)静态对象(变量)(静态代码块) 优先于 非静态对象(变量)(初始代码块)
其中,静态 内容只 初始化 一次!而非静态内容可能会初始化多次。
2)父类优先于子类进行初始化
3)按照成员变量的定义顺序进行初始化
其中,同等级的变量 和 代码块(即同为静态或同为非静态),看定义顺序谁先谁后执行
默认值规则是一开是自动补充的,如类内的类变量和成员变量,Int基本类型的默认值都是0;
class A{
int anInt;//这个系统会自动给他补成0;这叫默认值规则
}
class B{
int anInt1=1024;//这叫初始化规则
}
It is easy to say,show me your code.
定义父类Base!~
package com.zdx.daily.java0101.test;
/**
* @program: daily.study
* @description: 测试用的父类
* @author: SmallRedSun
* @create: 2022-01-01 15:12
**/
public class Base {
static int anStaticInt = StaticIntMethod();
private static int StaticIntMethod() {
System.out.println("1------>父类静态变量赋初值:类变量");
return 1;
}
static{
System.out.println("2------>父类静态代码块~夹在静态变量一和三之间~");
}
static int getAnStaticInt=sMethod();
private static int sMethod() {
System.out.println("3------>父类静态变量赋初值:类变量");
return 3;
}
int anInt = intMethod();
private int intMethod() {
System.out.println("4------>父类赋初值规则:属性");
return 4;
}
{
System.out.println("5------>父类构造代码块(普通代码块~)~夹在静态变量一和三之间~");
}
private int intMethod1() {
System.out.println("6------>父类赋初值规则:属性");
return 6;
}
protected Base(){
System.out.println("7------>父类构造器(构造方法)");
}
}
定义子类Derived!~
package com.zdx.daily.java0101.test;
/**
* @program: daily.study
* @description: 测试子类,继承自Base类
* @author: SmallRedSun
* @create: 2022-01-01 15:21
**/
public class Derived extends Base{
static int anStaticInt = StaticIntMethod();
private static int StaticIntMethod() {
System.out.println("1------>子类静态变量赋初值:类变量");
return 1;
}
static{
System.out.println("2------>子类静态代码块~夹在静态变量一和三之间~");
}
static int getAnStaticInt=sMethod();
private static int sMethod() {
System.out.println("3------>子类静态变量赋初值:类变量");
return 3;
}
int anInt = intMethod();
private int intMethod() {
System.out.println("4------>子类赋初值规则:属性");
return 4;
}
{
System.out.println("5------>子类构造代码块(普通代码块~)~夹在静态变量一和三之间~");
}
private int intMethod1() {
System.out.println("6------>子类赋初值规则:属性");
return 6;
}
protected Derived(){
System.out.println("7------>子类构造器(构造方法)");
}
public static void main(String[] args) {
int a=1024;
System.out.println(a+"调用的main函数~~");
System.out.println("以此为分割线~~~上面的静态的都是随着类被加载的,找入口执行main方法捎带着搞的~~");
System.out.println("因为你的main方法含有static修饰符,可以类名.main调用,所以static");
System.out.println("所以给你安排的明明白白的,先把静态属性代码块儿给你咔咔的加载了!");
System.out.println("下面如果再有对象紧接着就应该是从父类的4开始~");
System.out.println("———————————————分割线—————————————————");
Derived derived = new Derived();
System.out.println("因为静态只能加载一次,上面new对象之前已经加载过一次了!");
System.out.println("所以再重新new对象还是从4开始~不信请拭目以待~");
System.out.println("———————————————分割线—————————————————");
System.out.println("下面再new一个对象~");
Derived derived1 = new Derived();
}
public static void main1(String[] args) {
System.out.println("———————————————分割线—————————————————");
System.out.println("上面应该是从父类从1~3与子类从1~3,加载main方法必不可少~");
System.out.println("———————————————分割线—————————————————");
System.out.println("下面就要直接new对象,先父类后子类从4到7整齐划一!~");
Derived derived = new Derived();
System.out.println("———————————————分割线—————————————————");
System.out.println("子类对象的实例化其实父类对象也悄悄地加载构造执行了~因为父类构造方法是最后的");
System.out.println(
"此处也能极好的解释了为什么父类有参,子类要super显式调用父类的构造方法"
);
System.out.println("其实构造方法就是执行new对象的最后一步了~冲呀!~");
}
}
复制上面的两段代码!
先将上面的主方法恢复正常跑一下(下面的改成main1)
再将上面的改成main1,跑一下下面的主方法!~
结合注释, 多观察几遍。Java程序的初始化顺序手到擒来
最后的小结
回转头来再看当初初识Java,一个cmd内正确使用javac和java命令输出HelloWorld就卡了我很长时间!现在再看,不过就是当初下载的JDK太多了,1.8的 11。由于JDK太多。path和home——path混乱了。多拆装几次,再去配置JDK和路径等~简直是易如反掌,探囊取物,反掌观纹!~
遇到困难真的不要第一时间想着绕过去,困难像弹簧。
最近西安疫情期间停课隔离,也渐渐意识到只有系统的学习才能学习到真东西。
由于本人水平有限,只是在学小白一枚。知识的理解难免有不当之处,代码可能存在错误的地方,有任何问题欢迎评论区留言指出,感激不尽!
创作不易,烦请三连支持一下!~
重回头系统Java学习之旅,我们一起学习,共同进步!~让我们一起向未来!
最后的最后
光阴荏苒 斗转星移,请相信
爱和希望总会比病毒蔓延得快
请相信
“一方有难,八方支援”的中国力量
请相信
凛冬散尽之时,星河定会长明
我们终将用勇敢和坚毅
照亮同一使命
山河共风雨
日月耀明天
我们同心抗疫
必将苦尽甘来,山河无恙
人间皆安,万事顺遂,长乐无忧