Java基础笔记(1)-语言基础

Java的简单介绍

1.Java技术体系平台

版本 描述
Java SE(Java Standard Edition)标准版 支持面向桌面级应用的Java平台,提供完整的Java核心API
Java EE(Java Enterprise Edition)企业版 为开发企业环境下的应用程序提供解决方案,主要针对Web应用开发
Java ME(Java Micro Edition)小型版 支持运行在移动终端上的平台,对Java API有所精简(目前使用较少)

2.Java的重要特点

  • 简单性:一方面,Java剔除了C++中许多很少使用、难以理解、易混淆的特性,以便系统更容易理解。另一方面,Java的目标之一是支持开发能够在小型机器上独立运行的软件。

  • 面向对象(OOP)

  • 分布式:Java有一个丰富的例程库,用于处理HTTP、FTP之类的TCP/IP协议

  • 健壮性:强类型机制、异常处理、垃圾自动回收等

  • 安全性

  • 体系结构中立

  • 可移植性

    • .java->.class
    • 一个编译好的.class文件可以在多个平台上的Java虚拟机上运行
  • 解释型

    • 解释型语言:编译后的代码不能被机器直接执行,需要解释器来执行
    • 编译型语言:编译后的代码能够被机器直接执行
  • 高性能:即时编译器可以监控经常执行哪些代码,并优化这些代码以提高执行速度。

  • 多线程

  • 动态性

3.Java的运行机制和运行过程

.java程序通过编译成为.class.class文件运行在JVM(Java虚拟机、Java Virtual Machine)中。

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

指令:

  • javac:编译,从.java编译成.class
  • java:运行

4.JDK和JRE

  • JDK:(Java Development Kit Java开发工具包)
    • JDK = JRE + java的开发工具(java、javac、javadoc、javap等)
    • 提供给java开发人员使用,包括了JRE,无需单独安装
  • JRE:(Java Runtime Environment Java运行环境)
    • JRE = JVM + Java的核心类库
    • 只能运行开发好的Java程序(.class),提供给java使用人员使用

5.Hello World

1
2
3
4
5
6
7
//Hello.java

public class Hello{
public static void main(String[] args){
System.out.println("hello,World");
}
}
  • 注意事项:

    • 可能出现控制台的文件编码问题(默认下控制台的编码为GBK)
    • java后的指令不需要加.class(默认是运行一个类,类的名字为Hello)
  • 细节说明:

    • 入口程序有固定的书写程序
    • 严格区分大小写
    • 语句最后带分号
    • 一个源文件中最多只能由一个public类,其他类的个数不限
      • 编译后每一个类都对应生成一个.class文件
    • 如果源文件中包含一个public类,则文件名必须按照该类的名称来命名
    • 也可以将main方法写在非public类当中,然后指定运行非public类,这样入口方法就是非public的main方法
      • 每个类都可以有自己的入口方法

Java快速入门

1.注释

1
2
3
4
5
6
7
单行注释
//...

多行注释 不允许嵌套
/*...
...
*/
1
2
3
4
5
6
文档注释 注释内容可以被JDK提供的工具javadoc所解析,生成一套一网页文件形式体现的该程序的说明文档,一般写在类

/**
* @author:xxx
* @version:1.0
*/
  • 基本格式
    • Javadoc标签,不能随便乱写
  • 生成文档注释
    • javadoc -d 目标文件夹 -xx -yy java文件
    • -xx -yy表示对应需要生成的Javadoc标签
    • 之后会在目标目录下生成一堆html文件

2.变量相关

Java是一种强类型语言,这意味着必须为每个变量声明一种类型。

