Java学习

Chap01 Java概述

Java背景知识

Java的两个LTS版本:Java8和Java11 (截至2021年)
Java SE Standard Edition 标准版 Java EE Enterprise Edition 企业版 Java ME Micro Edition 小型版 对移动版的支持

  1. Java的重要特点:

    1. Java是面向对象的
    2. Java语言是健壮的,Java有强类型机制、异常处理、垃圾自动收集
    3. Java是跨平台性质.java 文件得到 .class 文件 ,文件的运行不受到平台的限制(编译好的.class文件可以在多个系统下运行,只要有对应系统的JVM即可)
    4. Java语言是解释性的,需要解释器执行编译后的文件。不是编译型的(C/C++是编译器,编译后文件可以直接运行;解释性语言:javascript)
      • 解释性语言和编译性语言的区别就是需不需要解释器来执行或是可以直接被机器执行
      • .java程序编译成为.class文件
  2. Java的跨平台性使用JVM实现,使用JVM执行.class文件 jvm包括在jdk上

    • JVM是一个虚拟计算机,具有指令集并使用不同的存储区域,负责执行指令、管理数据、内存、存储器,包含在JDK中
    • 不同平台有不同的虚拟机
    • Java虚拟机机制屏蔽了底层运行平台的差别,实现"一次编译,到处运行"
  3. JDK和JRE

    • JDK是Java Development Kit Java开发工具包
      • JDK=JRE+java的开发工具(包含javac,java编译工具等)
    • JDK是提供给java开发人员使用的,包含java的开发工具,包括JRE
    • JRE是Java Runtime Environment Java运行环境
      • JRE=JVM+Java SE标准类库
    • 如果要运行Java开发好的程序,只需要JRE即可
  4. Java编写步骤

    • 编写源代码
    • javac编译,得到.class字节码文件
    • java运行,将 .class 文件加载到jvm运行
  5. Java API文档 Java提供的基本编程接口,Java语言提供了大量基础类

Java快速入门记录

  • javac命令编译.java文件(源文件).class文件(字节码文件),注意,如果文件中包含中文等特殊字符,需要注意javac的编译是否成功(文件的编码应该与命令行文字编码一致)
    开发注意事项:
  1. Jaca源文件以.java为扩展名,源文件的基本组成部分是类(.class)
  2. Java应用程序的执行入口是main()方法,有固定的书写格式
    1
    public static void main(String[] args){...}
  3. Java严格区分大小写,语句以分号结束
  4. 一个源文件最多只有一个public类,其它类个数不限
  5. 如果源文件包含一个public类,那么文件名必须按照类名命名
  6. 一个源文件中最多只能有一个public类,其它类个数不限,可以将main方法写在非public类中,然后指定该运行非public类,这样入口方法就是非public的main方法
    • 每个类编译后都生成对应的.class
    • 可以在非public类里写public的main方法(或其它public方法),之后指定运行非public类,那么入口方法就是非public的main方法
1
2
3
4
学习一门新技术?
需求->是否能用传统技术解决->引出需要学习的新技术和知识点
->学习新技术或者知识点的基本原理或者基本语法 不考虑细节
->快速入门(基本程序)->开始研究技术注意事项、使用细节、使用规范以及如何优化(优化是没有止境的)

Java转义字符

1
2
3
4
5
6
7
\t 制表符
\n 换行符
\\ 一个反斜杠 \
\" 一个双引号
\' 一个单引号
\r 一个回车(光标会直接定位在当前行第一个字符,并且将换行符后的内容替代原本的内容)
"abcd\refg" 则会输出 "efgd"

Java 注释

  1. 多行注释中不能再加多行注释
  2. 文档注释:注释内容可以被JDK提供的工具(一般写类和方法的注释)javadoc解析,生成一套网页,注意文档注释和多行注释不同,多行注释开头是/**
    1
    2
    3
    4
    /**
    * @author Maple
    * @version 0.1
    */
    生成文档注释:-xx -yy中用来指定要生成文件的标签
    1
    javadoc -d 目的文件夹名 -xx -yy 要生成的文件
    javadoc标签具体可查

Chap02 变量

  • 变量的三个基本要素:类型 名称 值;变量在同一个作用域内不可重名
  • 变量声明 -> 变量赋值 变量必须先声明、再使用
  • 不同变量 类型不同,占用空间大小不同

数据类型

  1. + 与类型转换
    • 如果+ 左右两边有一方为字符串,则进行字符串拼接
    • 如果+ 左右两边都是数值类型则做加法运算
  2. Java中的数据类型
    • 基本数据类型
      • 数值型
        • 整数类型: byte[1] short[2] int[4] long[8]
        • 浮点数类型 float[4] double[8]
      • 字符类型 char[2]
      • 布尔类型 boolean [1] true false
    • 引用数据类型
      • 类 class
      • 接口 interface
      • 数组 []

