Java笔记

一、数据类型

(一)、基本数据类型

1.整型(4种)

(1)byte

大小:1字节(8位)

范围:-128到127

默认值:0

示例:

byte a = 100;

(2)short

大小:2字节(16位)

范围:-32,768到32,767

默认值:0

示例:

short b = 20000;

(3)int

大小:4字节(32位)

范围:-2³¹ 到 2³¹-1(-2147283648到2147283647)

默认值:0

示例:

int c = 1000000;

(4)long

大小:8字节(64位)

范围:-2⁶³ 到 2⁶³-1

默认值:0L

注意:字面量需加L后缀,如:

long d = 10000000000L;

2、浮点型(2种)

(1)float

大小:4字节(32位)

精度:约6-7位有效数字

默认值:0.0f

注意:字面量需加F后缀,如:

float e = 3.14F; 

(2)double

大小:8字节(64位)

精度:约15位有效数字

默认值:0.0d(可省略后缀)

示例:

double f = 3.1415926535;

3、字符型(1种)

char

大小:2字节(16位,Unicode编码)

范围:\u0000(0)到\uffff(65,535)

默认值:\u0000

示例:

char g = 'A';

char h = '\u0041';

4、布尔型(1种)

boolean

大小:无明确规范(JVM实现相关)

取值:true或false

默认值:false

示例:

boolean flag = true;

(二)、引用数据类型

Java中所有非基本类型的类型均为引用类型,主要分为以下类别:

1、类(Class)

自定义类:用户定义的类,如Person、Car。

Person p = new Person();

包装类:基本类型的对象形式,如Integer、Double。支持自动装箱(Autoboxing)和拆箱(Unboxing)。

Integer num = 10;  // 自动装箱:int → Integer
int n = num;       // 自动拆箱:Integer → int

2、接口类(Interface)

接口类型的引用可以指向其他实现类的对象。

List<String> list = new ArrayList<>();  // 接口引用指向实现类对象

3、数组(Array)

数组是对象,即使元素是基本类型,数组本身也是引用类型。

int[] arr = new int[5];  // 数组是引用类型

4、字符串(String)

String是Java预定义不可变类,属于引用类型。

String s1 = "abc";            // 字面量存储在字符串常量池
String s2 = new String("abc"); // 显式创建新对象

5、枚举(Enum)

枚举类型本质是类,每个枚举常量是枚举类的实例。

enum Color { RED, GREEN, BLUE }
Color color = Color.RED;

6、注解(Annotation)

注解本质是接口,由JVM动态生成代理类。

@Override  // 注解属于引用类型
public void method() {}

二、运算符

在Java中,运算符用于对变量或值进行各种操作。以下是常见的运算符分类及其详细说明:

(一)、算术运算符

用于数学计算,操作数为数值类型(基本数据类型)。

运算符描述示例注意事项
+加法int a = 5 + 3;也可用于字符串连接(见下文)
-减法double b = 10.5 - 2;
*乘法float c = 3.14f * 2;
/除法int d = 10 / 3;整数除法结果为整数(如3)
%取模int e = 10 % 3;结果的符号与被除数一致
++自增a++或++a前缀先增后用,后缀先用后增
--自减b--或--b同上

示例:

int x = 5;
int y = x++; // y=5, x=6
int z = ++x; // x=7, z=7

(二)、关系运算符

比较两个值的大小或相等性,返回 boolean 值(true/false)。

运算符描述示例
==等于5 == 3 → false
!=不等于5 != 3 → true
>大于10 > 5 → true
<小于10 < 5 → false
>=大于等于10 >= 10 → true
<=小于等于10 <= 5 → false

注意:比较引用类型时,== 比较的是内存地址,非内容(需用 equals() 方法)。

(三)、逻辑运算符

操作数为布尔值(boolean),用于组合条件。

运算符描述示例特性
&&逻辑与(a > 5) && (b < 10)短路运算(当两边都为true时,才返回true)
||逻辑或(a < 0) && (b > 20)短路运算(当一边为true时,就返回true)
!=逻辑非!(a == b)取反

示例:

if(a > 10 && a < 20){
}

(四)、位运算符

直接操作二进制位(仅用于整数类型:byte、short、int、long、char)。

