菜鸟学习笔记:Java基础篇1
- 写在前面
-
- 关于学习资源
- 关于学习方法
- 走进Java
-
- JDK、JRE、JVM
- JDK安装教程
- HelloWorld程序
- Java开发工具
- 标识符与驼峰命名法
- 字符集介绍
- Java基本数据类型
-
- 整型数据
- 浮点数
- char类型
- boolean类型
- 类型转换
-
- 自动类型转换
- 强制类型转换
- 表达式类型提升问题
写在前面
第一次发博客心里还是有点小紧张啊,哈哈,先自我介绍一下,刚毕业小白一枚,接触编程有两年多了,在校期间做过各种各样乱七八糟稀奇古怪的项目。不过大多是现学现卖的那种,这次想系统对之前学过的知识进行一次整理加强,同时发布下自己的学习心得,加深记忆的同时,给各位刚刚接触编程的同学一个参考。当然毕竟自己也是在学习的过程,书写过程不免会有不对的地方,也欢迎各位大神的批评指正,大家共同进步!
关于学习资源
针对学习资源来说网上的资料各式各样学习资源,但个人感觉对于小白来说还是以视频为主,一开始不建议直接从API文档入手(除非你有足够的天赋可以忽略我的建议),其一编写文档的人都是有几年工作经验的老手,职业官话已经成为了一种习惯,要没接触过很多时候很难看懂。其二,跟着视频敲代码学到的不仅是代码的API,同时还有良好的编成习惯以及一些文件架构,对我们之后的工作很有帮助。对于视频B站是一个不错的资源宝库(这里非常感谢热心的up主们),当然如果你有钱各大培训机构资源数不胜数,你真的可以为所欲为。
关于学习方法
一般来说编成的学习就是理论+实践(这不是废话嘛),但要论重要性个人觉得理论占四成,实践占六成。说实话编程这东西是个熟练工,很多概念靠看是学不会的,只有你练过了、写过了才能明白其中的道理,建议各位同学没每学习一个阶段就找一个小型项目练练手,夯实基础的同时也能查漏补缺。
在学习过程中如果时间充裕最好可以边看边敲,记忆深刻。不过一般情况不会给我们那么多时间,所以我建议先跟着视频过一遍,到一个阶段结束可以找一个小项目自己练习,肯定会有许多不明白的地方。这时候在回去看不明白的点,就会有一种温故而知新的感觉。还有大家不要相信网上那种什么几个小时掌握Java之类的广告,知识这东西没有捷径,全是靠一步一个脚印慢慢积累起来的。如果只想投机取巧的话不建议你走程序员这条道路。
好了废话说完了,接下来就步入正题吧。
走进Java
JDK、JRE、JVM
首先小小的盗个图。。。
JDK(Java Development kit)Java开发工具包——是Sun公司针对Java开发员的产品,是整个JAVA的核心,包括了Java运行环境JRE、Java工具(javac/java/jdb等)和Java基础的类库。
JRE(Java Runtime Environment)Java运行时环境——是运行基于Java语言编写的程序所不可缺少的运行环境(这里注意一下,并不是开发环境),Java程序文件可以运行在电脑上全部依仗它的存在。
JVM(Java Virtual Machine)Java虚拟机它是整个java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。因为JVM的存在才让Java成为了现今最流行的后端语言。
由于JVM跨平台的特性,现今很多其他语言也通过自己的编译器生成可供JVM运行的class文件,所以现在的JVM也是一个跨语言的平台。
JDK安装教程
网上关于这方面的教程数不胜数,这里不再过多赘述。
参考网站1
参考网站2
过程很简单,这里我对配置稍微解释一下配置JAVA_HOME的过程其实就是对jdk文件的路径起了一个叫JAVA_HOME的别名,类似变量赋值,而在系统变量里变量Path中的配置表示当我们打开cmd窗口输入javac或java命令时,系统会到Path指定的路径中寻找javac.exe和java.exe并运行,这两个文件就是分别来编译(就是把.java文件生成.class文件)和执行(.class文件加载到内存中执行得到结果)。
HelloWorld程序
在完成上一步的配置之后我们就可以正式的开始编写Java程序了,首先需要新建一个HelloWorld.txt文本文档之后再文件中编写:
// helloworld
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
随后保存文件并将后缀改为.java(可能会出现后缀名不存在的情况,参考这里),然后在当前目录(划重点)打开控制台,输入命令:
javac HelloWorld.java
如果成功执行当前目录下会生成一个HelloWorld.class的文件。然后输入
java HelloWorld
如果程序成功执行控制台就会打出如下图所示结果。
有几个值得注意的点:
- 文件名必须和类名(public class 类名)相一致,否则会报错。
- System.out.println();中的内容必须加上""号。
- 代码中所有符号必须是英文符号。
- 进入当前目录的方法:控制台中输入C:(你程序在哪个盘里就输哪),然后cd 你的程序所在具体路径。cmd中按up键可以直接使用上一条指令非常方便。
Java开发工具
至此HelloWorld程序编写圆满结束,不过生产实践中如果用记事本去编写代码不但编码效率低而且易出错,市面上有海量代码辅助工具,它们大多会支持自动填充代码、关键字高亮、自动换行等操作,大大提升我们的开发效率。一般的开发工具有编辑器和集成开发环境,编辑器可以简单的理解为给代码高亮功能的文本编辑器,特点是轻量便捷,而集成开发环境则是指封装了代码自动检测、断点调试、自动新建项目、自动执行代码、项目导入导出等功能的综合开发工具,一般功能比较全面但较为庞大,有的存在付费的情况,对于开发工具的选择根据个人喜好而定,一般情况下我们会安装一个编辑器用于调试和一个集成开发环境用于开发,这个给大家推荐几款好用的开发工具:
编辑器:
- Sublime Text3 功能比较丰富。
- notepad++ 安装使用简单。
集成开发环境:
- IntelliJ IDEA 个人最喜欢的集成开发工具,没有之一,操作顺畅、快捷键丰富、支持现今大部分类型的Java项目创建。。。。。。可以说支持我们能想到的所有功能。但美中不足的就是需要付费(当然热心网友给了我们大量解决方法,大家可以自行百度)。
- eclipse Java最经典的集成开发环境,功能同样十分强大,并且开源免费,可以直接上官网下载。
标识符与驼峰命名法
所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
规则:
- 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
- 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
- 关键字不能用作标识符
- 标识符是大小写敏感的
对于标识符这个问题不用过多的去纠结概念,直接建议大家在以后的编程中采用统一的驼峰命名法,规则如下图。
怎么个意思那,比如我们要定义一个变量表示鸡蛋的数量,那么这个变量一定是int类型(变量类型后面说),鸡蛋的单词是egg,数量可以用num表示,那这个变量的名字就是iEggNum,很简单吧,这样的命名方法无论自己还是别人读你的程序其意思都是一目了然。
字符集介绍
字符集(character set)是一个系统支持的所有抽象字符的集合。字符(character)就是各种文字和符号,包括国家文字、标点符号、图形符号、数字等。
概念的习惯永远都是把简单的问题复杂化。。。这个东西很简单,中文苹果在英语中叫apple,在法语中叫Pomme,字符集也是同样,它是指我们输入的文字在和计算机交互时的翻译规则,我们用UTF-8字符集输入苹果可能会翻译成00010001,而用GBK输入可能就是01000100,这里需要注意英文26个字母、数字、符号无论在哪个字符集里编码都是不变的,遵从ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码),但中文就比较坑了,在不同字符集中表示同一个中文汉字的编码是不同的(像刚才苹果的例子),在编程过程中出现乱码问题基本就是字符集不统一导致的。
对于字符集问题这里也只能简单提一下,具体细节可以参考相关教程,一般情况下中文常用的字符集(其实也就用这两个)有UTF-8和GBK两个,在遇到乱码问题时,修改代码字符集一般直接就可以解决问题,或者更暴力一点直接统一使用UTF-8,对于Java编成来说会处理乱码问题足够了。
Java基本数据类型
首先说明Java是一种强类型的语言,每个变量都必须声明其类型。
强类型和弱类型我做个简单的解释。
比如:
int iNum = 123; //这时候a只能存储int类型的数据
iNum = "abc"; //编译会报错
而在Javascript(弱类型语言)中:
var iNum = 123;
iNum = "abc"; //这里合法
注意类型转换针对的是变量值(上例中的123),而强类型和弱类型针对的是变量(上例中的a),变量一经声明,就只能存储这种类型的值,其他的值则必须通过转换之后才能付给该变量,有编译器自动理解的转换,也有由程序员明确指定的强制转换,而弱类型的变量类型则是随着需要不断转换。
Java有两大数据类型:
内置数据类型
引用数据类型
引用数据类型在介绍面向对象的时候再做介绍,内置数据类型一般包括以下8种:
取值范围
序号 | 数据类型 | 位数 | 默认值 |
---|---|---|---|
1 | byte(位) | 8 | |
2 | short(短整数) | 16 | |
3 | int(整数) | 32 | |
4 | long(长整数) | 64 | 0.0l |
5 | float(单精度) | 32 | 0.0f |
6 | double(双精度) | 64 | |
7 | char(字符) | 16 | \u0000 |
8 | boolean(布尔值) | 8 | false |
一个字节通常占有8个二进制位,一个二进制位只能表示0或1,那么由此可以得到不同类型数据的表示范围,比如int类型占用4个字节,所以就只能表示232-1个数,也就是-231~231-1。为了节约存储,一般在可以达到要要求的情况下选择占用字节最小的数据类型。
整型数据
基本数据类型当中byte、short、int以及long类型用来表示整型常数,对于整型常数一般有三种表示形式
- 十进制整数,如100、32
- 八进制整数,要求以0开头,如054
- 十六进制整数,要求以0x开头,如0x34
还有一点要注意的是整型数据默认是int类型,要声明long类型的数据如果数值大于int表示范围,需要在常量后加上"l"或"L"。
浮点数
float类型和double类型用来表示浮点数。其中float类型的尾数可以精确到7位有效数字,double类型可以精确到15位有效数字,一般浮点数默认为double类型,如要将其变为float类型,需要在后面加上"F"或者"f"。
最后总结一下浮点数存在舍入误差,很多数字不能精确表示(BigDecimal可以解决这个问题,详细可查阅相关资料),所以建议在数据比较中要尽量避免浮点数。
char类型
char表示字符型数据,占有2个字节,用来表示Unicode表中的字符集(utf-8、utf-16等都属于Unicode,这里提到了Unicode、GBK、ASCII 等字符集相关的术语,大家要是刚开始接触可能和我当初一样又会对字符集又产生疑惑,我在找了一篇文章很清晰的对字符集进行了讲解,我在这里就不做太详细的叙述),允许表示65536个字符。单引号一般用来表示字符常量,如’A’、’,’、‘1’都是一个字符(注意’1’和整型1不一样,一个是数,一个是字符)。
字符还包括空格、回车换行等操作,但在程序输入过程中无法直接键入这些操作,所以就需要转义字符来表示,转义字符一般以’/‘开头,后面的字母表示其含义,如’/n’表示回车换行。
char在运算时可以直接当作整数来运算,也可以将0-65535之间的整数直接转换为char,比如:
char c = 'a';
int iResult = c + 2;
system.out.println(iResult ); //由于a的ASCII码为01100001,代表97,那么输出结果就为99
char cResult = (char)iResult;
system.out.println(cResult); //将99转为其ASCII码对应结果,输出结果为c
多个char字符组成的数组就是String类型了,对于String类型之后会做详细介绍。
boolean类型
boolean类型有true和false个值,在编译后会使用1和0来表示,仅需1位(bit)即可存储,位是计算机最小的存储单位。但由于计算机处理数据的最小单位是1个字节,1个字节等于8位,所以boolean类型实际存储的空间是:用1个字节的最低位存储,其他7位用0填补。
- true:0000 0001
- false:0000 0000
类型转换
自动类型转换
一般情况对于容量小的数据类型可以自动转换为容量大的数据类型。下图描述了转换的关系,需要注意的是一般整型常量只要范围合理可以直接赋值给byte、short、char类型变量。
int i = 3;
double d = i; //合法
short s1 = 12;//合法
short s2 = 7894561; //不合法
注意在int和long类型转换为float和double类型时可能存在精度丢失的问题。
强制类型转换
在可能造成精度丢失或者溢出的情况下进行类型转化,也称之为造型。
在超出目标类型表示范围的情况下强制转型会把变量值截断为一个截然不同的值。
double d = 1.1;
int i1 = (int)d; //i的值为1
int i2 = 300;
byte b = (byte)i2; //b的值为44
表达式类型提升问题
在进行二元运算过程中当表示范围小的数据与表示范围大的数据进行计算会把结果自动转换为表示范围大的数据类型。
int i = 1; //i的值为1
long l = 2;
int iResult = i + l; //这时会报错,因为int类型与long类型相加,结果会提升为long类型,无法用int类型变量进行保存。
int i = 1000000000; //i的值为1
long l = 20;
long iResult1 = i * l; //结果为负数,因为int类型和int类型相乘结果类型没有提升,而结果值大于int表示范围,发生。即使用long类型变量存储到的也是溢出之后的错误数据。
long iResult2 = (long)i * l; //正确方法
限于篇幅先讲到这里把,写这篇文章主要是为了自己复习用,所以文中可能存在错误的地方欢迎大家批评指正,如果我的笔记可以帮到大家我也非常开心啦,也希望大家不喜勿喷,在下一篇我会对Java基础继续进行介绍。
下一篇:菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)