Java基础[学习笔记]
Java基础
0. Hello World
//HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
};
1. classpath
2. 注释
- 单行 //
- 多行
- javadoc注释
3. public class 和 class区别
4. 标识符
- 字母、数字、下划线、$
- 数字不能开头
- 命名规范
- 类名、接口名:首字母大写,后面每个单词首字母大写
- 方法名、变量名:首字母小写,后面每个单词首字母大写
- 常量名:全部大写
- 驼峰规则:SystemService UserService CustomerService
5. 关键字
class extends implements interface import
package break case continue default
do if else for return
switch while false true null
boolean byte char short int
long float double try catch
throw throws finally abstract fianl
native private protected public static
synchronized transient volatile instanceof new
super void assert enum goto
const
6. 字面值
字面值就是数据
- 10、100 //整数型字面值
- 3.14 //浮点型字面值
- "abc" //字符串型字面值
- 'a'、'人' //字符型字面值,单引号中只能放单个字符,属于字符型字面值
- true、false //布尔型字面值
ASCII: A-66; a-97; 0-48
7. 变量
本质上是内存中的一块空间,这块空间有自己的“数据类型”、“名字”、“字面值【数据】”
-
数据类型
-
作用
- 不同数据有不同的类型,不同的数据类型底层会分配不同大小的空间
- 数据类型是指导程序在运行阶段应该分配多大的内存空间
-
要求
- 具体存储的“字面值【数据】”必须和变量设置的“数据类型”一致,不一致时编译报错
-
声明
数据类型 变量名; -
赋值
变量名 = 字面值; //= 是赋值运算符:先运算等号右边的表达式,表达式的结果复制给左侧的变量 //声明和赋值可以同时执行,即声明和变量初始化同时进行 数据类型 变量名 = 字面值; //一行可以声明多个同类型变量 数据类型 变量名1,变量名2,变量名3 eg. int a,b,c = 300; //a,b未初始化,c初始化为300 -
作用域
-
作用域:变量的有效范围
-
作用范围
出了大括号就不认识;
for循环,变量的作用域只在for循环中(依然满足出了大括号就不认识) -
变量根据出现的位置进行划分:
在方法体当中声明的变量:局部变量
在方法体之外,类体内声明的变量:成员变量 //类体中不能直接编写java语句,除了变量声明
重点依据是:声明的位置
在不同作用域中,变量名可以相同
变量遵循就近原则class b { //成员变量 static int a = 100; public static void main(String[] args) { //局部变量 int a = 1000; //就近原则 System.out.println(a); } }
-
-
8. 数据类型
作用
每一个数据都是有相关类型的,不同类型的数据占用空间大小不同。
数据类型的作用是知道JVM在运行程序的时候给该数据分配多大的空间
数据类型
- 基本数据类型
- 引用数据类型
字符串"abc"不属于基本数据类型,而是属于引用数据类型
字符型使用单引号
字符串型使用双引号
关于基本数据类型
- 四大类八小种
- 整数型
byte,short,int,long - 浮点型
float,double - 布尔型
boolean - 字符型
char
- 整数型
- 占用空间
基本数据类型 占用空间(bytes) byte 1 short 2 int 4 long 8 float 4 double 8 boolean 1 char 2 - 取值范围
基本数据类型 取值范围 byte -27 ~ 27-1 (-128~127) short -215 ~ 215-1(-32768~32767) int -231 ~ 231-1(-2147483648~2147483647 ±21亿) long -263 ~ 263-1 float ±3.40282347e+38(有效位数6~7位) double ±1.79769313486231570e+308(有效位数15位) boolean true/false char 02<sup>16</sup>-1(065535) - 默认值
成员变量声明时未赋值,那么会自动赋默认值;(局部变量不会)
八种基本数据类型的默认值是一切向0看齐基本数据类型 默认值 byte,short,int.long 0 float,double 0.0 boolean false(0) char \u000 注: \u000 \u开头后面跟的一串, 为该字符的unicode编码
原码、反码、补码
精度损失
整型
默认被当作int
l/L指定该字面值为long类型
0 开始=>八进制
0x 开始=>十六进制
浮点型数据
默认被当作double
f/F指定该字面值为float类型
- float 4字节 单精度
- double 8字节 双精度(精度较高,但对于财务软件而言还是不够高,SUN提供了java.math.BigDecimal)
SE类库 %JAVA_HOME%\jre\lib\rt.jar
SE类库源码 %JAVA_HOME%\src.zip - 指定float类型字面值
- float a = (float)5.5
- float b = 5.5f
布尔类型
boolean,取值只能为true、false(在底层存储的是时候,true=>1 false=>0)
转换规则:
- 八种基本数据类型当中,除布尔类型之外,剩余的七种类型之间可以相互转换
- 小容量向大容量转换,称为自动类型转换,容量从小到大排序为:
byte < short < int < long < float < double char <注:
(1)任何浮点类型不管占用多少个字节,都比整型容量大;
(2)char和short可表示的种类数量相同,但是char可以取更大的正整数
- 大容量转换成小容量,称为强制类型转换,需要加强制类型转换符,程序才能编译通过。但是,在运行阶段可能会损失精度,所以要谨慎使用。
- 当整数字面值没有超出byte,short,char的取值范围,可以直接赋值为byte,short,char类型的变量(由java程序在编译时自己转换,不影响精度)
- byte,short,char混合运算的时候,各自先转换成int类型,再做运算。
- 多种数据类型混合运算,先转换成容量最大的那种类型,再做运算。
不要在编译阶段掺杂运行过程
9. 运算符
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
字符串连接运算符
条件运算符
其他运算符
算数运算符
+
-
*
/ 商
% 余数
++ 自加1
-- 自减2
- a++ 和 ++a 的区别
++出现在变量前: 变量先自加1, 然后执行其他语句
int a =100;
System.out.println(++ i); //101
System.out.println(i); //101
++出现在变量后: 先运行其他语句,然后变量自加1
int a =100;
System.out.println(i ++); //100
System.out.println(i); //101
关系运算符
- 运算结果一定是true或者false
- 进行关系运算时(如a == b),比较是的a和b中保存的值之间是否相等
逻辑运算符
& 逻辑与
| 逻辑或
! 逻辑非
^ 逻辑异或 (两边算子不一样,结果为true;两边算子)
&& 短路与 结果和“逻辑与”相同
|| 短路或 结果与“逻辑或”相同
- 逻辑运算符要求算子都是布尔类型,并且逻辑运算符运算结果也是布尔类型
- 短路现象
赋值运算符
基本赋值运算符 =
扩展赋值运算符 +=、-=、*=、/=、%=
扩展类的赋值运算符不改变运算结果类型。
byte b = 1
b += 4 => b = (byte)(b + 4)
字符串连接运算符
"+"
1) 加法运算,求和
2) 字符串的连接运算
注1: 加号两边的操作数有一个是字符串时,就会执行连接运算
 :注2: 运行从左至右运行,括号优先 System.out.println(10 + 10 + "10") => "2010"
