Java学习笔记

变量

Java数据类型

数据类型

  • 整数类型
    • byte——1字节
    • short——2字节
    • int——4字节(默认)
    • long——8字节
  • 浮点类型
    • float——4字节
    • double——8字节(默认)

浮点数使用陷阱
2.7和8.1/3比较,8.1/3的结果接近2.7而非2.7,精度问题

运算结果是小数要注意 应以两个数的差的绝对值在某精度范围内判断

Java API 文档

API (Application Programming Interface,应用程序编程接口)是Java提供的基本编程接口(Gava提供的类还有相关的方法)。

中文在线文档:https://www.matools.com

类的组织形式

类的组织形式

  • 字符类型(char)

    在java中,char的本质是一个整数,在输出时,是unicode码对应的字符,可参与运算。

  • 布尔类型——1字节

基本数据类型转换

自动类型转换

当java程序在进行赋值或者运算时,精度小的类型自动转换为精度最大的数据类型。

自动类型转换

精度大->精度小会报错

byte和char不自动转换

byte,char,short可以转换为int计算,一运算就成int

布尔不参与转换

1
2
3
4
5
6
7
8
9
10
float d1 = n1 + 1.1;//错 结果类型是 double
double d1 = n1 + 1.1;//对 结果类型是 double
d1 = n1 + 1.1F;//对 结果类型是 float

int n = 1;
byte b = n ;//错,变量间的赋值先判断类型

byte a1 = 1;
byte a2 = 2;
byte a3 = a1 + a2;//错 一运算就成int

强制类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符 ( ),但可能造成精度降低或溢出。

强制类型转换

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

基本类型转String类型:将基本类型的值+“”

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

要确保String类型能够转成有效的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
int n1 = 100;
float f1 = 1.1F;
double d1 = 4.5;
boolean b1 = true;
String s1 = n1 + "";

int num1 = Integer.parseInt(s5);
double num2 = Double.parseDouble(s5);
float num3 = Float.parseFloat(s5);
long num4 = Long.parseLong(s5);
byte num5 = Byte.parseByte(s5);
boolean b = Boolean.parseBoolean("true");
short num6 = Short.parseShort(s5);

运算符

算术运算符

对于除号/,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如:intx=10/3,结果是3。

1
2
int x = 10/3  //3
double x = 10/3 //3.33

%的本质: a%b = a-a/b*b

1
2
3
10 % -3 = 1
-10 % 3 = -1
-10 % -3 = -1

i=i++:结果i=1

使用临时变量:(1)temp=i:(2)i=i+1;(3)i=temp

i=++i:结果i=2

关系运算符

都是boolean型

逻辑运算符

  • 逻辑与&,逻辑或|,逻辑异或^
  • 短路与&&,短路或||,取反!

逻辑运算符

&&和&使用区别(||和|同理)

&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高

&逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低

赋值运算符

只有单目运算符、赋值运算符是从右向左运算,会进行类型转换。

三元运算符

条件表达式 ? 表达式 1:表达式 2

如果条件表达式为rue,运算后的结果是表达式1,如果条件表达式为false,运算后的结果是表达式2。

表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)。

标识符

Java对各种变量、方法和类等命名时使用的字符序列称为标识符。

🎀命名规则

  1. 由26个英文字母大小写,0-9,或$组成

  2. 数字不可以开头。

    1
    int3ab=1;//错误
  3. 不可以使用关键字和保留字,但能包含关键字和保留字。

  4. Java中严格区分大小写,长度无限制。

    1
    int totalNum=10;intn=90;
  5. 标识符不能包含空格。

    1
    int a b=90;

包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm

类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz [大驼峰] 比如: TankShotGame

变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小 驼峰, 简称 驼峰法] 比如:tankShotGame

常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ 比如 :定义一个所得税率 TAX_RATE

关键字

被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词),所有字母都为小写。

保留字

现有 Java 版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留 字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const

键盘输入语句

以使用键盘输入语句来获取。Input.java , 需要一个 扫描器(对象), 就是 Scanner

