🛫 JDK和JRE傻傻分不清?
好歹也是学了那么长时间的Java了,强烈的直觉告诉我JDK、JRE这俩指的肯定不是一个东西,一看书才知道我的直觉是真滴准(夸夸自己),既然不一样,那么接下来就扒一扒JDK和JRE的野史吧。
JDK 是指Java Development Kit 也就是我们常说的Java开发工具包,是程序员编写Java程序时必须使用的软件。JRE 是指Java Runtime Environment 也就是Java的运行时环境,是程序运行时必须依赖的软件。那么我们想要使用Java这门语言进行编程的话,究竟需要安装哪个呢?答案是我都要,一个编译一个运行缺一不可。不过当你下载了JDK之后就会发现,在jdk的安装目录下会有一个的jre文件夹,也就是意味着我们只需要下载jdk即可。jdk的下载安装配置十分简单:点击我仅需四步即可完成
既然是野史就说一说大家可能不知道的知识点,在1998~2006年之间,开发工具包被称为是SDK(Software Development Kit)后更名JDK,在某些场合中任然会见到这个术语;同一时间段内Java所出的版本被统称为java 2。看到这个名词不知道大家会不会联想到J2EE,猜的没错 J2EE的全称就是Java 2 Platform Enterprise Edition也就是Java 2 平台企业版,是在SUN公司领导下多家公司(Oracle、IBM、BEA等)共同制定的一套广泛认可的企业级分布式应用程序开发规范,后来强大如J2EE还是被Spring框架所冲击,导致这一切的就是那个恐怖如斯的男人——罗德·约翰森(Rod Johnson)
🛫 HelloWorld的输出都经历了啥?
以HelloWorld程序为例介绍java程序开发的几个步骤:😶程序员编写HelloWorld.java文件(源代码文件)🤔计算机使用javac.exe程序将HelloWorld.java文件编译成HelloWorld.class文件(字节码文件)🤨计算机使用java.exe程序将HelloWorld.class文件送到JVM中运行😲运行的过程中随时向核心类库中调用Java编写好的程序来支撑自己编写程序的运行
手动操作编译运行的过程中有几个注意点:
1、编写的源代码文件以.java作为拓展名,放在C盘以外的盘符下,显示文件的拓展名防止文件的拓展名不是.java,否则会报javac: 找不到文件的错误
2、使用java.exe运行字节码文件的时候,HelloWorld后面没有拓展名
🛫 Java的三个版本都是啥?
Java SE(Java Standard Edition):标准版
Java EE(Java Enterprise Edition):企业版
Java ME(Java Micro Edition):微型版
🛫 关于main方法你都知道啥?
public static void main(String[] args)
public: main方法的访问权限为public,方便虚拟机直接调用
static: 静态方法,虚拟机不用创建该类的对象即可调用它内部的main方法
void: 没有返回值,也就是说返回值为空
String[] args: 在使用命令行执行Java程序的时候,会通过命令行参数传递一些数据,这些数据就会被名为args的字符串数组所接收
首先,根据Java语言的开发规范,main方法必须被声明为public,当然只是规范而不是必须。如果想要使用private或者protected不将main方法对外开放的话也是可以的,而且源代码文件依旧会被正常编译为字节码(.class)文件,只不过在运行的时候会报"Main method not public"的异常错误。
出现上述情况的原因是:类加载后main方法被虚拟机所调用执行,但是由于main方法并不是public的,导致虚拟机无法调用该方法出现异常。从以上的结论中我们就可以推知,如果在intellij IDEA中不将main方法的访问权限设置为public的话,就会导致main方法左侧不会出现供代码运行的绿色小三角图标 main方法是Java程序的入口,所以每个Java程序都必须有一个main方法,但并不代表着每个类都必须有main方法
🛫 强制and自动类型转换都是啥?
Java是一种强类型语言,这就意味着我们在编译之前就应该为每一个变量声明一种类型。而在Java中数据类型又被分为基本数据类型和引用数据类型,基本数据类型又被分为四类八种,除了基本数据类型之外的所有数据都是引用数据类型自动类型转换
下面这张图片中,揭示了基本数据类型间的自动转换关系。箭头之间具有传递性,实线箭头代表着无精度损失的转换,虚线代表转换会伴随着数据精度的损失。其中char转int会将char字符对应的ASCII码赋给int型变量。 表达式(用一个二元运算符连接两个值)中的自动类型转换,小范围的值会自动转换为较大范围类型的值参与运算,所以说表达式运算的最终结果由最高类型的值决定。而且byte、short、char类型的值不管如何,都是直接转换成int参与远算,所以说(byte)+(byte)=(int),其他两种类型也是如此
强制类型转换
由自动类型转换可知,int类型旳值在必要的时候会自动转换为double类型,但是当我们需要将double转int的时候该怎么办呢?这个时候就要通过强制类型转换了。
浮点型强转为整型,直接丢掉小数只保留整数部分,而并不是简单的将结果四舍五入,Math.round()方法可以四舍五入(返回值是long型)。如果在强制转换的过程中,数值超过小范围取值的话,结果将会被截断成两个完全不同的值,eg:(byte)1500 = -36,原理如下:
显式转换一般就是强制类型转换,隐式转换除了自动类型转换还有一种,那就是结合赋值运算符,也就是+=、-=等。如果这种运算符得旳结果类型与左侧的的类型不一样且无法进行自动类型转换,就会默认使用强制类型转换将右侧的类型强转为左侧的数据类型
整型值和布尔值之间无法进行相互转换,无论是自动转换还是强制转换都不可以
最后,给两道题自测一下类型转换的掌握程度字丑,勿怪😳