int a = 10;
int b = 20;
System.out.println("10 + 20 = 30");
System.out.println(a + " + " + b + " = " + (a + b));
条件运算符/三元运算符
布尔表达式 ? 表达式1 : 表达式2
注: 布尔表达式true时, 选择表达式1作为整个表达式结果, false时选择表达式2
boolean sex = false;
sex ? '男' : '女' //编译报错
//正确表达
char c = sex ? '男' : '女'
System.out.println(c);
//编译报错, 编译器后面的三元运算符可为字符也可以为字符串, 不能直接赋值给char类型的变量c
char c = sex ? '男' : '女'
System.out.println(c)
//编译、执行正常: println可打印字符也可打印字符串
System.out.println(sex ? "男" : '女');
//处理"错误: 编码GBK的不可映射字符"
//javac -encoding UTF-8 xxx.java
10. 控制语句
java中控制语句分以下7种:
- 控制选择结构语句
- if, if..else
- switch
- 控制循环结构语句
- for
- while
- do while
- 改变控制语句顺序
- break
- continue
if语句
语法结构:
- if(布尔表达式)
- if(布尔表达式){java语句...}else
- if(布尔表达式){java语句...}else if(布尔表达式){java语句...}...
- if(布尔表达式){java语句...}else if(布尔表达式){java语句...}...else{java语句};
注: if(布尔表达式) 一条java语句; 也是if语句的正确格式.
接受用户键盘输入
public class KeyInputTest{
public static void main(String[] args){
//创建键盘扫描器对象
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入: ");
//调用Scanner对象的next()方法开始接受用户键盘输入(当输入回车键时, 键入的信息会自动赋值给userInputContent)
String userInputContent = s.next();
//接收数字[以整数型int的形式来接收]
int num = s.nextInt("请输入: ");
System.out.println(userInputContent);
System.out.println(num);
}
}
switch语句
语法结构:
switch(int或string类型的字面值或变量){
case int或string类型的字面值或变量 :
java语句;
...
case int或string类型的字面值或变量 :
java语句;
...
...
default{
}
}
//switch穿透(break可避免switch穿透):
// 匹配成功的分支, 即可执行该分支下的java语句;但如果该分支中没有break语句,那么执行完该分支的java语句后,无论下一分支是否匹配,都会立刻执行下一分支的java语句。
byte,short,char也可以直接作为switch的判断,因为它们可以自动转换到int类型
for循环
语法结构:
for( 初始化表达式; 布尔表达式 ; 更新表达式 ){
循环体
}
// 1. 初始表达式,布尔表达式,更新表达式都不是必须的;但两个分号不能省略
// 2. 布尔表达式必须是true或这false
// 3. 初始化表达式最开始执行,并只执行一次
while循环和do..while循环
while (布尔表达式) {
循环体;
}
do {
循环体
} while (布尔表达式); //注意这个分号不要落下
11. 方法
[修饰符列表] 返回值类型 方法名(形式参数列表) {
方法体;
}
/*
1. 修饰符列表:
* 可选项, 不是必须的(目前统一下称public static)
* 当方法的修饰符列表中有static时, 调用: *类名.方法名(实际参数列表); *
2. 返回值类型:
* 支持所有数据类型;
* 当不返回任何数据时,返回值类型必须为void; 当返回值类型不是void时,表示该方法执行结束以后必须返回一个具体的数值,且数值类型应该与返回值类型相同,不然会编译报错;
* 当返回值类型是void时,不能返回任何值; 但是可以写" return; "
* return关键字标志着方法结束
3. 方法名
* 合法的标识符
* 动+名词结构
* 字符串首字母小写,后面每个单词首字母大写
4. 形参
* 是局部变量
* 个数可以为[0, n], 形参之间用逗号隔开
*/
方法执行时的内存划分
- 1.方法只定义而没有调用时,不分配内存空间;
- 2.JVM内存有三块主要的内存空间:
- 方法区内存
- 堆内存
- 栈内存
- 3.关于栈数据结构
- 栈: stack, 是一种数据结构 //常见的数据结构: 数组, 队列, 栈, 链表, 二叉树, 哈希表/散列表......
- 数据结构反应的是数据的一种存储形态
- 数据结构作为单独的学科,不属于任何编程语言的范畴, 只不过在大多数编程语言当中要使用数据结构
- 程序员需要精通: 数据结构 + 算法
- 4.方法代码片段
- 方法代码片段 属于.class字节码文件的一部分, 字节码文件在类加载的时候, 将其放到 方法区内存 中, 所以方法区内存最先有数据
- 代码片段在内存中虽然只存有一份,但是可以重复调用; 每一次调用方法的时候,需要给它分配独立的活动场所,这个活动场所在 栈内存 中分配
- 方法在调用时, 需要在栈中给它分配对立的内存空间, 此时发生压栈/入栈动作; 方法执行结束之后, 给该方法分配的内存空间需要全部释放, 此时发生弹栈/出栈动作
- 局部变量运行阶段的内存在栈中分配: 局部变量在"方法体"(即大括号"{}"之间)定义

