第二章 Java基础语法

标识符

概念:用来给变量、方法、类、包等命名的字符,简单说就是程序员自己起的名字

命名规则:

  • 标识符可以由字母、数字、下划线(_)和美元符号($)组成,不能含有其他符号。字母可以是任何国家的文字
  • 不能以数字开头
  • 不能是Java关键字
  • 区分大小写

变量

什么是变量?

①变量是内存当中的一块空间。是计算机中存储数据最基本的单元。

②变量三要素:

  • 数据类型(决定空间大小)【int, double, String】
  • 变量名(只要是合法的标识符即可)
  • 变量值(变量中具体存储的数据)

③变量的声明、赋值、访问

  • int i; // 声明一个整数型的变量,起名i
  • i = 100; // 给变量i赋值100
  • System.out.println(i); // 访问i变量:读操作
  • i = 200; // 访问i变量:改操作【给变量i重新赋值200】

变量的作用域:大括号内,除了大括号就不认识了

进制转换

十进制如何转换为二进制?

除2取余,一直到商0为止,最后将所有的余数逆序输出。

二进制的字面量以0b开头

八进制字面量以0开头

十六进制字面量以0x开头

System.out.println(0b1001011); // 75

原码反码补码

byte与bit

①byte(字节)是计算机存储和处理数据的基本单位,通常由8个比特(bit)组成。每个比特(bit)是计算机中最小的存储单位,只能存储0或1两个状态。因此,一个字节(byte)可以存储8个比特(bit)的数据。

②两者之间的关系是,1 byte = 8 bit,即8个比特(bit)组成一个字节(byte)。

③在计算机中,数据通常以字节(byte)为单位进行存储和传输,而比特(bit)则是用来表示数据的最小单位

④1KB = 1024byte

⑤1MB = 1024KB

⑥1GB = 1024MB

⑦1TB = 1024GB

计算机在底层都是采用二进制补码形式表示的。

负数的原码反码补码

①负数的原码运算规则:将绝对值转换为二进制后,最高位改为1。

②-5的原码:10000101

③-5的反码:11111010(原则是:以原码作为参考,符号位不变,其他位取反。)

④-5的补码:11111011(原则是:以反码作为参考,符号位不变,加1)

⑤请问-20的原码反码补码是多少?

请问-128的原码反码补码是多少?10000000;11111111;10000000

补码的补码是源码

一个字节范围-128~127

虽然计算机底层是采用补码的形式存储的,但最终显示给人类的时候是以原码的形式显示的。

计算机底层为什么采用补码

①可以简化电路设计:采用补码形式可以将加减法运算转化为相同的操作,从而简化电路设计。

②解决了0的正负问题:在原码中,0有两个表示,+0和-0,这样会导致计算结果不唯一,而在补码中,0只有一种表示,即全0,可以避免这个问题。

③解决了负数溢出问题:在原码中,负数的表示范围比正数少1,这样在进行减法运算时容易出现负数溢出的情况,而在补码中,负数的表示范围与正数相同,可以避免负数溢出的问题。

④方便计算机进行运算:补码形式可以方便计算机进行加减法运算,而且可以使用相同的电路进行运算,从而提高了计算机的运算效率。

可以计算一下 -3 + 2,看看能不能理解!!!

数据类型

自动类型转换

①在Java中,对于基本数据类型来说,小容量是可以直接赋值给大容量的,这被称为自动类型转换。

等号右边先执行

对于数字类型来说大小关系为:byte < short < int < long < float < double

long b=100,有一个类型转换过程,等号右边先执行,赋值给左边long,小类型转大类型

long z = 2147483648;

编译报错,原因是2147483648被当做int类型处理,而该数字本身已经超出了int最大值,如何修改?

long z = 2147483648L;

强制类型转换

①强制类型转换时,底层二进制是如何变化的?原则:砍掉左侧多余的二进制。

多种数据类型混合运算

①在Java中,多种数据类型混合运算时,各自先转换成容量最大的类型,再做运算

byte a = 100;

int b = 200;

long c = 300L;

long d = a + b + c;

你可以测试一下,如果d变量是int类型则编译器会报错

byte和short混合运算的时候,先各自转换成int再做运算

float:单精度,可以精确到7位小数

double:双精度,可以精确到15位小数

浮点型数据存储原理

①符号位:0表示整数。1表示负数。

②指数位:比如小数0.123E30,其中30就是指数。表示0.123 * 10的30次幂。所以也有把指数位叫做偏移量的。最大偏移量127。