在Java中,一共有8种基本类型,其中有4种整型、2种浮点类型、1种字符类型和1种布尔类型。

  • 基本数据类型

    • 整数型
      • byte(1)、short(2)、int(4)、long(8)
    • 浮点型
      • float(4)、double(8)
    • 字符型
      • char(2)
    • 布尔型
      • boolean(1)
  • 引用数据类型

    • 类(class)
    • 接口(interface)
    • 数组([])
  • 数据类型对应的字节数在不同的操作系统上是固定的(JVM)

  • 整型常量默认为int,长整型指定需要加l或者L

  • 可以为数字字面量增加下划线,如1_000_000。这些下划线只是为了让人更加易读,Java编译器会去除这些下划线

  • 不同进制:0b/0B、无、0、0x/0X

  • 浮点类型的精度问题同样存在

  • java没有无符号数,都是有符号的

  • java的char是两个字节,c++的char是一个字节

  • java中的char可以直接存放中文,C++中则不可以

  • 在C++中,数值甚至是指针可以代替boolean值,即值0相当于布尔值的false,但是在Java中不能够这样

3.常见的字符编码表

  • ASCII:一个字节,128个字符
  • Unicode:固定大小编码,使用两个字节来表示,字母和汉字都使用两个字节
  • UTF-8:大小可变编码,字母使用一个字节,汉字使用3个字节
  • gbk:可以表示汉字,而且范围广,字母使用一个字节,汉字使用2个字节
  • gb2312:可以表示汉字,gb2312 < gbk
  • big5:繁体中文

4.类型转换

自动类型转换:按照精度向上自动转换(精度小 -> 精度大)

  • byte:把具体的数赋值给byte的时候,先判断该数是否在范围内,如果在范围内就可以进行复制;但是如果是将变量赋值给byte的话,则直接进行类型判断
1
2
3
byte a = 10; // 正确
int b = 1;
byte c = b; // 错误
  • byte(short)、char之间不会进行自动转换(char直接到int层面)

  • byte、short、char可以进行运算,在(单独或者混合)运算的时候直接提升到int,

强制类型转换:需要加上强制转换符(),可能会造成精度降低或者溢出

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

基本数据类型转String:加双引号

1
2
int n1 = 100;
String n1S = n1 + "";

String转基本数据类型:通过包装类某某调用parse某某方法

1
2
3
4
String s = "123";
int si = Integer.parseInt(s);
double sd = Double.parseDouble(s);
byte sb = Byte.parseByte(s);

6.运算符

运算符

  • 算术运算符
    • +、-、*、/、%、++、--
  • 赋值运算符
    • =、+=、-= 、*=、/=、%=
  • 关系运算符(比较)
    • ==、!=、<、>、<=、>=、instanceof()
  • 逻辑运算符
    • 短路与&& 短路或|| 取反!
    • 逻辑与& 逻辑或| 逻辑异或^
      • 短路与判断到能够得出结果后就不会进行后续的条件判断了
      • 逻辑与会继续判断所有的条件
      • 最终结果还是一样的
  • 位运算符
    • >><<>>>&|~^
    • >>>:无符号右移,高位补0
    • >>:算术右移,高位补符号位
    • <<:算术左移,低位补0
  • 三元运算符
    • 条件表达式 ? 表达式1 : 表达式2

7.标识符命名规范

  • 包名:多单词组成,所有字母都小写,单词之间使用.(aaa.bbb.ccc)
  • 类名,接口名:所有单词首字母大写(大驼峰)
  • 变量名,方法名:第一个单词首字母小写,后面的单词首字母大写(小驼峰)
  • 常量名:所有字母都大写,单词之间使用_(TAX_RATE)

8.键盘输入

需要使用Scanner(类)

使用步骤:

  1. 导入该类所在的包,这里是java.util.*
  2. 创建该类的对象(声明变量)
  3. 调用里面的功能(使用相关的方法)
1
2
3
4
5
6
7
8
9
10
import java.util.Scanner;


public class Study {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a = input.nextInt();
System.out.println(a);
}
}

因为输入是可见的,所以Scanner类不适用于从控制台读取密码。Java6引入了Console类来实现这个目的,读取密码可以使用下列的代码

1
2
3
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");

为了安全期间,返回的密码存放在一个字符数组中,而不是字符串中。在对密码处理完成之后,应该马上用一个填充值覆盖数组元素(不保存密码的原文)

Console对象处理输入,必须每次读取一行输入

9.标准输出

标准输出使用System.out.println()或者System.out.print()

并且在Java中,还沿用了C中的printf方法提供格式化输出。System.out.printf()

10.文件输入与输出

读取文件:

1
Scanner in = new Scanner(Path.of("xxx.txt"), StandardCharsets.UTF_8);

写入文件:构造一个PrintWriter对象,在构造器中提供文件名和字符编码

1
PrintWriter out = new PrintWriter("xxx.txt", StandardCharsets.UTF_8);

之后就可以调用对象的print、println、printf等方法了。

文件的相对路径是相对于当前的工作目录的。

对于使用java命令启动的程序,工作目录为启动JVM的位置,即执行该命令的位置

对于集成开发环境来说,启动目录将由IDE来控制。

11.原码、反码和补码

  • 计算机内存当中,二进制均以补码的形式存储,在任何运算的时候都是以补码的方式来进行运算的
    • 补码统一了正数和负数的计算
  • 原码和补码:如果是有符号的,首位为符号位,0表示+,1表示-
  • 原码和补码的相互转换
    • 原码->补码
      • 正数:补码与原码相同
      • 负数:符号位不变,其它位取反+1
    • 补码->原码
      • 首位为0:原码与补码相同
      • 首位为1:符号位不变,其它位取反+1
  • 正数的原码、反码和补码都一样(三码合一)
  • 负数的反码:符号位不变,其它位取反
  • 负数的补码 = 反码 + 1
  • 负数的反码 = 补码 - 1
  • 0的反码,补码都是0
  • 我们看运算结果的时候需要看他的原码

12.控制语句

  • 顺序控制

  • 分支控制

    • if、else、else if、switch-case
  • 循环控制

    • for、while、do-while
    • break、continue、return

Java中提供了一种带标签的break语句,用于跳出多重嵌套的循环语句

13.大数

如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math包中的两个大数类BigIntegerBigDecimal,这两个类可以处理包含任意长度数字序列的数值。

使用valueOf()将普通的数值转换成大数,或者传入带字符串参数的构造器。不能使用普通的算术运算符进行计算,而应该使用提供的addmultiply方法。

14.数组

数组初始化:

1
2
3
4
5
6
7
8
9
// 动态初始化
int[] a = new int[5];
// 静态初始化
int[] a = new int[]{1,2,3,4,5};
// 静态初始化省略格式
int[] a = {1,2,3,4,5};
// Java中也可以写成C风格的 int a[] = new int[5];
// 但是不能直接在第一个[]中指定大小,这点与C不同
// Java动态申请的同时进行赋初值中括号中不能写具体的数字,而C++中必须写

注意事项:

  • 没有指定初始值,会有默认值
  • 使用步骤:声明数组并开辟空间、给数组各个元素赋值、使用数组
  • 引用数据类型拷贝默认情况下是传递地址(引用传递
  • .length可以获取长度
1
2
3
int[] a = {1,2,3,4,5};
int[] b = a;
//修改b的话,a也会随之改变(浅拷贝)

二维数组的使用:

1
2
3
4
int[][] a = new int[3][4];
int[][] a = {{1,2,3},{1,2,3},{3,2,1}};
//同样可以使用.length来获取长度
//也可以这样声明:int[] a[]、int a[][]

注意事项:

  • 可以不指定后续的第二个[]中的值,第一个[]必须指定
  • 可以使用变量来进行初始化
  • 二维数组的各个一维数组的长度可以相同也可以不相同(不相同的可以在循环中指定)

快速打印数组:

1
2
3
4
5
// 快速打印一维数组
Arrays.toString(a);

// 快速打印多维数组
Arrays.deepToString(b);

15.静态导入

在 JDK 1.5 之后,Java增加了一种静态导入的语法,用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。如果一个类中的方法全部是使用 static 声明的静态方法,则在导入时就可以直接使用 import static 的方式导入。静态导入也有两种语法,分别用于导入指定类的单个静态成员变量、方法和全部静态成员变量、方法。分别如下:

1
2
3
import static package.ClassName.fieldName|methodName;

import static package.ClassName.*;

使用静态导入之后,之前需要利用类名称来调用的静态方法,现在就可以直接调用了。


Java基础笔记(1)-语言基础
http://example.com/2022/09/01/Java基础笔记-1-语言基础/
作者
EverNorif
发布于
2022年9月1日
许可协议