方法的重载机制
功能相似但不相同时
- 1.什么时候考虑方法重载
- 功能相似时, 尽可能让方法名相同
- 功能不相似/不同时, 尽可能不同
- 2.满足什么条件构成方法重载
- 在同一个类中
- 方法名相同
- 参数列表不同
- 数量不同
- 顺序不同
- 类型不同
方法的递归调用
- 1.方法自身调用自身
- 2.递归很耗费栈内存,能不使用尽量不使用
- 3.当提示java.lang.StackOverflowError, 表示发生栈内存溢出错误; 此错误无法挽回,只有一个结果:JVM停止工作
- 4.递归的函数必须要有结束条件,不然必会发生内存溢出
- 5.递归的函数即使有的结束条件,也可能因为递归的太"深"了,而发生内存溢出
- 6.必须使用递归方式的: 目录拷贝
12.面向对象[JAVA核心机制]
面向过程和面向对象的区别
-
1.面向过程关注点: 实现的具体过程,因果关系
- 优点: 业务简单的程序可以快速开发, 前期投入少
- 缺点: 很难解决非常复杂的业务逻辑; 耦合度非常高,只要一环出现问题,整个系统就会受到影响,导致软件扩展力差; 没有独立体的概念,无法达到组件复用
-
2.面向对象关注点: 对象(独立体)能完成哪些功能
- 优点: 耦合度低, 扩展性高; 解决复杂业务逻辑; 容易达到组件服用
- 缺点: 前期投入高, 需要进行独立提的抽取, 大量的系统分析与设计
面向对象的三大特征: 封装,继承,多态
- 1.封装
- 2.继承
- 3.多态
面向对象编程的生命周期:
面向对象的分析: OOA
面向对象的设计: OOD
面向对象的编程: OOP
类和对象

浙公网安备 33010602011771号