运算符描述示例说明
&按位与0b1010 & 0b1100 = 0b1000两位均为1时结果为1
|按位或0b1010 | 0b1100 = 0b1110任意一位为1时结果为1
^按位异或0b1010 ^ 0b1100 = 0b0110两位不同时结果为1
~按位取反~ 0b1010 = ob0101单目运算符,取反所有位
<<左移5 << 2 → 20低位补0,等价于乘2的n次方
>>右移-10 >> 2 → -3高位补符号位

(五)、条件运算符(三元运算符)

根据条件选择两个值之一,语法:条件 ?值1 :值2。

示例:

int max = (a > b) ? a : b;  //返回a和b中较大的值

(六)运算符优先级

优先级从高到低(部分常见):

优先级运算符
最高()、[]、.(方法调用或属性访问)
++、--(后缀/前缀)、!、~
*、/、%
+、-
<<、>>
>、<、>=、<=
==、!=
&、^、|
&&、||
? :(三元运算符)
最低=、复合赋值运算符(如+=)
建议:在复杂表达式中使用()明确优先级,增强可读性。

三、常用输出

(一)、print()

直接输出,不换行,示例:

public class Example{
    public static void main(String[] args){
        int a = 5 + 2;
        String b = "Hello World!";
        System.out.print(a);
        System.out.print(b);
    }
}
7Hello World!

 (二)、println()

每次输出后自动换行,示例:

public class Example{
    public static void main(String[] args){
        int a = 5 + 2;
        String b = "Hello World!";
        System.out.println(a);
        System.out.println(b);
    }
}
7
Hello World!

(三)、printf()

C风格的输出,实现格式化输出功能,示例:

public class Example{
    public static void main(String[] args){
        int a = 5 + 2;
        char b = 'A';
        System.out.printf("%d\n%c",a,b);
        
    }
}
7
A

四、分支结构

(一)、if结构

1、基本语法

if(表达式){
   语句块
}

2、示例

public class Example{
    public static void main(String[] args){
        int a = 5;
        int b = 6;
        if(a < b){
            System.out.println("Hello World!");
        }
    }
}
Hello World!

语法上,语句块仅有一句代码时,可以省略{},但是一般不建议这么做。

(二)、if-else结构

1、基本语法

if(表达式){
    语句块A
} else{
    语句块B
}

 描述:表达式为true时,执行语句块A;表达式为false时,执行语句块B。

2、示例

public class Example{
    public static void main(String[] args){
        int a = 5;
        int b = 6;
        if(a > b){
            System.out.println("Hello World!");
        } else{
            System.out.println("Java No.1!");
        }
    }
}
Java No.1!

(三)、if-else if-else结构

1、基本语法

if(表达式){
    语句块1
} else if(表达式){
    语句块2
} else if(表达式){
    语句块3
} 
……
else if(表达式){
    语句块n
} else{
    语句块n+1
}

注意:else if可以有多个,也可以没有;else可以有(只能有一个),可以没有。

2、示例

public class Example{
    public static void main(String[] args){
        int a = 5;
        int b = 6;
        int c = 7;
        if(a > b){
            System.out.println("Hello World!");
        } else if(a < c){
            System.out.println("Java No.1!");
        } else{
            System.out.println("Love Java!");
        }
    }
}
Java No.1!

(四)、switch结构

1、基本语法

switch(表达式){
    case 值1:
        语句块1;
        break;
    case 值2:
        语句块2;
        break;
    ……
    case 值N:
        语句块N;
        break;
    default:
        语句块;
        break;
}

注意:

  •  表达式的值必须是以下几种类型之一:char,byte,short,int,enum,String(Jdk7之后)。
  • case子句中的值必须是常量值,不能是一个范围。
  • 所有case子句中的值不能重复,否则编译出错。
  • default子句是可选的,如果没有default,程序依旧可以运行。
  • break语句用于执行完一个case分支后跳出swicth语句块;如果没有,引起case贯穿,使程序接着执行下一个case语句,直至遇到break或者语句结束。

 五、循环结构

(一)、认识循环

1、循环是什么

循环是指同样的事情反复做多次,在程序编写中,就是一种命令要反复使用,学会运用循环结构可节省大量内存空间,且能减少不必要的代码重复量。

2、循环三要素

  • 定义循环变量并赋初值
  • 循环条件
  • 循环变量的更新

