逐行精读Java代码(基础篇)——Java简介

2022-07-28,,,,

叫我“大黑”就好。
我是一名计算机专业大数据方向在校本科生。
写博客主要是记录下自己的学习过程,博客的内容主要是对源码的分析和自己的一些看法。
但由于水平有限,出现错误还恳请各位大佬不吝赐教。
关于博客的建议,批评,指正或者有感兴趣的,想相互交流的朋友,欢迎在博客下留言或在邮箱留言。
博客主页:https://blog.csdn.net/qq_32278887
邮箱:1424343532@qq.com

文章目录

  • 前言
  • 1. Java简介
    • 1.1 Java主要特性
    • 1.2 Java和C++的异同
  • 2. 运行一个Java程序
    • 2.1 public static void main(String[] args)到底是什么
    • 2.2 理解含义
    • 2.3 为什么?那如果不呢?
    • 2.4 回到原点
  • 总结

前言

“逐行精读JAVA代码”是大黑计划做的第一个专题
该专题分为基础篇和进阶篇,不会有太多的篇幅介绍Java语法,主要是博主回过头来再次学习Java语言时,对java源码的分析和对知识点的一些理解。
如有误,恳请指正。


1. Java简介

Java分为三个体系:

  • JavaSE(Java平台标准版)
  • JavaEE(Java平台企业版)
  • JavaME(Java平台微型版)

1.1 Java主要特性

  • 简单
    Java语言语法和C和C++很接近,也丢弃了一些C++中很少使用,难以理解的特性。也提供了自动分配和回收内存空间的机制。但是(以下纯属个人看法),个人感觉依旧有学习C语言的必要,作为许多编程语言的“老前辈”,理解C中的一些设计对今后许多专业上的学习都很有帮助。
  • 面向对象
    Java语言是一个纯的面向对象程序设计语言。(封装,继承,多态)
  • 跨平台
    Java虚拟机(JVM)实现平台无关性。关于JVM这里,准备不久后开启一个新的专题详细介绍一下JVM的原理。
  • 可靠与安全
    Java语言本身就具有许多安全特性(严格遵循面向对象规范,语言级支持线程等等)。另外从淘宝网,京东网等大厂也是用Java做的,其可靠与安全就不言而喻了。(关于语言级支持线程,在接下来的源码分析中会有详细分析介绍)
  • 多线程
    C++语言没有内置的多线程机制,需要调用操作系统级的多线程功能进行多线程设计
    而Java语言却提供多线程支持,这也是Java与C++的区别之一(关于线程,在接下来的源码分析中会有详细分析介绍)
  • 支持网络编程
    Java中的servlet,jsp,ssh框架构成了强大又成熟的java网络编程类库。

1.2 Java和C++的异同

  • 都是面向对象语言(封装,继承和多态)

  • Java不提供指针来直接访问内存(甚至不提供方法查看值变量的内存地址)
    关于引用和指针,值传递和引用传递,大家感兴趣可以参看https://www.zhihu.com/question/31203609一位知乎大佬的高赞回答,感觉说的很清楚。
    关于里面JVM部分感兴趣的也可以回来看看大黑的“JVM专题” :)

  • Java的类单继承,接口多继承;C++类支持多继承
    这里在该专题后面的“面向对象编程”会有详细介绍 :)

  • Java有自动内存管理垃圾回收机制(GC)
    GC原理分析会在JVM专题中详细分析 :)

2. 运行一个Java程序

2.1 public static void main(String[] args)到底是什么

下面是一个基本的Java程序
代码如下(示例):


    public static void main(String[] args){}
    public static void main(String args[]){}
    //两种写法都是一样的,都表示字符串数组args,其中args只是普通变量名,可以随意定义(前提是符合变量名规则)

相信每一位朋友,在第一次学习Java时,都会被告诉:“main函数是主函数,这里是程序的入口,要记住主函数的写法(像上面一样) ”之类的话。
我认为对于初学者来说,这么做应该是对的,应该是性价比最高的做法。

2.2 理解含义

一部分细心的朋友,在学过了函数之后,会回过头来重新回顾一下main主函数。我们逐个单词看一下含义:

  • public
    “public” :表示成熟的访问权限,这里表示可以在任何的场合可以被引用
  • static
    “static” :表示方法是静态的,不依赖类的对象
  • void
    “void” :表示无返回值
  • main
    “main”: 函数名为main,约定俗成(几乎所有语言都是main)
  • String[] args(这里以上面第一种写法为例)
    “String[] args” :函数形参,类型为String[]字符串数组,参数名为args

尝试为main函数传递参数,代码如下(示例):

public static void main(String[] args){
        System.out.println("Welcome back !");
        for(int i = 0;i<args.length;i++){
            System.out.println("第"+i+"个参数是:" + args[i]);
        }
    }

传递参数
(这里使用idea进行调试 Run -> Run Configurations)

运行结果

第0个参数是:参数1
第1个参数是:参数2
第2个参数是:参数3

