JDK、JRE、JVM
JDK:Java Development Kit,包含了JRE和JVM,扩充了开发工具
JRE:Java Runtime Environment,运行环境
JVM:Java Virtual Machine,可以用软件或硬件来实现,模拟了一个小巧的CPU处理JAVA。跨平台的核心,屏蔽底层系统的差别。
Hello World
新建一个Java文件,文件的后缀名为.java,如Helloworld.java
输入代码
1
2
3
4
5public class Helloworld{
public static void main(String[] args){ // 程序通过mai方法执行
System.out.print("Hello,world!");
}
}在控制台输入命令进行编译
1
javac Helloworld.java #编译成功控制台不输出消息,会在文件夹里生成一个Helloworld类
在控制台输入命令运行类
1
java Helloworld #输出结果会在控制台中显示
注意:
Java是大小写敏感的。
所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass
源文件名和代码里的类名必须保持一致,且首字母大写
主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。
Java基础语法
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。
实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
Java程序运行机制
Java既有编译型(Complie)的特点,又有解释型(Interpret)的特点。.java的源文件经过Java编译器成为.class文件。.class文件放入虚拟机的类装载器中,类加载进JVM。字节码校验器会检查代码是否出错,最后解释器会将代码解释给操作系统平台。先编译,再解释。
注释
注释并不会被执行
单行注释:
1
// 这是单行注释
多行注释:
1
2
3/*
这是多行注释
*/JavaDoc文档注释:
1
2
3
4/**
* @Description Helloworld
* @Author Rinta
*/
标识符
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
Java中的关键字:
注意:
- 所有的标识符应该以字母(A-Z或a-z),美元符($),或下划线(_)开始
- 首字母之后可以是字母(A-Z或a-z),美元符($),下划线(_)或数字的随意组合
- 不能使用关键字作为变量名或方法名
- 标识符大小写敏感
- 可以使用中文命名,不建议
Java修饰符
Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
- 访问控制修饰符 : default, public , protected, private
- 非访问控制修饰符 : final, abstract, static, synchronized
数据类型
Java是强类型语言,要求变量的使用严格符合规定,所有变量必须先定义后才能使用,
基本类型(primitive type)
数值类型
整数类型
byte 一个字节范围:-128 - 127
short 两个字节范围:-32768 - 32767
int 四个字节范围:-2147483648 - 2147483647
long 八个字节范围:-9223372036854775808 - 9223372036854775807
在数字后面加L,如:long num1 = 12344321L;
浮点类型
float 占4个字节
在数字后面要加F,如:float num2 = 22.3f;
double 占8个字节
字符类型
- char 占2个字节
boolean类型:占1位,值只有true和false
类型转换
转换的从低到高为:byte,short,char—> int —>long—>float—>double,低(范围)向高转换是自动转换,高到低要强制转换
注意:
- 不能对布尔值进行转换
- 不能把对象类型转换成不相干的类型
- 高到低要用到强制转换
- 转换的时候可能存在内存溢出,或者精度问题
引用类型(reference type)
- 类
- 接口
- 数组
拓展
整数拓展
- 二进制:0b,八进制:0,十六进制:0x
浮点数拓展
- eg. 银行业务怎么表示?BigDecimal 数学工具类
最好完全避免用浮点数进行比较
字符类拓展
- 所有的字符本质上是数字,Unicode编码,从U0000到UFFFF
- \u 转义字符表示
布尔值拓展
boolean flag = true; if(falg){}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 变量
每个变量必须声明其类型,Java变量是程序中最基本的存储单元,要素包括变量名,变量类型和作用域。
Java 中主要有如下几种类型的变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
**注意:**
- 每个变量都有类型,可以是基本类型,也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,分号结束
## 变量作用域
```java
public class Variable(
static int allClicks = 0; // 类变量
String str = "hello world"; // 实例变量
public void method(){
int i = 0; // 局部变量
}
)
类变量
关键词:static,从属于类
- 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
实例变量
独立于方法之外的变量,类的里面,从属于对象
实例变量声明在一个类中,但在方法、构造方法和语句块之外;
当一个对象被实例化之后,每个实例变量的值就跟着确定;
实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
实例变量可以声明在使用前或者使用后;
访问修饰符可以修饰实例变量;
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
局部变量
类的方法中的变量,必须声明和初始化值。
- 局部变量声明在方法、构造方法或者语句块中;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
- 访问修饰符不能用于局部变量;
- 局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量是在栈上分配的。
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
Java数组
数组是储存在堆上的对象,可以保存多个同类型变量。
Java枚举
Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug。
常量
初始化后不能再改变值
1 | // final 常量名=值; |
Java运算符
关系运算符
操作符 | 描述 | 例子(A=10,B=20) |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | B / A等于2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21 |
– | 自减: 操作数的值减少1 | B– 或 –B 等于 19 |
- 前缀自增自减法(++a,–a):先进行自增或自减运算,再进行表达式运算。
- 后缀自增自减法(a++,a–):先进性表达式运算,再进行自增或自减运算。
关系运算符
运算符 | 描述 | 例子(A=10,B=20) |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
位运算符
位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
1 | A = 0011 1100 |
操作符 | 描述 | 例子(A=60,B=13) |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
条件运算符(?:)
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
1 | variable x = (expression) ? value if true : value if false |
intanceof运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
1 | ( Object reference variable ) instanceof (class/interface type) |
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。
1 | String name = "James"; |
如果被比较的对象兼容于右侧类型,该运算符仍然返回true。
1 | class Vehicle {} |
Java运算符优先级
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr– | 从左到右 |
一元 | ++expr –expr + - ~ ! | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
包机制
为了更好地组织类,Java提供了包机制,用于区别类的命名空间。
语法格式:
1
2package pkg1[. pkg2[. pkg3...]];
一般利用公司域名倒置作为包名
为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。使用import语句可完成此功能。
1
import package1[.package2...].(classname|*)
*是通配符,会导入这个包下所有的类
JavaDoc
javadoc命令是用来生成自己API文档的,可以将一种自定的注释信息生成帮助文档
参数信息
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
可以加在类或方法上面
可以在命令行输入代码生成doc文件
1
javadoc -encoding UTF-8 -charset UTF-8 Doc.java