【Java基础总结】HelloWorld【一】

📢博客主页:🏀九九舅舅酒酒🏀
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!👏
📢本文由 【九九舅舅酒酒】 原创,首发于 CSDN🙉🙉🙉
📢由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨个人主页
📖精品专栏(不定时更新)【JavaSE】 【MySQL】【LeetCode】【Web】【操作系统】

📖精品文章(纯JavaSE实现图书管理系统<含精解注释>)


目录

写在前面

一 你真的搞懂我们的主函数了吗!?

主函数的浪漫,又有谁懂?

当你向世界说你好时,世界也在面向你!~ 

上面的原理

补充

二 如何在她(main方法)说出HelloWorld之前打招呼?

如何实现在main()方法执行前输出"Hello,World"

三 Java程序初始化的顺序是怎样的【面试必备!~】

理论铺垫

It is easy to say,show me your code.

定义父类Base!~

定义子类Derived!~

最后的小结

最后的最后



写在前面

回首来路,自选择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学习之旅,我们一起学习,共同进步!~让我们一起向未来!


最后的最后

光阴荏苒 斗转星移,请相信
爱和希望总会比病毒蔓延得快
请相信
“一方有难,八方支援”的中国力量
请相信
凛冬散尽之时,星河定会长明
我们终将用勇敢和坚毅
照亮同一使命

山河共风雨
日月耀明天
我们同心抗疫
必将苦尽甘来,山河无恙

人间皆安,万事顺遂,长乐无忧

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻根根呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值