Process finished with exit code 0

哦了,现在我知道main主函数都是什么含义了。

2.3 为什么?那如果不呢?

像青春期一样,技术上的成长也会经历一个叛逆的阶段。总会想着:“凭什么?” “我要是不呢?”
为什么要使用public?为什么要使用static?为什么要返回void?为什么要命名为main?…
那我如果不呢?
下面来看看这些都是为什么?如果不,会怎样?
示例代码:
大体上和上面差不多,只是多了类名base(也是为了体现一下这里),为了便于观看,就在此又插入了一遍 :)

public class base {
    public static void main(String[] args){
        System.out.println("Welcome back !");
        for(int i = 0;i<args.length;i++){
            System.out.println("第"+i+"个参数是:" + args[i]);
        }
    }
}
  • public 和 static :
    首先Java中的所有函数都必须属于一个类,因此main函数必须是某个类的成员。(只是我们平时做项目的时候,这个类不同于实体类,比较特殊,一般作为项目的入口单独存在)
    由于main函数是类的成员函数,因此想要被直接调用,必须使用 public static 使其成为静态函数并具有公开权限。
//操作1:尝试在这里把public改成private
private static void main(String[] args)
//运行结果:(找不到)
错误: 在类 Java_Base.chapter1.base 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

Process finished with exit code 1
//操作2:尝试把static去掉
public void main(String[] args)

//运行结果:(明明白白告诉你了)
错误: main 方法不是类 Java_Base.chapter1.base 中的static, 请将 main 方法定义为:
   public static void main(String[] args)

Process finished with exit code 1
  • void :
    一句话 “规定”!
    JVM规定:在Java Application中main不允许返回值。
    (这里也可以看出和C++的一点不同,在C++中,main函数会有一个int类型的返回值,该返回值是一个“bug code”,不同的数字对应不同的返回状态。其中0是正常运行结束。这在Linux和C中也一样。其实细心的话也能发现Java中每次运行结果的最后一行也会输出一个bug code)
    嗯,还是那句话,关于JVM分析,来我主页吧 :)
//操作3:把void改为int,并return 0 作为返回值
public static int main(String[] args){
        return 0;
    }
//运行结果:(也是明明白白,就是不行!)
错误: main 方法必须返回类 Java_Base.chapter1.base 中的空类型值, 请
将 main 方法定义为:
   public static void main(String[] args)

Process finished with exit code 1
  • main:
    main能不能修改?先试试
//操作4:将main改为test
public static void test(String[] a)
//运行结果:(表示找不到main)
错误: 在类 Java_Base.chapter1.base 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

Process finished with exit code 1

运行结果报错,找不到main方法。原因是main是大多数编程语言约定俗成的主函数名,就是规定。推测可能是JVM的运行机制,是找到名为main的函数作为函数的运行起点。

  • args:
    这里面的形参名args,倒是无所谓。随便修改只要符合命名规则即可。
//操作5:这里把args改成a
public static void main(String[] a)
//运行结果:(返回值0,说明正常运行)
Process finished with exit code 0
  • String[]
    形参类型,能变吗?
    在说明原因之前先尝试修改,看看运行结果如何?
//操作6:将形参类型改为String
public static void main(String a)

//运行结果:(找不到main方法 和将main改名字一样的报错内容)
错误: 在类 Java_Base.chapter1.base 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

Process finished with exit code 1

还是那句话。规定!
但这里发现报错内容和修改main函数名一样。因此推测可能是JVM的运行机制(这里大黑先挖个坑)
至于为什么非要使用String[]数组而不选别的类型,我看到最合理的解释是这样的:Java的数组具有下标检查功能,因此可以输入任意多的参数。
对于这个问题,大黑如果能在接下来的学习中有所启发,会将想法写下来与大家分享交流。

2.4 回到原点

兜兜转转,回到原点。
一系列的分析下来,结论是:
public static void main(String[] args){}
就这么用,不能修改。
哈哈,叛逆的孩子遭到毒打,回到原点,但收获的东西,肉眼可见。


总结

这是大黑写的第一个博客,篇幅不长,难度不深。但接下来的小节会如前言介绍的,进行源码分析,比如下一节《逐行精读Java代码(基础篇)——Java基础语法》中会对String类的源码进行分析。
本篇博客,算是作为一个专题的序言,也是自己CSDN旅途的起点。愿未来能有光芒照耀。

由于水平有限,出现错误还恳请各位大佬不吝赐教。
关于博客的建议,批评,指正或者有感兴趣的,想相互交流的朋友,欢迎在博客下留言或在邮箱留言。
博客主页:https://blog.csdn.net/qq_32278887
邮箱:1424343532@qq.com

以上所有内容若涉及版权等问题,望通知。

本文地址:https://blog.csdn.net/qq_32278887/article/details/109259837

《逐行精读Java代码(基础篇)——Java简介.doc》

下载本文的Word格式文档,以方便收藏与打印。