(二)、while循环 

1、基本语法

while(条件){//当满足条件时,执行大括号里的代码块
    代码块
}

2、示例

public class Example {
    public static void main(String[] args){
        int a = 0;
        while(a < 9){
            System.out.print(a+" ");
            a++;
        }
    }
}
0 1 2 3 4 5 6 7 8 

3、总结

while循环的特征就是先判断,后执行,如果在一开始条件就不满足,那么可能while循环一次也不执行。

(三)、do-while循环

1、基本语法

do{
    代码块
}while(循环条件);

2、示例

public class Example {
    public static void main(String[] args){
        int a = 0;
        do{
            System.out.print(a+" ");
            a++;
        }while(a < 9);
    }
}
0 1 2 3 4 5 6 7 8 

3、总结

do-while循环的特征是先执行,后判断,do-while循环至少会执行一次。

(四)、for循环

1、基本语法

for(定义循环变量;循环条件;循环变量的更新){
   代码块
}
//for循环结构里的定义循环变量、循环条件、循环变量的更新都可以不填
//但;不可省略
//不填入任何表达式时,默认为true

2、示例

public class Example {
    public static void main(String[] args){
        for(int a = 0;a < 9;a++){
            System.out.println(a);
        }
    }
}
0
1
2
3
4
5
6
7
8

3、总结

for循环的特征是先判断,后执行;如果一开始条件就不满足,那么for循环可能一次也不执行。循环次数稳定的情况下,通常使用for循环;循环次数不稳定的情况下通常使用while循环和do-while循环。

(五)、循环嵌套

在循环的使用中,可以内套循环结构,实现多重循环。

示例

public class Example {
    public static void main(String[] args){
        for (int i = 0; i < 9; i++) {//外层循环
            for(int j = 1;j <= i;j++){//内层循环
                System.out.print(j+"*"+i+"="+j*i+"\t");
            }
            System.out.println();//每行末尾换行
        }
    }
}
1*1=1	
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81

六、数组

在Java中,数组(Array)是一种用于存储同类型数据的引用数据类型,所有元素在内存中连续存储。

(一)、数组的特点

1、固定长度

数组一旦创建,长度不可变。

2、类型一致

所有元素必须是同一数据类型(基本类型或引用类型)。

3、索引访问

通过下标(从0开始)访问元素。

4、内存分配

  • 数组变量是引用类型,存储在栈内存中,指向堆内存中的数组对象。
  • 数组对象存储在堆内存中,元素按顺序存储。

(二)、数组的声明与初始化

1、声明数组

//第一种方式
数据类型[] 数组名;  //推荐写法(更清晰)
int[] arr1;
//第二种方式
数据类型 数组名[];  //合法但不推荐
String arr2[];

2、初始化

动态初始化:指定长度,元素赋默认值。

int[] arr = new int[5];  //默认值为0
arr[0] = 90; //赋值
String[] names = new String[3] //默认值为null
  • 静态初始化:直接指定元素值。
int[] arr = {1,2,3}; //简写形式
int[] arr = new int[] {1,2,3}; //完整形式

(三)、数组的访问与遍历

1、访问元素

通过索引访问,索引范围:0到数组长度-1。

int[] arr = {10,20,30};
System.out.println(arr[1]); //输出20

2、遍历数组

for (int i = 0; i < arr.length; i++){
    System.out.println(arr[i]);
}

3、越界问题

访问超出索引会抛出

ArrayIndexOutOfBundsException:

int[] arr = new int[3];
System.out.println(arr[3]); //报错,所以最大为2

(四)、多维数组

Java支持多维数组(如二维数组),本质是“数组的数组”。

1、二维数组声明与初始化

  • 动态初始化:

int[][] matrix = new int[3][4]; //3行4列的规则二维数组
  • 静态初始化:
int[][] matrix = {
     {1,2,3},
     {4,5},
     {6}         //不规则二维数组(每行长度不同)
};

2、访问多维数组

System.out.println(matrix[0][1]);  //输出2
System.out.println(matrix[1][1]);  //输出5

3、遍历多维数组

嵌套循环:

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j <matrix[i].length; j++) {
        System.out.println(matrix[i][j] + " ");
    }
    System.out.println();
}

(五)、数组的常见操作

1、数组的复制

  • System.arraycopy():
