Java基础_基本概念和变量

1、基本概念

  • Java语言是一门严格区分大小写的语言
  • 每一行执行语句必须以分号 ; 结束。

1.1 Java程序的结构与格式

结构:

1
2
3
4
5
类{
方法{
语句;
}
}

格式:

(1)每一级缩进一个Tab键

(2){}的左半部分在行尾,右半部分单独一行,与和它成对的”{“的行首对齐

1.2 Java程序的入口

Java程序的入口是main方法

1
2
3
public static void main(String[] args){
// main()中的格式有两种表示方式:1、String[] args;或2、String args[]
}

1.3 两种常见的输出语句

  • 换行输出语句:输出内容,完毕后进行换行,格式如下:

    1
    System.out.println(输出内容);
  • 直接输出语句:输出内容,完毕后不做任何处理,格式如下

    1
    System.out.print(输出内容);

注意事项:

​ 换行输出语句,括号内可以什么都不写,只做换行处理

​ 直接输出语句,括号内什么都不写的话,编译报错

1.4 源文件名与类名

  • 如果这个类不是public,那么源文件名可以和类名不一致。但是不便于代码维护。

  • 如果这个类是public,那么要求源文件名必须与类名一致。否则编译报错。

  • 一个源文件中可以有多个类,编译后会生成多个.class字节码文件。但是一个源文件只能有一个public的类。

1.5 注释(comment)

1
2
3
单行注释: //
多行注释: /* */
文档注释: /** */

2、变量

2.1 标识符

  • 凡是自己可以起名字的地方都叫标识符。

标识符的命名规则(必须遵守的硬性规定):

1
2
3
4
5
> 由26个英文字母大小写,0-9 ,_或 $ 组成  
> 数字不可以开头。
> 不可以使用关键字和保留字,但能包含关键字和保留字。
> Java中严格区分大小写,长度无限制。
> 标识符不能包含空格。

标识符的命名规范(建议遵守的软性要求,否则工作时容易被鄙视):

1
2
3
4
5
6
7
8
9
10
11
> 包名:多单词组成时所有字母都小写:xxxyyyzzz。
例如:java.lang、com.atguigu.bean

> 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
例如:HelloWorld,String,System等

> 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
例如:age,name,bookName,main,binarySearch,getName

> 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
例如:MAX_VALUE,PI,DEFAULT_CAPACITY

注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。

2.2 初识变量

  • Java中变量声明的格式:数据类型 变量名 = 变量值

  • 使用变量注意:

    • Java中每个变量必须先声明,后使用。

    • 使用变量名来访问这块区域的数据。

    • 变量的作用域:其定义所在的一对{ }内。

    • 变量只有在其作用域内才有效。出了作用域,变量不可以再被调用。

    • 同一个作用域内,不能定义重名的变量。

Java中变量的数据类型分为两种:

image-20240322164120178
  • 变量可以反复赋值
  • 也可以将变量的声明和赋值一并执行

2.3 基本数据类型

2.3.1 整数类型:byte、short、int、long

image-20240322164511139
  • 定义long类型的变量,赋值时需要以”l“或”L“作为后缀。

  • Java的整型常量默认为 int 型

  • 字节(Byte):是计算机用于计量存储容量基本单位,一个字节等于8 bit。

  • 位(bit):是数据存储的最小单位。二进制数系统中,每个0或1就是一个位,叫做bit(比特),其中8 bit 就称为一个字节(Byte)。

2.3.2 浮点类型:float、double

image-20240322164751515
  • float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
  • double:双精度,精度是float的两倍。通常采用此类型。
  • 定义float类型的变量,赋值时需要以”f“或”F“作为后缀。
  • Java 的浮点型常量默认为double型

关于浮点型精度的说明

  • 并不是所有的小数都能可以精确的用二进制浮点数表示。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。

  • 浮点类型float、double的数据不适合在不容许舍入误差的金融计算领域。如果需要精确数字计算或保留指定位数的精度,需要使用BigDecimal类

2.3.3 字符类型:char

  • char 型数据用来表示通常意义上“字符”(占2字节)

  • Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。

  • 字符型变量的三种表现形式:

    • 形式1:使用单引号(‘ ‘)括起来的单个字符

      例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;

    • 形式2:直接使用 Unicode值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。

      例如:\u0023 表示 ‘#’。

    • 形式3:Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。

      例如:char c3 = ‘\n’; // ‘\n’表示换行符

    转义字符 说明 Unicode表示方式
    \n 换行符 \u000a
    \t 制表符 \u0009
    \" 双引号 \u0022
    \' 单引号 \u0027
    \\ 反斜线 \u005c
    \b 退格符 \u0008
    \r 回车符 \u000d
  • char类型是可以进行运算的。因为它都对应有Unicode码,可以看做是一个数值。

2.3.4 布尔类型:boolean

  • boolean类型数据只有两个值:true、false,无其它。

2.4 基本数据类型变量间运算规则

转换的方式有两种:自动类型提升强制类型转换

2.4.1 自动类型提升

基本数据类型的转换规则如图所示:

image-20220311002543688

(1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时

1
2
3
4
5
6
int i = 'A';//char自动升级为int,其实就是把字符的编码值赋值给i变量了
double d = 10;//int自动升级为double
long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换

//byte bigB = 130;//错误,右边的整数常量值超过byte范围
long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,显式表示long类型。否则编译不通过

(2)当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。

1
2
3
4
5
int i = 1;
byte b = 1;
double d = 1.0;

double sum = i + b + d;//混合运算,升级为double

(3)当byte,short,char数据类型的变量进行算术运算时,按照int类型处理。

1
2
3
4
5
6
7
8
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为int

char c1 = '0';
char c2 = 'A';
int i = c1 + c2;//至少需要使用int类型来接收
System.out.println(c1 + c2);//113

2.4.2 强制类型转换

3.14 赋值到int 类型变量会发生什么?产生编译失败,肯定无法赋值。

1
int i = 3.14; // 编译报错

想要赋值成功,只有通过强制类型转换,将double 类型强制转换成int 类型才能赋值。

转换格式:

1
数据类型1 变量名 = (数据类型1)被强转数据值;  //()中的数据类型必须<=变量值的数据类型

(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度溢出

1
2
3
4
5
6
7
int i = (int)3.14;//损失精度

double d = 1.2;
int num = (int)d;//损失精度 out:1

int i = 200;
byte b = (byte)i;//溢出

(2)当某个值想要提升数据类型时,也可以使用强制类型转换。这种情况的强制类型转换是没有风险的,通常省略。

1
2
3
int i = 1;
int j = 2;
double bigger = (double)(i/j);

(3)声明long类型变量时,可以出现省略后缀的情况。float则不同。

1
2
3
4
5
6
7
8
9
10
long l1 = 123L;
long l2 = 123;//如何理解呢? 此时可以看做是int类型的123自动类型提升为long类型

//long l3 = 123123123123; //报错,因为123123123123超出了int的范围。
long l4 = 123123123123L;


//float f1 = 12.3; //报错,因为12.3看做是double,不能自动转换为float类型
float f2 = 12.3F;
float f3 = (float)12.3;

2.5 基本数据类型与String的运算

  • String不是基本数据类型,属于引用数据类型
  • String类型不能通过强制类型()转换,转为其他的类型
  • 使用一对""来表示一个字符串,内部可以包含0个、1个或多个字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//基本数据类型->String,基本数据类型后面加入“”即可
int n1 = 100;
String s1 = n1 + ""

//String->对应的基本数据类型
String s5 = "123";
// 想要把“ ”中的数值取出来,需要使用基本数据类型对应的包装类的相应方法,得到基本数据类型
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);
//把字符串转成字符 char
System.out.println(s5.charAt(0));//输入第一个字符

3、运算符

3.1 算术运算符

  • 基本运算:+ - * / %
  • 取模运算:%——-》其结果与被模数的符号相同
1
2
3
4
5
//结果与被模数符号相同
System.out.println(5%2);//1
System.out.println(5%-2);//1
System.out.println(-5%2);//-1
System.out.println(-5%-2);//-1
  • ++i 先自增后赋值,i++先赋值后自增,int k = ++j; //等价 j=j+1;k=j

3.2 赋值运算符

  • += ,-= ,*= , /= ,%=

3.3 关系运算符 [比较运算符]

  • <,>,==,!=,>=,<=
  • instanceof:检查是否是类的对象

3.4 逻辑运算符

  • a&b : & 叫逻辑与:当 a 和 b 同时为 true ,则结果为 true, 否则为 false

  • a&&b : && 叫短路与:当 a 和 b 同时为 true ,则结果为 true,否则为 false,如果第一个条件为 false ,后面的条件不再判断

  • a|b : | 叫逻辑或,当 a 和 b ,有一个为 true ,则结果为 true,否则为 false

  • a||b : || 叫短路或,当 a 和 b ,有一个为 true ,则结果为 true,否则为 false,如果第一个条件为 false ,后面的条件不再判断

  • !a : 叫取反,或者非运算,当 a 为 true, 则结果为 false, 当 a 为 false 是,结果为 true

  • a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false

  • 位运算符 [需要二进制基础]

  • 三元运算符

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

3.5 进制

  • 进制介绍
    • 二进制:0,1 ,满 2 进 1.以 0b0B 开头。
    • 十进制:0-9 ,满 10 进 1。
    • 八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。
    • 十六进制:0-9 及 A(10)-F(15),满 16 进 1. 以 0x 0X 开头表示。此处的 A-F 不区分大小写。
  • 进制运算
    • 进制互相转化
    • 原码、补码、反码
      • 正数的原码、反码、补码都是一样的
      • 负数的反码:原符号位不变,其他位取反
      • 负数的补码:反码+1
      • 0的反码补码都是0
      • 计算机运算都是以补码来运算,看运算结果都是看他原码