三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

java基础总结笔记(2026.05.06)

java基础总结笔记(2026.05.06)

javase

注释

/* * 多行注释 */ ​ //JavaDoc:文档注释 ​ /* * @Description Helloworld * @Author thr */

标识符

关键字

  • 所有的标识符都应该以大写字母或者小写字母、美元符号💲、下划线开始的。

  • 首字符之后可以是大写字母或者小写字母、美元符号💲、下划线这些或者数字的任何字符组成。

  • 不能使用关键字作为变量名或方法名。

  • 标识符是大小写敏感的。

  • 不建议用中文去命名

数据类型

  • java是强类型语言:所有变量都必须先定义后才能使用。

  • 弱类型语言:VB、JS

Java的数据类型分为两大类

  1. 基本类型

    1. 数值型

      1. byte

      2. short

      3. int

      4. long(定义的数值后面要加L)

    2. 浮点类型

      1. float(定义的数值后面要加F)

      2. double(定义的数值后面要加D)

    3. 字符类型

      1. char

    4. boolean类型

  2. 引用类型

    1. 类

    2. 接口

    3. 数组

十进制

二进制

八进制(0开头)

十进制

十六进制(0X开头)

最好完全使用浮点数进行比较,BigDecimal数学工具进行比较

类型转换

  • 不同类型的数据先转化为同一类型,然后再进行计算赋值

  • 从低到高的数据类型

byte、short、int、long、float、double

  • 如果从低到高转换是强制转换可能造成内存溢出或者精度流失

  • int i =128; byte b = (byte)i;//强制转换,但是最后byte得出的结果不是128,因为byte类型最多到127,造成了内存溢出的问题
  • 如果从高到低是自动转换

int i = 128; double b = i;//b得128.0
  • 不能对布尔值进行转换

  • 不能把对象类型转换为不相干的类型

    int money = 10_0000_0000;//JDK7新特性,数字之间可以使用下划线进行分割 int years = 20; long total = money * years;//结果是不对的,因为在计算money * years的时候数据已经溢出,再复制给long类型也是错误的数据 long total1 = money* ((long)years);//结果是正确的

变量

  • 从属于对象,如果不进行初始化,这个类型的默认值 0,0.0,布尔值默认为false,除了基本类型其余的默认值都是null

常量

  • 常量初始化后不能再改变!不会变动的值

  • 常量名一般使用大写字符

final double PI =3.14;//final 常量名 = 值;定义常量

运算符

command + d 复制当前行到下一行

double pow = Math.pow(2,3);//输出2的3次方的值,Math是一个工具类
  • &&逻辑与运算:两个都为真,结果才为真

  • ||逻辑非运算:两个变量有一个为真,结果是真

  • !非运算:如果是真,结果为假,如果是假,结果为真

boolean a = true; boolean b = false; System.out.println(a&&b);//false System.out.println(a||b);//true System.out.println!(a&&b);//true
int c = 5; boolean d = (c< 4)&&(c++<4);//短路与 System.out.println(d);//false,c<4是错误的所以后面的C++没有执行 System.out.println(c);//所以c还是5
  • 位运算

    1. 与、或、非、取反

A = 0011 1100 B = 0000 1101 A & B 0000 1100(A与B都为1时才为1,否则是0) A | B 0011 1101(A或B为1时,结果为1,否则是0) A ^ B 0011 0001(A与B相同时则为0,不同时为1) ~B 1111 0010(当B为1时等于0,当B为0时为1,取反)
  1. 左移<<,右移>>

System.out.print(2<<3);//输出16,2在二进制里面是0000 0010,当左移三位的时候是0001 0000,对应16

条件运算符

  1. +=,-=

int a = 10; int b = 20; a += b;//a = a + b System.out.println(a);//得出a等于30. a -= b;//a = a - b System.out.println(a);//得出a 等于10。
  1. 字符串链接符

int a = 10; int b = 20; System.out.println("" + a + b);//输出1020,因为前面有个字符串的类型 System.out.println(a + b + "");//输出30,因为先运算a+b后再加字符串就还是30.
  1. 三元运算符

x ? y : z;//如果x为真,则结果为y,否则结果为z int score = 50; String type = score < 60 ? "不及格" : "及格"; System.out.println(type);//不及格

用户交互Scanner

我们可以通过Scanner类来获取用户的输入。

基本语法

