JAVA自学(一)
JAVA 学习路线
- java: 语法、面向对象、IO、集合、异常、多线程
- javaweb: Tomcat、servlet、Struts、Spring
- 持久化相关:MySQL、Spring、Springmvc、MyBatis
- JAVA框架:Springboot、Springcloud、netty、dubbo、RPC
- 消息中间件:kafka、RabbitMQ、RocketMq
- 容器化技术:docker、k8s、jekins部署
基础语法
变量与数据类型
数据类型(8+1)[^ String类型为常用类型非基本类型]
常见的数据类型
| 数据类型 | 类型说明符 | 位数 |
|---|---|---|
| 整形 | int | 32 |
| 短整型 | short | 16 |
| 长整型 | long | 64 |
| 字节型 | byte | 8 |
| 单精度浮点型 | float | 32 |
| 双精度浮点型 | double | 64 |
| 布尔类型 | boolean | 8 |
| 字符类型 | char | 16 |
Conversions between Numeric Types
声明和使用变量值
-
声明变量
DateType variableName; -
定义是初始化变量
DateType variableName = value -
定义后初始化变量
DateType variableName;variableName = value;
变量的命名规则
+++
- 通过变量名可以简单快速的找到在内存中存储的数据
- Java变量命名规则
- 变量名(标识符)只能由字母、数字和下划线和符号$组成
- 第一个字符必须为字母或下划线或$,不能是数字
- 变量名不能包括除_和$符号,以外的任何特殊字符
- 不可以使用53个关键字
- 正确的变量名
- 驼峰命名法
- 帕斯卡命名法
格式化输出
| 占位符 | 说明 |
|---|---|
| %d | 按照10进制格式输出整数 |
| %f | 按照10进制格式输出小数 |
| %e%E | 按照科学计数法输出小数 |
| %o | 按照8进制输出整数 |
| %x%X | 按照16进制输出整数 |
| %s%S | 按照字符串方式输出 |
| %c%C | 按照字符符号输出 |
| %n | 按照特定操作系统输出换行符 |
String str = String.format("%-10d%d", 20, 21);
System.out.println(str);
Char类型的Scanner
Scanner input = new Scanner(System.in);
赋值运算符
算数运算符|Arithmetic Operators
-
一元运算符 -
二元运算符 -
三元运算符
int result = -9527 % 10; //取模运算的最终符号和第一个操作数一致
System.out.println(result);
赋值运算符|Assignment Operators
关系运算符|Comparison Operators
逻辑运算符| Logic Operators
位运算符
运算符优先级 优先级
- 单目运算符包括!~ ++ --,优先级别高
- 优先级别最低的是赋值运算符
- 可以通过()控制表达式的运算顺序,()优先级最高
- 从右向左结合性的只有赋值运算符、三目运算符和单目运算符
- 算术运算符 > 关系运算符 > 逻辑运算符
条件结构
返回值一定为bool类型
- switch后的表达式可以是整形、字符型、String型
- case后的常量表达式的值不能相同
- case后允许多条语句、不需要大括号
- 如果不添加break语句,需要特别注意执行顺序
- case和default子句的先后顺序可以自行变动
- default子句可以省略
Switch和多重if对比
相同点:都是用来处理分支条件的结构
不同点:
- switch🌳等值条件判断 - 条件是有限个的时候
- 多重if😄判断某个连续区间时的情况
循环结构
易错
boolean k = false;
while(k = false)
System.out.println("循环体语句");
int n = 0;
while(n++ <= 2);
System.out.println(n);
double item = 1;
double sum = 0;
while(item != 0){
sum += item;
item -= 0.1;
}
System.out.println(sum);
!!!循环控制中,不要使用浮点型来比较是否相等(可以比较范围)
循环应用
-
break只能跳出循环,if语句不可以
-
嵌套循环打印图形,注意行和列的逻辑推导
//随机数字生成公式
Math.random() [0.0, 1.0]
(int)(Math.random() * 10000) % 10 [0, 9]
(int)(Math.random() * 10000) % 10 + 5 [5, 9]
//推导随机数字生成公式: (b - a + 1) + a
-
Answer = input.next().charAt(0); //char类型输入的方式
程序调试
数组
一维数组
//需要手动分配内存空间
int[] nums;
String[] names = new String[15];
double[] salarys = new double[55];
//错误:声明并出示化数组不需要指定数组大小
int years[6] = {210, 1213, ···}
int[12] months = {1, 2, ···}
//正确: 元素个数为2(days.length == 2)
int days[] = {1, 15};
//语法正确:但不能为数组元素赋值
int array[] = {};
TIPS
- 创建数组之后不能修改数组的大小
- 基本数据类型数组的默认值为0
- char型数组元素的默认值为\u0000
- 布尔类型默认值为False
数组排序
-
冒泡排序
//1.一共回比较数组元素的个数-1轮 //2.每一轮,比较的次数比上一轮少1 //3.如果前面一个数组大于/小于后面一个数字,那么交换 int[] nums = {45, 32, 56, 90, 21}; for(int i = 0; i < nums.length - 1; i++){ for(int j = 0; j < nums.length - i - 1; j++){ if(nums[j] > nums[j + 1]){ int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } -
选择排序
-
二分查找法(先排序)
二维数组
小结
- 数组就是一组连续的内存
- 必须先声明在给空间
- 操作数组通过下标访问
- 一维数组可用于一个循环动态的初始化
- 二维数组可用于嵌套循环动态初始化
- 二维数组可以看作是由一维数组的嵌套而构成
JAVAOO
- 自带方法
- 自定义方法
- 不带参数
- 带参数
- 方法的重载
- 局部变量一定要赋值
对象
-
类是对象的模板
-
- 发现类
- 找出属性
- 找出行为(方法)
a class is a template for objects, and an object is an instance of a class
总结:
类是一个抽象的概念,仅仅是模板;
对象是一个你能够看得到,摸得着的具体实体;
构造方法/构造器
1. 没有返回值
2. 名称和类名一致
3. 可以指定参数及实现重载
4. 注意隐士构造和参数化构造不能共存
封装
public //公有的
private //私有的
(default) //默认,同一个包
protected //受保护的,同一个包或有父子关系
private
- 属性变为私有
- 隐藏对象的属性和实现细节,进对外公开接口,控制在程序中属性的读取和修改的访问级别
- this表示指向当前对象
包(package)
- **打包 **package
- 导包 import
包的作用
- 包允许将类组合成较小的单元(类似文件夹),使易于找到和使用相应的类文件
- 有助于避免命名冲突
- 包允许在更广的范围内保护类、数据和方法,可以在包内定义类,而在包外的代码不能访问该类
对象数组
JAVA中的数据类型
- 基本类型/原始类型
- 用于保存简单的单个数据
- 类类型/引用类型
- 用于保存复杂的组合数据
成员变量的作用域在整个 类(数字初始值为0,对象为null)
局部变量作用域仅限于定义它的 方法(必须赋予初始值)
MVC结构开发
重新认识字符串[1]
string 对象是不可变的,字符串一旦创建,内容不能再变
public static void main(String[] args){
String song = "yesterday";
song = "better man";
}
ideal:song变量先后指向了两个String对象空间
字符串池
JAVA 中为了效率考虑
以“ ”包括的字符串,只要内容相同无论在程序代码中出现几次
JVM都只会创建一个实例,并放在字符串池(String pool)中维护public static void main(String[] args){ String name1 = "xuetang"; String name2 = "xuetang"; System.out.println(name1 == name2); }
字符串创建示例
String name1 = "xuetang";
String name2 = "xuetang";
String name3 = new String("xuetang");
String name4 = new String("xuetang"); //new动态赋于空间
System.out.println(name1 == name2); //true
System.out.println(name1 == name3); //false
System.out.println(name1 == name4); //false
concat(String str)和字符串 “+” 号拼接谨慎使用,效率太低
String < StringBuffer(推荐) < StringBuilder(异步访问不安全)
String.substring(a, b) //java中逻辑思想为左闭右开
StringBuffer str1 = new StringBuffer("123");
StringBuffer str2 = new StringBuffer("123");
System.out.println(str1.equals(str2)); //false
System.out.println(str1.toString().equals(str2.toString()));//true
多态和继承
注意
- 使用super关键字调用父类构造方法
- 子类构造中,默认就会调用父类默认构造
- 构造方法不可继承
- Java中只能继承一个父类
- 父类私有属性在子类中不能直接访问
- 继承关系是一种“is-a关系”:父类和子类之间必须存在“is-a”关系
- (子类对象实现父类、实例化子类对象)
- 子类不是父类的子集,而是加强
Warrior yoyo = new Warrior(); //Yes
Hero yoyo = new Worrior(); //Yes
Warrior yoyo = new Hero(); //No
方法重写
注意
-
方法重写发生在通过继承而相关的不同类中
-
方法重写具有同样的方法签名(方法名+形参列表)和返回值类型
-
@override称为重写标注,用来保证重写的方法和原方法的签名和返回值一致
万物皆对象[2]
@Override
重写Object (在多态中非常重要)
//重写tostring方法,封装打印角色信息的逻辑
@Override
public String toString(){
StringBuffer str = new StringBuffer();
str.append(getAge());
···
···
return str.toString();
}
实例:对象数组的排序
静态实例化属性
public static int ID
多态(Java Polymorphism)
同一个实体同时具有多种形式
- 父类中abstract的使用
- Abstract class: is a restricted class that cannot be used to create objects (to access it, it must be inherited from another class).
升级:使用反射+多态技术实现无缝升级?- 通过配置文件 .properties
静态的作用
- 静态方法中只能调用静态属性和静态方法
- 单例模式 -- 无论什么时间点得到的对象都是同一个对象(游戏窗口)
将构造方法私有 ,以便外部无法使用new进行实例化
public class StaticDemo{
private static StaticDemo me = null;
//将构造方法私有,以便实现外部无法使用new进行实例化的效果
private StaticDemo(){
//将构造方法定义为私有
me = this;
}
//要获得当前类对象的实例,只能调用本方法
public static StaticDemo getInstance(){
if(me == null){
me = new StaticDemo();//唯一的一次实例化
}
return me;
}
}
//main
public class StaticDemoTest{
public static void main(String[] args){
StaticDemo staticDemo = StaticDemo.getInstance();
}
}
public class staticDemo{
//类属性
public static int static_number = 1; //类属性,先于类的实例存在的
public int normal_num =1;
public void test(){
static_number++;
normal_number++;
}
public static void main(String[] args){
StaticDemo StaticDemo1 = new StaticDemo();
staticdemo1.test();
//类属性可直接由类调用 ie: StaticDemo.static_number
System.out.println(StaticDemo1.static_number); //2
System.out.println(StaticDemo1.normal_number); //2
StaticDemo StaticDemo2 = new StaticDemo();
staticdemo2.test();
System.out.println(StaticDemo2.static_number); //3
System.out.println(StaticDemo2.normal_number); //2
}
}
抽象类和接口
- 一将功成万骨枯
抽象类
-
包含一个抽象方法的类必须是抽象类
-
抽象类和抽象方法都是abstract关键字声明
-
抽象方法只需要声明而不需要实现
-
抽象类必须被子类继承
- 子类不是抽象类时必须重写父类的所有抽象方法
- 子类是抽象类时仍然可以继续声明成抽象方法
-
抽象方法必须是非静态的 *
设计模式
单例模式 :游戏的主窗口
异常(记录在log中)
-
了解异常和异常处理
-
了解异常的层次结构
-
使用try-catch-finally处理异常
-
使用throw、throws关键字抛出异常
-
自定义异常
输入输出流
JAVA的I/O系统
- 认识流的输入/输出
- 认识 InputStream,OutputStream继承架构
- 认识Reader、Writer集成架构
- 使用输入/输出装饰器类
- IO流的典型使用方式
java.io.File
内部类[^ 补充]
过期[^补充]
若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用。
@Deprecated
public static void test(){
}
接口
- 接口是一种与类相似的结构,只包含常量和抽象方法
- 目的是指明相关和不想关类的多个对象的共同行为(功能)
结构案例
可以指明对象是可比较的,可食用的,可被攻击的,可飞翔的甚至是可克隆的
异常处理
try-catch-finally块
- 确保无论是否发生异常,finally块中的代码总能被执行
- 遇到System.exit(0)语句时是不执行finall块的唯一情况(即使在有return的时候)
- 使用finall块的场合:如果程序开启了相关资源(文件、数据库等),为了避免因出现错误没有关闭,就可以使用finall块再执行完毕后,强制要求关闭所有打开的资源
- 使用finally时,可以省略catch块(不退荐)
try{
//所监控的有可能产生异常的语句块
}catch(Exception e){//捕获异常,e就是所捕获异常对象
//异常处理:打印异常信息,日志记录
}finally{
//不管有无异常,一定会执行的语句块(一般用来释放资源)
}
异常处理机制的主要组成部分补充
- throw:手动引发异常
- throws:指定由方法引发的异常
异常的层次机构
- 非必检异常
注意 :RuntimeException和Error以及他们的子类都称为免检异常,所有其他异常都成为必检异常(java语言不强制要求编写代码捕获异常)
- 必检异常
查找异常类型 ( ctrl + 左键 )
捕获异常一定要类型匹配,否则程序会直接终端执行
- 异常类型匹配
- 异常类型不匹配
//JDK7后捕获多种异常的简化写法(multi-catch feature)
catch(Exception1 | Exception2 | ... e){
}

浙公网安备 33010602011771号