欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-11 16:18:13
本文是“逐行精读Java代码(基础篇)”的第一小节。主要介绍了java比较重要的一些特性,文章篇幅不长,难度也不大。主要是大黑熟悉下csdn编辑文章的基本操作。该专题后续会持续更新,后面也会逐步深入到java源码分析,感兴趣的朋友可以关注一下。...

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


前言

“逐行精读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)

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

运行结果

第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