整数类型

类型 占用存储空间 范围
byte 1字节 -128~127
short 2字节 -(215)~(215)-1 (-32768~32767)
int 4字节 -231~(231)-1 (-2147483648~21473647)
long 8字节 -2^63 ~ (2^63)-1
  1. java的各个整数类型有固定的范围和字段长度,不受具体OS的影响,保证了java程序的可移植性
  2. java的整型常量默认为int类型,声明long型常量,须在值后加L或者l
    • L或者l的意义:参考 参考
      • Java中整型直接量在没有加后缀的时候默认为int,如果被赋值的变量类型是 short int byte中的其中一种时,则会自动转换成对应类型
      • 那么必须加l或者L的情况就是
        1. 使用long和new Long() 定义的时候,数字超过int类型可表示范围
        2. 使用Long定义的时候
  3. 程序中一般使用int

浮点数类型

浮点数=符号位+指数位+尾数位;尾数部分可能丢失,造成精度损失

类型 占用存储空间 范围
单精度float 4字节 -3.403E38~3.403E38
双精度double 8字节 -1.798E308~1.798E308
  1. Java浮点型常量默认为double类型,声明float类型常量,后须加上f或者F
  2. 浮点数类型的两种表示形式:
    • 十进制数形式:0.123 .123 0.123f
    • 科学计数法:5.12e2 5.12E-2
  3. 通常情况下使用double类型(更加准确)
  4. 浮点数使用陷阱:对运算结果是小数的值进行相等判断的时候,要以两个数差值的绝对值进行判断【一定是经过运算的】
    1
    2
    3
    4
    5
    6
    double num1 = 2.7;
    double num2 = 8.1/3;
    if(Math.abs(num1-num2)<0.00001){ //而不用num1==num2

    }

字符类型

单个字符,两个字节,多个字符使用字符串 String

  1. 字符常量只能使用单引号 char c1 = 'a'
  2. java中的char本质是一个整数,输出的时候是unicode码对应的字符(unicode码前128都是ascii码)
  3. char和int 的类型转换(int)c1,直接输出unicode码
  4. char字符的运算:char和整数:char对应的整数和整数相加之后再根据编码表转换
  5. 字符类型的本质
    • 字符的存储是直接存储码值
    • 字符和码值的对应关系是通过字符编码表规定
      • ascii码最多可以表示256个字符,只使用了128个
      • unicode码的大小固定,两个字节表示一个字符,字母和汉字均使用两个字节,但是会浪费时间【unicode码兼容ascii码】
      • utf-8 大小可变的编码,字母一个字节,汉字三个字节(对unicode的改进)
      • gbk 可以表示汉字,字母一个字节,汉字两个字节(gbk表示的汉字比utf-8表示的少)
      • gb2312 gb2312<gbk
      • big 5码 繁体中文

布尔类型

  1. boolean类型只允许取值true和false,无null;占一个字节
  2. 不可以使用0非0的整数替代false和true(无法从int转为boolean类型)

数据类型转换

自动类型转换

数据类型自动转换的规则,低精度可以自动向高精度自动转换,反之则会报错

1
2
char -> int -> long -> float -> double 
byte -> short -> int -> long -> float -> double
  1. 有多种类型的数据混合运算的时候,系统会首先自动将所有数据转换成容量最大的数据类型,然后再进行计算
    1
    2
    3
    4
    5
    int n1 = 10;
    float d1 = n1 + 1.1; //错误,结果类型是double,不能赋值给float
    //修正
    double d1 = n1 + 1.1;
    float d1 = n1 + 1.1f;
  2. (byte short)和char之间不会相互自动转换,即整数类型和字符类型不会自动转换
  3. byte short char 三者只要参与计算,运算后就会被自动提升转换为int类型
  4. boolean类型不会参与类型自动转换
  5. 再次强调:多种类型的数据参与计算会自动提升成容量最大的数据类型

强制类型转换:使用强制转换符小括号 (类型),需要注意数据溢出或者精度损失

  1. 强制转换将数据从大->小转换
  2. 强制转换符号只对最近的操作数有效
    1
    2
    int x = (int)10*3.5+6*1.5;//错误,最终结果是double不是int
    int x = (int)(10*3.5+6*1.5);//正确
  3. char类型可以保存int的常量值(字面常量),不能保存int类型的变量,需要强制转换
    1
    2
    3
    4
    char c1 = 100; //ok
    int m = 100;
    char c2 = m;//报错
    char c3 = (char) m;//正确

