逐行精读Java代码(基础篇)——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)
运行结果
第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
下一篇: log ln exp pow的c实现