Java 语言基础
一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 类:类是一个模板,它描述一类对象的行为和状态。 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
Java 自带的关键字
分类 | 关键字 | ||||||
---|---|---|---|---|---|---|---|
访问控制 | private | protected | public | ||||
类,方法和变量修饰符 | abstract | class | extends | final | implements | interface | native |
new | static | strictfp | synchronized | transient | volatile | enum | |
程序控制 | break | continue | return | do | while | if | else |
for | instanceof | switch | case | default | assert | ||
错误处理 | try | catch | throw | throws | finally | ||
包相关 | import | package | |||||
基本类型 | boolean | byte | char | double | float | int | long |
short | |||||||
变量引用 | super | this | void | ||||
保留字 | goto | const |
注意 ⚠️:虽然 true
, false
, 和 null
看起来像关键字但实际上他们是字面值,同时你也不可以作为标识符来使用。
Java 中的几种基本数据类型
Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型:
- 4 种整数型:
byte
、short
、int
、long
- 2 种浮点型:
float
、double
- 4 种整数型:
- 1 种字符类型:
char
- 1 种布尔型:
boolean
。
这 8 种基本数据类型的默认值以及所占空间的大小如下:
基本类型 | 位数 | 字节 | 默认值 | 取值范围 |
---|---|---|---|---|
byte | 8 | 1 | 0 | -128 ~ 127 |
short | 16 | 2 | 0 | -32768 ~ 32767 |
int | 32 | 4 | 0 | -2147483648 ~ 2147483647 |
long | 64 | 8 | 0L | -9223372036854775808 ~ 9223372036854775807 |
char | 16 | 2 | 'u0000' | 0 ~ 65535 |
float | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 |
double | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 |
boolean | 1 | false | true、false |
对于 boolean
,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。
另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。
注意:
- Java 里使用
long
类型的数据一定要在数值后面加上 L,否则将作为整型解析。 char a = 'h'
char :单引号,String a = "hello"
:双引号。
包装类型
那么基本数据类型已经认识和了解,那我们来看看什么叫包装类型呢?
这八种基本类型都有对应的包装类分别为:Byte
、Short
、Integer
、Long
、Float
、Double
、Character
、Boolean
。
包装类型不赋值就是 Null
,而基本类型有默认值且不是 Null
。基本数据类型有默认值 比如 int 默认值为0,boolean 默认值为false。
Byte
,Short
,Integer
,Long
这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character
创建了数值在 [0,127] 范围的缓存数据,Boolean
直接返回 True
or False
。
两种浮点数类型的包装类 Float
,Double
并没有实现常量池技术。
什么叫自动拆装箱?:
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
示例:
int a = 10;
Integer b = new Integer(10);
System.out.println(a == b);
System.out.println(a == b.intValue());
System.out.println(a.equals(b));
常见面试题
- 什么叫自动拆箱和自动装箱?
- 什么叫包装类?
- 什么叫基本数据类型?
- 什么叫引用类型?
- Integer的 129 直接使用 == 129 返回false?
运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,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 |
++和-- 自增自减运算符 ++ 和 -- 运算符可以放在变量之前,也可以放在变量之后,当运算符放在变量之前时(前缀),先自增/减,再赋值;当运算符放在变量之后时(后缀),先赋值,再自增/减。例如,当
b = ++a
时,先自增(自己增加 1),再赋值(赋值给 b);当b = a++
时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。用一句口诀就是:“符号在前就先加/减,符号在后就后加/减”。
关系运算符
==
检查如果两个操作数的值是否相等,如果相等则条件为真
!=
检查如果两个操作数的值是否相等,如果值不相等则条件为真
>
检查左操作数的值是否大于右操作数的值,如果是那么条件为真
<
检查左操作数的值是否小于右操作数的值,如果是那么条件为真
>=
检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真
<=
检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真
位运运算符
&
如果相对应位都是1,则结果为1,否则为0
|
如果相对应位都是 0,则结果为 0,否则为 1
^
如果相对应位值相同,则结果为0,否则为1
〜
按位取反运算符翻转操作数的每一位,即0变成1,1变成0
<<
按位左移运算符。左操作数按位左移右操作数指定的位数
>>
按位右移运算符。左操作数按位右移右操作数指定的位数
>>>
按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充
逻辑运算符
&&
称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真
||
称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真
!
称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false
三目运算符
condition ? expr1 : expr2
condition
为条件,expr1
为条件为真时返回的值,expr2
为条件为假时返回的值
示例:
int a = 10;
int b = (a > 5) ? 20 : 30;
System.out.println(b); // 输出:20
数组与循环
数组:一种用于存储多个值的数据结构
创建数组并且初始化值:
int[] arr = new int[5]{1,2,3,4,5};
数组arr的元素个数是5,那么数组arr的索引范围是0~4
比如:arr[0] 会是 1,arr[1] 会是 2,arr[2] 会是 3,arr[3] 会是 4,arr[4] 会是 5
那么我们怎么访问数组中的元素呢? 访问数组中的元素:
- 通过索引下标访问
- 通过循环访问
那么什么是循环呢?
循环:重复执行一段代码,直到满足某个条件为止。
循环的种类:
- for循环
- while循环
- do...while循环
循环的语法:
for (初始化语句; 循环条件; 循环后置语句) { }
while (循环条件) { }
do { } while (循环条件);
//例子
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
条件语句
条件语句:判断某个条件是否满足,满足则执行相应的代码。
java 有下面几种类型的条件语句:
- if...else
- switch...case
- 三元运算符
if (条件) {}
else if (条件) {}
else {}
switch (表达式) {
case 值1: {}
break;
}
switch 语句的表达式必须为整型或枚举型,不能为字符串型 (但是在新版的 jdk17 可以使用字符串作为值判断)。