基本数据类型和String的类型转换

  • 基本数据类型转换成String:将基本数据类型之后+""即可
  • String类型转换为基本数据类型:调用基本数据类型包装类的parseXX方法即可
    1
    2
    String s5 = "123";
    int num1 = Integer.parseInt(s5);
    • 字符串转换成字符:取字符串的第x个字符,String的charAt()方法
      注意事项:
  1. String类型转换成基本数据类型,要注意能够转换成有效的数据,格式不正确则会抛出异常 Exception,程序退出

Chap03 运算符

算数运算符

+ - * / % ++ --

  1. 自增:前自增:++i先自增后赋值;后自增:i++先赋值后自增
    1
    2
    3
    4
    5
    6
    7
    int i=1;
    i=i++;
    System.out.println(i);//结果1
    //运行机制:先用一个temp存储i,再做自增运算
    //temp=1;
    //i=i+1;
    //i=temp;
    1
    2
    3
    4
    5
    6
    7
    int i=1;
    i=++1;
    System.out.println(i);//结果2
    //运行机制:
    //i=i+1;
    //temp = i;
    //i=temp;
  2. 除法:整数相除,不会自动变成double类型

关系运算符

== != < > <= >= instanceof

  • instanceof检查是否是类的对象

逻辑运算符

  • 短路与 短路或 取反&& || !
  • 逻辑与 逻辑或 逻辑异或 & | ^
  1. 短路与和逻辑与的区别
    • 对于短路与,如果第一个条件为假,则第二个条件不会被判断,因此可以提高效率;而对于逻辑与,即使第一个条件为false,后面的条件还是会判断
    • 开发中一般使用短路与
  2. 短路或和逻辑或的区别
    • 短路或第一个条件是true,则第二个条件不会被判断;逻辑或还是会判断第二个条件
    • 开发中一般使用逻辑或

赋值运算符

  • 基本赋值运算符 =
  • 复合赋值运算符 += -= *= /= %=
    • 复合赋值运算符会进行类型的转换
      1
      2
      3
      byte b = 3;
      b+=2;//正确 b=(byte)(b+2);
      b=b+2;//错误,int->byte
  • 三元运算符 A?B:C

运算符优先级

  1. () {} 等
  2. 单目运算符
  3. 算数运算符
  4. 位移运算符
  5. 比较运算符
  6. 逻辑运算符
  7. 三元运算符
  8. 赋值运算符

标识符命名规范(自己搜)

  • 规范
    1. 包名多尔单词组成用小写
    2. 类名单词全部大写(大驼峰)
    3. 变量名、方法名使用驼峰命名法
    4. 常量所有字母都大写,每个单词使用下划线连接

其它:键盘输入语句

获取用户输入:使用input.javaScanner

1
2
3
4
5
6
7
8
9
10
11
12
//1. 引入包
import java.util.Scanner;
pubic class Input{
public static void mian(String[] args){
//2. 创建Scanner对象
Scanner myScanner = new Scanner(System.in);
//3. 接受用户的输入;使用方法
String name = myScanner.next();//等待用户输入字符串
int name = myScanner.nextInt();
double salary = myScanner.nextDouble();
}
}

进制

  • 二进制以0b 0B开头;十六进制以0x 0X开头

  • 二进制转八进制:低位开始,3个数一组,转换成十进制;

  • 二进制转十六进制:四位一组

  • 位运算:

    1. 位移运算<<向左位移 >>向右位移 无符号右移 >>>
      • x>>yx算数右移y位:低位溢出,符号位不变,符号位补溢出的高位;算数右移实际上是除2
      • x<<yx算数左移y位:符号位不变,低位补0;算数左移实际上是乘2
      • 无符号右移:低位溢出,高位补0
    2. 按位取反,按位与 按位或 按位取反 按位异或~ & | ~ ^
      • 注意 按位运算的操作是基于补码的;
        • ~2就是先求2的补码,然后按位取反;然后再将取反的结果转为原码,结果是原码 -3
  • 原码、反码、补码

    1. 二进制(有符号的)最高位是符号位,0表示正数 1表示负数
    2. 正数的原码、反码、补码都一样
    3. 负数的反码:符号位不变,其他位取反;负数的补码:反码+1;负数的反码=负数补码-1;原码=补码-1 再按位取反(符号位不变)
    4. 0的反码、补码都是0
    5. java中没有无符号的数,java中所有的数都是有符号的
    6. 计算机运算的时候都是以补码方式运算的;看结果的时候则要看原码而不是补码
    7. 反码的意义:规避减法运算,将减法转为加法;补码:规避正负0的问题,补码的0000 0000 表示0,而补码的1000 0000则表示-128;即[x]补+[(-x)]补=0(溢出到符号位)

Java学习
https://mapllle.site/2024/10/15/Language/Java/
作者
MAple
发布于
2024年10月15日
许可协议