🎀步骤:

  • 导入该类的所在包, java.util.
  • 创建该类对象(声明变量)
  • 调用里面的功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Scanner;//表示把 java.util 下的 Scanner 类导入

public class Input {
//编写一个 main 方法
public static void main(String[] args) {
//演示接受用户的输入
//步骤
//Scanner 类 表示 简单文本扫描器,在 java.util 包
//1. 引入/导入 Scanner 类所在的包
//2. 创建 Scanner 对象 , new 创建一个对象,体会
// myScanner 就是 Scanner 类的对象
Scanner myScanner = new Scanner(System.in);
//3. 接收用户输入了, 使用 相关的方法
System.out.println("请输入名字");
//当程序执行到 next 方法时,会等待用户输入~~~
String name = myScanner.next(); //接收用户输入字符串
System.out.println("请输入年龄");
int age = myScanner.nextInt(); //接收用户输入 int
System.out.println("请输入薪水");
double sal = myScanner.nextDouble(); //接收用户输入 double
System.out.println("人的信息如下:");
System.out.println("名字=" + name
+ " 年龄=" + age + " 薪水=" + sal);
}
}

进制

Java没有无符号数,计算机运算时都是以补码形式运算

位运算符

按位与&、按位或|,按位异或^,按位取反~,算数右移>>,算数左移<<,逻辑右移>>>(低位溢出,高位补 0),没有逻辑左移。

程序控制结构

  • 顺序控制 前向引用
  • 分支控制 if-else
  • switch 分支结构
  • for
  • while

数组、排序和查找

数组

数组属引用类型,数组型数据是对象(object)

1
2
3
//动态初始化
int a[] = new int[5];
int b[] = {2,4,5,6}

数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。

数组创建后,如果没有赋值,有默认值 int 0short 0, byte 0, long 0, float 0.0,double 0.0char \u0000boolean falseString null

赋值机制

基本数据类型赋值方式为值拷贝

数组赋值方式为引用传递,赋的值是地址,赋值方式为引用传达

若需要拷贝后的数组地址独立,则需要new

1
2
3
4
5
int[] arr1 = {10,20,30}; 
int[] arr2 = new int [arr1.length]
for(int i=0;i<arr1.length;i++){
arr2[i] = arr1[i];
}

二维数组

动态初始化

二维数组

也可以这样创建:

1
2
3
4
5
6
7
8
9
10
int[][] arr = new int[3][]
for(int i = 0; i < arr.length; i++) {
arr[i] = new int[i + 1];
//给每个一维数组开空间 new
//如果没有给一维数组 new ,那么 arr[i]就是 null
//遍历一维数组,并给一维数组的每个元素赋值
for(int j = 0; j < arr[i].length; j++) {
arr[i][j] = i + 1;//赋值
}
}

静态初始化

1
int[][] arr = {{1,1,1}, {8,8,9}, {100}};

面向对象编程

类与对象

类是抽象的,概念的,代表一类事物,比如人类,猫类…, 即它是数据类型

对象是具体的,实际的,代表一个具体事物, 即是实例

类是对象的模板,对象是类的一个个体,对应一个实例

类与对象

属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;

访问修饰符: 控制属性的访问范围 有四种访问修饰符 public, proctected, 默认, private ,

属性的定义类型可以为任意类型,包含基本类型或引用类型

属性如果不赋值,有默认值,规则和数组一致。

1
2
3
4
5
6
7
8
9
int 0
short 0
byte 0
long 0
float 0.0
double 0.0
char \u0000
boolean false
String nul
  • 内存分配机制

栈: 一般存放基本数据类型(局部变量)

堆: 存放对象(Cat cat , 数组等)

方法区:常量池(常量,比如字符串), 类加载信息

成员方法

调用机制

方法调用机制

1
2
3
4
访问修饰符 返回数据类型 方法名(形参列表..) {//方法体
语句;
return 返回值;
}

方法不能嵌套定义

跨类中的方法A类调用B类方法:需要通过对象名调用。比如对象名,方法名(参数)

跨类的方法调用和方法的访问修饰符相关

传参机制