③尾数位:浮点数的小数部分的有效数字。例如:0.00123,那么尾数位存储123对应的二进制。

④从浮点型数据存储原理上可以看到,二进制中的指数位决定了数字呈指数级增大。因此float虽然是4个字节,但却可以表示比long更大的数值。因此float容量比long的容量大。

一旦有浮点型参与运算得出的结果,一定不要使用“==”与其他数字进行“相等比较”

主要原因是:任何浮点型数据,在计算机底层存储的都是它的近似值

①不要这样:

double x = 6.9;

double y = 3.0;

double z = x / y;

if(z == 2.3){

System.out.println("相等");

}

③可以这样:

double x = 6.9;

double y = 3.0;

double z = x / y;

if(z - 2.3 < 0.000001){

System.out.println("相等");

}

字符型char

①占用两个字节,0~65535,和short容量相同,但char可以取更大的整数

②单个字符,使用单引号括起来,不能是多个字符

③可以保存一个汉字

④char c = ‘’; 这是不允许的

⑤char c = ‘\u0000’; 这表示一个空字符,也是char的默认值。\u0000是一个Unicode码。

⑥空字符与空格字符是不同的。空字符表示什么也没有。空格字符表示一个空格。

转义字符

①\t: 表示制表符,相当于按下 Tab 键

②\n: 表示换行符

③\": 表示双引号(")

④\': 表示单引号(')

⑤\\: 表示反斜线(\)本身

char参与的运算

①Java中允许将一个整数赋值给char类型变量,但这个整数会被当做ASCII码值来处理

②需要特别注意的是,这个码值有要求,不能超出char的取值范围

③只要没有超出byte short char的取值范围,是可以直接赋值给byte short char类型变量的

④System.out.println('a' + 1);结果是什么?

⑤char c = 'a' + 1;结果是什么?

⑥以下程序结果是什么?

byte b = 1;

short s = 1;

char c = 1;

short num = b + s + c;类型错误

byte short char混合运算时,各自会先转换成int再做运算!!!!!

运算符

算术运算符

①+ :求和、字符串拼接、正数

②- :相减、负数

③* :乘积

④/ :商(除法)

⑤% :取模(求余数)

1.取模公式:x - x / y * y

⑥++ :自加1

⑦-- :自减1

键盘接收

java.util.Scanner scanner = new java.util.Scanner(System.in);

接收的是第一个空格之前的内容

String s1 = scanner.next();

接收的是第一个换行符之前的内容

String s2 = scanner.nextLine();

二者不共存。\r换行符,让nextLine直接结束了

字节码解读

bipush 10 : 将10这个字面量压入操作数栈当中。

istore_1 :将操作数栈顶元素弹出,然后将其存储到局部变量表的1号槽位上。

iload_1:将局部变量表1号槽位上的数据复制一份,压入操作数栈

iinc 2, 1:将局部变量表的2号槽位上的数据加1.

此处可以写博客

位运算

左移 <<

①它能够将一个二进制数的所有位向左移动指定的位数。左移运算符的运算规则如下:

1. 将二进制数左移n位,相当于将数值乘以2的n次方。

例如,将二进制数0b1011左移2位,即为0b101100,相当于将11乘以2的2次方(即4),得到44。

2. 左移运算符不会改变操作数的符号。左移后,右补0。

无论操作数是正数、负数还是零,左移运算符都只进行位级移动,不会改变符号。

3. 左移运算符会对溢出进行截断。

右移 >>

它能够将一个二进制数的所有位向右移动指定的位数。右移运算符的运算规则如下:

1. 将二进制数右移n位,相当于将数值除以2的n次方。

例如,将二进制数0b101100右移2位,即为0b1011,相当于将44除以2的2次方(即4),得到11。

2. 右移运算符对正数、负数和零的处理方式不同。

对于正数,符号位不变,右移时左补0

对于负数,符号位不变,右移时左补1。

对于零,右移运算符操作后结果仍为零。

3. 右移运算符会对溢出进行截断。

无符号右移 >>>

它能够将一个二进制数的所有位向右移动指定的位数,而不考虑符号位。无符号右移运算符的运算规则如下:

1. 将二进制数右移n位,相当于将数值除以2的n次方,并将最高位填充为0。

2. 任意一个数字经过无符号右移之后,最终结果一定是非负数(0或正整数)

3. 无符号右移运算符对溢出进行截断。

控制语句

switch

switch语句使用注意事项:

switch类型:int、 枚举、 字符串

1. switch 语句适用于判断固定值。if语句适用于判断范围或区间时使用。switch能做的if肯定能做,if能完成的switch不一定能完成。

2. JDK7之前,switch只支持int类型、枚举类型,在JDK7之后,增加了对字符串类型的支持。

3. case 语句中的值必须是字面量,不能是变量。

4. case 语句中的值必须和switch后面的值是同一类型,或者能够相互转换。

5. case可以合并。

6. 在每个 case 分支中要加上 break 语句,以避免case穿透现象。

7. 在 switch 语句中,一般都应该有一个 default 分支,用于处理一些特殊情况,以避免程序出错。 (当然,default语句不写,也不会编译报错。)

8. switch 语句中的 default 分支可以放在 switch 块的任意位置,但是通常建议将 default 分支放在所有 case 分支的最后面。(可读性好)

Java12新特性

Java12中switch引入了新特性,代码变得更加简洁:

switch(x){

case 1 -> System.out.println(1);

case 2 -> System.out.println(2);

default -> System.out.println("default");

}

switch(x){

case 1, 2, 3 -> System.out.println("123");

}

switch(x){

case 1 -> {

System.out.println(1);

System.out.println(1);

}

}

循环语句

②for循环适用于循环次数固定的。while循环适用于循环次数不固定的。

结束特定循环

f1:for(int j = 0; j < 2; j++){

f2:for(int i = 1; i <= 10; i++){

if(i == 5){

break f1;

}

System.out.println("i = " + i);

}

}

f1:for(int j = 0; j < 2; j++){

f2:for(int i = 0; i < 10; i++){

if(i == 5){

continue f1;

}

System.out.println("i = " + i);

}

}

// 这个过程就存在自动类型转换。

long result2 = add(200, 300);

System.out.println(result2);

方法执行过程

public class MethodTest08{
	public static void main(String[] args){
		System.out.println("main begin");
		m1();
		System.out.println("main over");
	}
	
	public static void m1(){
		System.out.println("m1 begin");
		m2();
		System.out.println("m1 over");
	}

	public static void m2(){
		System.out.println("m2 begin");
		m3();
		System.out.println("m2 over");
	}

	public static void m3(){
		System.out.println("m3 begin");
		System.out.println("m3 over");
	}
}

方法

方法重载(overload):编译阶段的一种机制(静态多态)

①什么情况下构成方法重载?

1.在同一个类中

2.方法名相同

3.参数列表不同

  • 类型不同算不同
  • 顺序不同算不同
  • 个数不同算不同

方法递归内存图

IDEA快捷键

常用的IDEA快捷操作

1.alt+insert(新建/新增任何东西)

2.退出任何窗口ESC

3.编写源码的窗口最大化ctrl+shift+F12

4.psvm生成main方法

5.快速生成输出语句sout

6.IDEA会自动保存,自动编译

7.打开Project窗口alt+1

8.查找某个类:敲两次shift,选择classes,输入类名

9.切换选项卡:alt + 左右方向键

10.自动生成变量.var

11.删除一行ctrl+y

12.复制一行ctrl+d

13.在一个类当中查找方法ctrl+F12

14.生成for循环:fori

15.自动生成if语句.if

1.单行注释:ctrl + /

2.多行注释:ctrl + shift + /

3.查看源码:按ctrl别松手,鼠标移动到对应的类名下方,出现下划线,点击过去,可以查看类源码。

4.多行编辑:按alt别松手,鼠标拖动多行,完成多行编辑。

5.怎么快速生成创建对象语句:类名.new.var

6.怎么快速生成if语句:布尔类型值.if

7.怎么快速生成setter和getter方法:alt + insert,然后选择setter and getter生成。

8.怎么快速生成构造方法:alt + insert,然后选择Constructor。

9.在IDEA当中如何自动纠错:将光标移动到错误的位置,按atl + enter。会有提示,根据提示进行纠错。

10.移动代码到上一行:alt + shift + 上/下方向

11.怎么快速重写方法?alt + insert,选择Override....

12.怎么快速重写方法?ctrl + o

13.快速向下转型,并同时生成变量名:变量名.castvar

14.快速查看方法的参数:ctrl + p

15.返回上一步:ctrl + alt + 左方向键。下一步:ctrl + alt + 右方向键。

16.代码格式化:ctrl + alt + L。

17.查看继承结构:ctrl + H

18.自动代码包裹:ctrl + alt + t

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java老狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值