Loading

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);

!!!循环控制中,不要使用浮点型来比较是否相等(可以比较范围)

java运算顺序深入解析

循环应用

  • 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

程序调试

数组


一维数组

//需要手动分配内存空间
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;
    			}
    		}
    }
    
  • 选择排序

  • 二分查找法(先排序)

二维数组


小结

  1. 数组就是一组连续的内存
  2. 必须先声明在给空间
  3. 操作数组通过下标访问
  4. 一维数组可用于一个循环动态的初始化
  5. 二维数组可用于嵌套循环动态初始化
  6. 二维数组可以看作是由一维数组的嵌套而构成

JAVAOO


  • 自带方法
  • 自定义方法
    • 不带参数
    • 带参数

Java中可变长参数的使用及注意事项

  • 方法的重载
  • 局部变量一定要赋值

对象

  • 类是对象的模板

    1. 发现类
    2. 找出属性
    3. 找出行为(方法)

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

String在JAVA中的预定义

JAVA变量生命周期

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){
    
}


  1. 一切编译器最终都是对字符串的解析 ↩︎

  2. object ↩︎

posted @ 2021-08-15 15:54  向上的废柴  阅读(63)  评论(0)    收藏  举报