Java基础笔记(1)-语言基础
Java的简单介绍
1.Java技术体系平台
版本 | 描述 |
---|---|
Java SE(Java Standard Edition)标准版 | 支持面向桌面级应用的Java平台,提供完整的Java核心API |
Java EE(Java Enterprise Edition)企业版 | 为开发企业环境下的应用程序提供解决方案,主要针对Web应用开发 |
Java ME(Java Micro Edition)小型版 | 支持运行在移动终端上的平台,对Java API有所精简(目前使用较少) |
2.Java的重要特点
简单性:一方面,Java剔除了C++中许多很少使用、难以理解、易混淆的特性,以便系统更容易理解。另一方面,Java的目标之一是支持开发能够在小型机器上独立运行的软件。
面向对象(OOP)
分布式:Java有一个丰富的例程库,用于处理HTTP、FTP之类的TCP/IP协议
健壮性:强类型机制、异常处理、垃圾自动回收等
安全性
体系结构中立
可移植性
.java
->.class
- 一个编译好的
.class
文件可以在多个平台上的Java虚拟机上运行
解释型
- 解释型语言:编译后的代码不能被机器直接执行,需要解释器来执行
- 编译型语言:编译后的代码能够被机器直接执行
高性能:即时编译器可以监控经常执行哪些代码,并优化这些代码以提高执行速度。
多线程
动态性
3.Java的运行机制和运行过程
.java
程序通过编译成为.class
,.class
文件运行在JVM(Java虚拟机、Java
Virtual Machine)中。
- JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域、负责执行执行,管理数据、内存、寄存器等,包含在JDK中
- 对于不同的平台,有不同的虚拟机
- Java虚拟机机制屏蔽了底层运行平台的差别,“一次编译、到处运行”
指令:
javac
:编译,从.java
编译成.class
java
:运行
4.JDK和JRE
- JDK:(Java Development Kit Java开发工具包)
- JDK = JRE + java的开发工具(java、javac、javadoc、javap等)
- 提供给java开发人员使用,包括了JRE,无需单独安装
- JRE:(Java Runtime Environment Java运行环境)
- JRE = JVM + Java的核心类库
- 只能运行开发好的Java程序(.class),提供给java使用人员使用
5.Hello World
1 |
|
注意事项:
- 可能出现控制台的文件编码问题(默认下控制台的编码为GBK)
- java后的指令不需要加
.class
(默认是运行一个类,类的名字为Hello)
细节说明:
- 入口程序有固定的书写程序
- 严格区分大小写
- 语句最后带分号
- 一个源文件中最多只能由一个public类,其他类的个数不限
- 编译后每一个类都对应生成一个
.class
文件
- 编译后每一个类都对应生成一个
- 如果源文件中包含一个public类,则文件名必须按照该类的名称来命名
- 也可以将main方法写在非public类当中,然后指定运行非public类,这样入口方法就是非public的main方法
- 每个类都可以有自己的入口方法
Java快速入门
1.注释
1 |
|
1 |
|
- 基本格式
- Javadoc标签,不能随便乱写
- 生成文档注释
javadoc -d 目标文件夹 -xx -yy java文件
- -xx -yy表示对应需要生成的Javadoc标签
- 之后会在目标目录下生成一堆html文件
2.变量相关
Java是一种强类型语言,这意味着必须为每个变量声明一种类型。
在Java中,一共有8种基本类型,其中有4种整型、2种浮点类型、1种字符类型和1种布尔类型。
基本数据类型
- 整数型
- byte(1)、short(2)、int(4)、long(8)
- 浮点型
- float(4)、double(8)
- 字符型
- char(2)
- 布尔型
- boolean(1)
- 整数型
引用数据类型
- 类(class)
- 接口(interface)
- 数组([])
数据类型对应的字节数在不同的操作系统上是固定的(JVM)
整型常量默认为int,长整型指定需要加l或者L
可以为数字字面量增加下划线,如
1_000_000
。这些下划线只是为了让人更加易读,Java编译器会去除这些下划线不同进制:0b/0B、无、0、0x/0X
浮点类型的精度问题同样存在
java没有无符号数,都是有符号的
java的char是两个字节,c++的char是一个字节
java中的char可以直接存放中文,C++中则不可以
在C++中,数值甚至是指针可以代替boolean值,即值0相当于布尔值的false,但是在Java中不能够这样
3.常见的字符编码表
- ASCII:一个字节,128个字符
- Unicode:固定大小编码,使用两个字节来表示,字母和汉字都使用两个字节
- UTF-8:大小可变编码,字母使用一个字节,汉字使用3个字节
- gbk:可以表示汉字,而且范围广,字母使用一个字节,汉字使用2个字节
- gb2312:可以表示汉字,gb2312 < gbk
- big5:繁体中文
4.类型转换
自动类型转换:按照精度向上自动转换(精度小 -> 精度大)
- byte:把具体的数赋值给byte的时候,先判断该数是否在范围内,如果在范围内就可以进行复制;但是如果是将变量赋值给byte的话,则直接进行类型判断
1 |
|
byte(short)、char之间不会进行自动转换(char直接到int层面)
byte、short、char可以进行运算,在(单独或者混合)运算的时候直接提升到int,
强制类型转换:需要加上强制转换符(),可能会造成精度降低或者溢出
5.基本数据类型和String的转换
基本数据类型转String:加双引号
1 |
|
String转基本数据类型:通过包装类某某调用parse某某方法
1 |
|
6.运算符
运算符
- 算术运算符
- +、-、*、/、%、++、--
- 赋值运算符
- =、+=、-= 、*=、/=、%=
- 关系运算符(比较)
- ==、!=、<、>、<=、>=、instanceof()
- 逻辑运算符
- 短路与&& 短路或|| 取反!
- 逻辑与& 逻辑或| 逻辑异或^
- 短路与判断到能够得出结果后就不会进行后续的条件判断了
- 逻辑与会继续判断所有的条件
- 最终结果还是一样的
- 位运算符
>>
、<<
、>>>
、&
、|
、~
、^
>>>
:无符号右移,高位补0>>
:算术右移,高位补符号位<<
:算术左移,低位补0
- 三元运算符
- 条件表达式 ? 表达式1 : 表达式2
7.标识符命名规范
- 包名:多单词组成,所有字母都小写,单词之间使用
.
(aaa.bbb.ccc) - 类名,接口名:所有单词首字母大写(大驼峰)
- 变量名,方法名:第一个单词首字母小写,后面的单词首字母大写(小驼峰)
- 常量名:所有字母都大写,单词之间使用
_
(TAX_RATE)
8.键盘输入
需要使用Scanner(类)
使用步骤:
- 导入该类所在的包,这里是
java.util.*
- 创建该类的对象(声明变量)
- 调用里面的功能(使用相关的方法)
1 |
|
因为输入是可见的,所以Scanner类不适用于从控制台读取密码。Java6引入了Console类来实现这个目的,读取密码可以使用下列的代码
1
2
3
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");为了安全期间,返回的密码存放在一个字符数组中,而不是字符串中。在对密码处理完成之后,应该马上用一个填充值覆盖数组元素(不保存密码的原文)
Console对象处理输入,必须每次读取一行输入
9.标准输出
标准输出使用System.out.println()
或者System.out.print()
并且在Java中,还沿用了C中的printf方法提供格式化输出。System.out.printf()
10.文件输入与输出
读取文件:
1 |
|
写入文件:构造一个PrintWriter对象,在构造器中提供文件名和字符编码
1 |
|
之后就可以调用对象的print、println、printf等方法了。
文件的相对路径是相对于当前的工作目录的。
对于使用
java
命令启动的程序,工作目录为启动JVM的位置,即执行该命令的位置对于集成开发环境来说,启动目录将由IDE来控制。
11.原码、反码和补码
- 计算机内存当中,二进制均以补码的形式存储,在任何运算的时候都是以补码的方式来进行运算的
- 补码统一了正数和负数的计算
- 原码和补码:如果是有符号的,首位为符号位,0表示+,1表示-
- 原码和补码的相互转换
- 原码->补码
- 正数:补码与原码相同
- 负数:符号位不变,其它位取反+1
- 补码->原码
- 首位为0:原码与补码相同
- 首位为1:符号位不变,其它位取反+1
- 原码->补码
- 正数的原码、反码和补码都一样(三码合一)
- 负数的反码:符号位不变,其它位取反
- 负数的补码 = 反码 + 1
- 负数的反码 = 补码 - 1
- 0的反码,补码都是0
- 我们看运算结果的时候需要看他的原码
12.控制语句
顺序控制
分支控制
- if、else、else if、switch-case
循环控制
- for、while、do-while
- break、continue、return
Java中提供了一种带标签的break语句,用于跳出多重嵌套的循环语句
13.大数
如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math
包中的两个大数类BigInteger
和BigDecimal
,这两个类可以处理包含任意长度数字序列的数值。
使用valueOf()
将普通的数值转换成大数,或者传入带字符串参数的构造器。不能使用普通的算术运算符进行计算,而应该使用提供的add
、multiply
方法。
14.数组
数组初始化:
1 |
|
注意事项:
- 没有指定初始值,会有默认值
- 使用步骤:声明数组并开辟空间、给数组各个元素赋值、使用数组
- 引用数据类型拷贝默认情况下是传递地址(引用传递)
.length
可以获取长度
1 |
|
二维数组的使用:
1 |
|
注意事项:
- 可以不指定后续的第二个[]中的值,第一个[]必须指定
- 可以使用变量来进行初始化
- 二维数组的各个一维数组的长度可以相同也可以不相同(不相同的可以在循环中指定)
快速打印数组:
1 |
|
15.静态导入
在 JDK 1.5 之后,Java增加了一种静态导入的语法,用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。如果一个类中的方法全部是使用 static 声明的静态方法,则在导入时就可以直接使用 import static 的方式导入。静态导入也有两种语法,分别用于导入指定类的单个静态成员变量、方法和全部静态成员变量、方法。分别如下:
1 |
|
使用静态导入之后,之前需要利用类名称来调用的静态方法,现在就可以直接调用了。