Scanner s = new Scanner(System.in);
import java.util.Scanner;//需要调用Scanner包 ​ public class Scannertest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);//创建一个扫描器对象,用于接收键盘数据 ​ System.out.println("使用next方式接收"); ​ //判断用户有没有输入字符串 if(scanner.hasNext()){ String str = scanner.next(); System.out.println("输出的内容为:" + str); } //凡是属于IO流(输入、输出流)的类如果不关闭会一直占用资源 scanner.close(); } }

next与nextLine接收的区别

  • next():

  1. 一定要读取到有效字符后才可以结束输入。

  2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉。

  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。

  4. next()不能得到带有空格的字符串。

  • nextLine():

1.以Enter为结束符,也就是说nextLine()方法返回的是输入会车之前的所有字符。

2.可以获得空白。

在Scanner上按住command和左键可以调出Scanner的源码,打开结构可以看到Scanner的结构。

顺序结构

  • JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。

  • 语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,他是任何一个算法都离不开的一种基本算法结构。

选择结构

  1. if单选择结构

  • 语法:

if(布尔值表达式) { //如果布尔表达式为true将执行的语句 };

拓展:equals判断字符串是否相等,尽量不要使用==判断字符串。

  1. if双选择结构

  • 语法:

if(布尔表达式){ //如果布尔表达式的值为true }else{ //如果布尔表达式为false }
  1. if多选择结构

  • 语法:

if(布尔表达式1){ //如果布尔表达式1的值为true执行代码 }else if(布尔表达式2){ //如果布尔表达式2的值为true执行代码 }else if(布尔表达式3){ //如果布尔表达式3的值为true执行代码 }else{ //如果以上布尔表达式都不为true执行代码 }

if语句至多有一个else语句,else语句在所有else if语句之后,if语句可以有若干个else if语句,他们必须在else语句之前。一旦其中一个else if语句检测为true,其他的else if 以及 else语句都将跳过执行。

  1. 嵌套的if结构

  • 使用嵌套的if...else语句是合法的,也就是说可以在另一个if或者else if语句中使用if或者else if语句。

  • 语法:

if(布尔表达式1){ //如果布尔表达式1 的值为true执行代码 if(布尔表达式2){ //如果布尔表达式2的值为true执行代码 } }
  1. Switch选择结构

  • switch case语句

  • switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

  • switch语句中的变量类型可以是byte、short、int、char、String,同时case标签必须为字符串常量或自变量。

  • 语法:

switch(expression){ case value: //语句 break;//可选 //你可以有任意数量的case语句 case value: //语句 break;//可选 default://可选 //语句 }

循环结构

  1. While循环

  • 结构

while(布尔表达式){ //循环内容 }
  • 只要布尔表达式为true,循环就会一直执行下去。

  • 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环。

  • 少部分情况需要循环一直执行,比如服务器的请求响应监听等。

  • 循环条件一直为true就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或造成程序卡死。

  1. do...while循环

  • 对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

  • do...while循环和while循环相似,不同的是,do...while循环至少会执行一次。

  • 语法

do { //代码语句 }while{布尔表达式};
  • While 和do...while的区别:

    • while先判断后执行,do..while是先执行后判断。

    • do...while总是保证循环体会被至少执行一次!这是他们主要的区别。

  • 代码演示

//使用do...while int i = 0; int sum = 0; do{ sum = sum + i; i++; }while(i<=100); System.out.println(sum);//5050,从1加到100
//演示while与do...while的区别 int a = 0; while(a<0){ System.out.println(a);//没有输出 a++; } System.out.println("========="); do{ System.out.println(a);//输出0 a++; } while(a<0);
  1. for循环(很重要)

  • 虽然所有循环结构都可以用while或者do...while表示,但java提供了另一种语言:for循环,使一些循环结构变得更简单。

  • for循环语句是支持迭代的一种通用结构,是最有效的,最灵活的循环结构。

  • for循环执行的次数是在执行钱就确定的,语法:

for(初始化;布尔表达式;更新迭代){ //代码语句 }
  • 代码演示:

for(int i =1;i <= 100;i++){//初始化值;条件判断;迭代 System.out.println(i); } System.out.println("for循环结束");
  • 快捷键比如100.for会自动生成for的循环语句

  • 注意事项:

    • 最先执行初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。然后检测布尔表达式的值。如果为true,循环体执行。如果为false,循环终止,开始执行循环体后面的语句。再次检测布尔表达式,循环执行上面的过程。

    • 死循环:

    for(;;) {};
    • 练习题

    //练习1:计算0到100之间的奇数和偶数的和 int oddSum = 0; int evenSum = 0; for(int i = 0;i < 100;i++) { if(i%2 == 0 ){ oddSum+=i; }else { evenSum+=i; } } System.out.println(oddSum);//奇数和 System.out.println(evenSum);//偶数和
    //练习2:用for循环输出1到1000能被5整除的数,并且每三个为一行。 for (int i = 1; i <= 1000; i++) { if(i % 5 == 0){ System.out.print(i+"\t"); } if(i %(5 * 3) == 0) { System.out.println(); } }
    //练习3:打印99乘法表 for(int i = 1;i<=9;i++) { for(int j = 1;j<=i;j++){ System.out.print(j + "*" + i + "=" + i*j + "\t"); } System.out.println(); }
    1. 增强for循环

    • 在数组重点使用。

    • 增强for循环的语法:

    for(声明语句;表达式) { //声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。 //代码 }
    • 代码样式:

    int[] numbers = {10,20,30,40,50};//定义了一个数组 for(int i = 0 ;i < 5;i++) { System.out.println(numbers[i]); } //遍历数组的元素 for (int x:numbers) { System.out.println(x); }
  1. break和continue

  • break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)。

  • continue语句在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

  • break与continue的区别:break退出整个循环,continue退出某次循环过程。

  1. 练习:打印5行三角形

for(int i = 1;i<=5;i++) { for(int j = 5;j>i;j--) { System.out.print(" "); } for(int j = 1;j<=i;j++) { System.out.print("*"); } for(int j = 1;j<i;j++) { System.out.print("*"); } System.out.println(); }

什么是方法

  • java方法是语句的集合,他们在一起执行一个功能。

    • 方法是解决一类问题的步骤和有序组合

    • 方法包含于类或对象中

    • 方法在程序中被创建,在其他地方被引用

  • 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只能完成1个功能,这样有利于我们后期的扩展。

  • 例子

    //main方法 public static void main(String[] args) { int sum = add(1,2); System.out.println(sum);//3 } public static int add(int a,int b) { return a+b; }
  • main方法里尽量整洁,主要调用别的方法

方法的定义和调用

方法的定义

  • java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:

    • 方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

      • 修饰符:是可选的,告诉编译器如何使用该方法。定义了该方法的访问类型。

      • 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。

      • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。

      • 参数类型:参数像一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。

        • 形式参数:在方法被调用时用于接收外界输入的数据。

        • 实参:调用方法时实际传给方法的数据。

      • 方法体:方法体包含具体的语句,定义该方法的功能。

      • 格式:

      修饰符 返回值类型 方法名(参数类型 参数名) { 方法体 return 返回值; }
      • 举例:比大小

      //比大小 public static void main(String[] args) { int max = max(10,19); System.out.println(max); } public static int max(int num1,int num2) { if(num1 == num2) { return 0;//终止方法 } int result = 0; if(num1 > num2) { result = num1; }else { result = num2; } return result; }

      方法的调用

      • 调用方法:对象名.方法名(实参列表)

      • java支持两种调用方法的方式,根据方法是否返回值来选择。

      • 当方法返回一个值的时候方法调用通常被当作一个值。例如

      int larger = max(30,40);
      • 如果方法返回值是void,方法调用一定是一条语句。

        System.out.println("Hello!");

      值传递(java是值传递)和引用传递经常在面试中问道

      方法的重载

      • 重载就是在一个类中,有相同的函数名称,但形参不同的参数。

      • 方法重载的规则:

        • 方法名称必须相同

        • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。

        • 方法的返回类型可以相同也可以不同。

        • 仅仅返回类型不同不足以成为方法的重载。

      • 实现理论:

        • 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器会报错。

      命令行传参

      • 有时候希望运行一个程序的时候再传递给他消息。这就要靠传递命令行参数给main()函数实现。

      public class Scannertest { public static void main(String[] args) { //args.length 数组长度 for(int i = 0;i < args.length;i++) { System.out.println("args[" + i + "]"+ args[i]); ​ } } }

      可变参数

      • java支持传递同类型的可变参数给一个方法。

      • 在方法声明中,在指定参数类型后面加一个省略号(...)。

      • 一个方法中只能置顶一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

← 返回列表