int[] src = {1,2,3};
jint[] dest = new int[3];
System.arraycopy(src,0,src.length); //复制整个数组
  • Array.copyOf():
int[] newArr = Arrays.copyOf(src,src.length);  //返回新数组

2、数组排序

使用Arrays.sort():

int[] arr = {5,3,9,1};
Arrays.sort(arr);  //排序后arr变为[1,3,5,9]

3、数组查找

  • 线性查找:数个遍历。
  • 二分查找(需先排序)Arrays.binarySearch(数组,要查找的值)
int index = Array.binarySearch(arr,5);  //返回元素索引

(六)、注意事项

1、默认值规则 

  • 基本类型数组:数值类型为0,boolean为false。
  • 引用类数组:默认值为null(如String[] 默认元素为null)。

2、数组长度

  • 通过数组名。length获取长度(不是方法,是属性)。
  • 无法直接修改数组长度,需创建新数组并复制数据。 

七、方法 

       在Java中,方法类似于C语言中的函数,用于执行特定任务。通过方法可以实现代码的模块化和复用。

(一)、基本语法

[访问修饰符] [static] 返回类型 方法名(参数列表){
    //方法体(代码逻辑)
    [return 返回值;]  //若返回类型为void则无需写return
}

示例1(无返回类型,无参数列表):

public static void example_1(){
    int a = 3;
    int b = 2;
    Sysstem.out.println(a+b);
}

示例2(无返回类型,有参数列表):

public static void example_2(int a,int b){
    System.out.println(a+b);
}

 示例3(有返回类型,有参数列表):

public static int example_3(int a,int b){
    return a + b;
}

(二)、方法的调用

       在Java中,同一类中的方法可直接通过方法名调用。

示例:

public class Test{
    public static void main(String[] args){
       int a = 3;
       int b = 2;
       int c = method_1(a,b);
       System.out.println(c);
    }
    public static int method_1(int a,int b){
       return a + b;
    }
}

运行结果:

5

(三)、方法的重载(Overloading)与重构(Refactoring)

1、重载(Overloading)

定义:

       在同一个类中,允许多个同名方法,但这些方法的参数列表必须不同(参数类型、参数数量或参数顺序不同)。重载是编译时多态性的体现。

规则:

  • 方法名必须相同。
  • 参数列表必须不同(类、数量、顺序)。
  • 返回类型可以不同,但仅返回类型不同不足以构成重载。
  • 访问修饰符可以不同(如public和private)。

作用:

  • 提高代码复用性,统一功能相似的方法命名。
  • 支持不同类型或数量的参数输入。

示例:

public class Calculator {
    
    // 两个int参数
    public int add(int a,int b){
        return a + b;
    }
    
    // 三个int参数
    public int add(int a,int b,int c){
        return a + b + c;
    }
    
    // 两个double参数
    public double add(double a,double b){
        return a +b;
    }
}

 2、方法重构(Refactoring)

定义:

       重构是指在不改变代码外部功能的前提下,优化代码结构,使其更清晰、可维护性更高。重构不是Java语法特性,而是一种编程实践。

常用场景:

  • 拆分冗长方法为多个小方法。
  • 重命名方法或变量一提高可读性。
  • 消除重复代码(如提取公共逻辑)。
  • 简化复杂条件判断或循环。

作用:

  • 提高代码可读性和可维护性。
  • 减少代码冗余,降低复杂度。
  • 便于团队协作和后续扩展。 

示例:

// 重构前
public void processData(String input) {
    // 冗长复杂的逻辑
    String[] parts = input.split(",");
    int sum = 0;
    for (String part : parts) {
        int num = Integer.parseInt(part);
        sum += num;
    }
    System.out.println("总和: " + sum);
}

// 重构后
public void processData(String input) {
    int sum = calculateSum(input);
    printResult(sum);
}

// 拆分出的方法:计算总和
private int calculateSum(String input) {
    String[] parts = input.split(",");
    int sum = 0;
    for (String part : parts) {
        sum += parseNumber(part);
    }
    return sum;
}

// 拆分出的方法:解析数字
private int parseNumber(String str) {
    return Integer.parseInt(str);
}

// 拆分出的方法:打印结果
private void printResult(int sum) {
    System.out.println("总和: " + sum);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值