【Java语言基础】
* 标识符
* 关键字
* 字面值
* 变量
* 数据类型
* 二进制
* 字符编码
* 运算符
* 控制语句
* 方法
一、 标识符(黑色/可自定义处)
(一)起名规则:
- 不可用数字开头
- 可: $、_ 、字母、数字
- 区分大小写
(二)规范
- 见名知义为佳
- 不要太长
- 对方法和变量起名, 采用小驼峰命名法, 如: firstName
- 对类和接口起名, 采用大驼峰命名法, 如: GoodStudent
- 常量名全部大写
二、字面值
即数据, 类型有:
boolean: 1字节 false和true
数字: int 4 double 8
字符串: 双引号, “ABC”
字符: char 2, 单引号, ‘A’
三、变量
- 定义
值可变, 本质是内存中一块空间的名字, 是存储数据的基本单元
这块空间是有类型、有名字、有字面值的
(数据类型指导程序在运行阶段该开辟多大的空间)
- 格式:
声明:数据类型 变量名;
注意变量名是小驼峰
int a, b, c;
✔️ 声明完成≠开辟了空间
在同一个作用域中, 变量名不可重名; 声明只有 1 次
初始化:变量名 = 字面值
字面值与数据类型一致; 初始化才可用\空间才已被开辟
声明+初始化:数据类型 名字 = 值;
- 访问一个变量的2种形式
- get 读取
- set 设置/修改
- 变量的作用域: 出了{}就不认识了(方法结束后, 变量的内存就释放了)
-
变量的类型
1)局部变量
在方法体内的变量
2)成员变量
在方法体外、类体之内声明的变量
```java
public class HelloWorld {
public static void main(String[] args) {
int i = 1;
System.out.println(i);//就近访问1处
}
static int i = 2;
//若main方法体内找不到,会找全局有否static变量可访问
public static void doSth() {
int i = 3;
//不可跨方法体访问(1、2处都找不到也不会找到3处
}
}
```
四、数据类型
作用:指导JVM在运行程序时需要给该数据分配多大的内存空间
类型-大类: 基本数据类型与引用数据类型
基本数据类型——四大类、八小种
(一) 整数型
byte short int long 1 2 4 8
(二) 浮点型
float double 4 8
数字类型-练习
- 如何表示一个数字的正负?
- byte的最大值是?
- 00000000 00000000 00000000 10000000是什么类型?
- 00000000 00000000 00000000 10000000 - 1 = ?
- 八进制与十六进制的开头?
- 整数字面值默认类型为?如何转为其他, 比如long?
- 是否有精度比double更高的类型?
- 浮点数字面值默认类型为?如何转为其他?�
key
最高位(最左边) 0正1负
01111111
int 4个字节
00000000 00000000 00000000 01111111
0和0x
-
int; 后加L
long y = 1234567899; //编译报错 long z = 1234567899L; //编译通过
SUN在基础SE类库内提供了更高精度的类型(引用数据类型而非基本数据类型): java.math.BigDecimal
double; 后加F
(三) 布尔型
bool 2
底层 0假1真
有效值 false和true
(四) 字符型
char 2
‘a' 97 01100001
’A' 65 01000001
‘0’ 48 00110000
(五)类型转换规则
- 除bool其他都可相互转换
-
自动类型转换: 小容量转为大容量
byte不可向char转换;
short、char都可向int转换
- char可以get更大的数(因为字符无正负
-
强制类型转换: 大容量转换为小容量
格式: int y = (int) x; //long x = 100L; 赋值左右类型要一致
- 结果: 高位(左边)的二进制会被砍掉(精度损失、谨慎使用)
-
多种类型混合运算实现:
-
各自都转换成大容量的, 再做运算
- int值不超过小弟们的取值范围,也可直接赋给小弟们
-
五、运算符
(一)加减乘除
(二)关系运算符
= != > >= < <=
结果: 布尔型
(三)赋值运算符
=
+= -= %= *=
(四)逻辑运算符
两边都是布尔, 最后结果也是布尔
符号 | 说明 |
---|---|
& | 有false则false |
| | 有true则true |
! | 取反 |
^ | 异或, 两边不一样就是true |
&& | 短路与: 左false则false (不算右可得) |
|| | 短路或: 左true则true (不算右可得) |
根据需求决定要不要用短路逻辑运算符 (第二个算子是否需要执行)
另可划分:布尔运算符与位运算符
类型 | 符号 |
---|---|
布尔运算符 | &&,||, &, | |
位运算符 | & , 按位与; | , 按位或; ^ , 按位异或; ~ , 按位非; >> , 右移; >>> , 右移,左边空出位以0填充; << , 左移 |
Q: 2->8的最快方法?
A: 00000010 将1左移2位
(五)三目运算符/条件运算符
(六)+
-
字符+
ASICII码, char -> int
-
字符串+
拼接: 表达式中只要有一个字符串, 则进行的都是拼接操作
六、输入
三步骤
-
导包
import java.util.Scanner;
-
创建对象
Scanner sc = new Scanner(System.in);
-
接收数据
Int i = sc.nextInt();
七、方法function
(一)格式
[修饰符列表] 返回值类型 方法名(形参列表){ //方法名要有动词属性, 见名知义, 不同功能区别也要大一点
方法体 //main方法里要短,要学会抽离方法
}
1. 修饰符列表
该项为可选项
Q: 方法有static关键字, 如何调用该方法?
A: 类名.方法名(实参列表);
但有时可省略类名: 该方法在当前类中
2. 返回值
- 非void的方法
1). 返回格式必须为return 值;
(值要相对应)
2). 虽然有返回值, 但调用者可选接收否 (使用变量接收)
3). 可直接输出结果, 不用必须变量才可输出
- void方法
return;
3.内存分配
JVM虚拟内存模型
1). 方法只定义, 不调用, 是不会执行的; 并且在JVM中也不会给该方法分配“运行所属”的内存空间
2). JVM内存划分
- 方法区内存——存方法代码片段
(.class字节码文件的一部分)
(1) 字节码文件在类加载的时候, 类加载器将其放入方法区中(方法区内存最先有数据)
(2) 方法代码片段可以被重复调用: 每次调用都需要给该方法分配独立的活动场所(栈)
(3) String.class 、System.class ... 也在此 (rt.jar中)
- 堆内存
- 栈内存
(1) 分配方法运行所属的内存空间——压栈(局部变量的内存在这里)
(2) 释放该方法的内存空间——弹栈
(3) 最先调用main方法, 而它最后结束
(二)方法重载/overload
功能相似时,尽可能让方法名相同 (不同功能名字也要有区别)
重载情况:在同一个类中, 方法名相同, 但参数列表不同: 参数的数量、顺序、数据类型不同 (方法重载仅和方法名+参数列表有关, 而与返回值类型、修饰符列表无关)
仅参数名不同不构成重载
public static void m1(int a , int b);
public static void m1(int b , int a); //方法重复,而非重载
(三)方法的递归调用
无递归出口: java.lang.StackOverflowError (栈内存溢出错误)
耗内存,尽量不用 (递归太深也会导致栈溢出错误)
感觉: “大” -> “小”的套娃, 递归出口时最小情况
-
出口:
if(条件){ return 值; }
以上是全部基础语法的内容, 算是开了门, 接下来要迈门槛啦~