java基础语法(上):变量与运算符

发布时间 2024-01-05 15:56:51作者: GradyYoung

关键字与保留字

关键字

定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)

特点:关键字中所有字母都为小写

官方地址:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

说明: untitle.png

说明: untitle.png

保留字

Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字。

gotoconst

标识符(Identifier)

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

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

定义合法标识符规则

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

  2. 数字不可以开头。

  3. 不可以使用关键字和保留字,但能包含关键字和保留字。

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

  5. 标识符不能包含空格。

Java中的名称命名规范

包名:多单词组成时所有字母都小写:xxxyyyzzz

类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz

变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz

常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

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

注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。

变量

变量的概念

内存中的一个存储区域

该区域的数据可以在同一类型范围内不断变化

变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值 。

变量的作用

用于在内存中保存数据

使用变量注意

  1. Java中每个变量必须先声明,后使用

  2. 使用变量名来访问这块区域的数据

  3. 变量的作用域:其定义所在的一对{}

  4. 变量只有在其作用域内才有效

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

声明变量

语法:<数据类型> <变量名称>

例如:int var;

变量的赋值

语法:<变量名称> = <值>

例如:var = 10;

声明和赋值变量

语法: <数据类型> <变量名> = <初始化值>

例如:int var = 10;

连续声明赋值

必须是同类型的变量

例如:int a = 10,b = 20,c = 30;

class VariableTest { 
  public static void main(String[] args){ 
    //变量的定义
    int myAge = 12;
    //变量的使用
    System.out.println(myAge);
    //变量的声明
  	int myNumber;
    //变量的赋值
    myNumber = 1997; 
 	//连续声明赋值
	int a = 10,b = 20,c = 30;
    //变量的使用
    System.out.println(myNumber);
  } 
} 
输出
12
1997

变量的分类-按数据类型

对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。

说明: untitle.png

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

Java各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证java程序的可移植性。

java的整型常量默认为 int 型,声明long型常量须后加lL

java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long

说明: untitle.png

class VariableTest1{ 
  public static void main(String[] args){ 
    byte b1 = 24; 
    byte b2 = -128; 
    //b2=128;   编译不通过,byte类型-128~127
    System.out.println(b1); 
    System.out.println(b2); 
    short s1 = 128; 
    int s2 = 1234; 
  	//声明:long型常量,必须以“l”或“L”结尾
    long s3 = 12345678L;
    System.out.println(s1); 
    System.out.println(s2);
    System.out.println(s3);     
  } 
} 
输出
24
-128
128
1234
12345678

浮点类型:float、double

与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。

浮点型常量有两种表示形式:

十进制数形式:如:5.12 512.0f .512 (必须有小数点)

科学计数法形式:如:5.12e2 512E2 100E-2

float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。

double:双精度,精度是float的两倍。通常采用此类型。

说明: untitle.png

class VariableTest1{
  public static void main(String[] args){
    double s1 = 123.3;
    System.out.println(s1);
    //定义float类型值的末尾要以‘f’或‘F’结尾
    float s2 = 12.3F; 
    System.out.println(s2);     
  } 
}
输出
123.3
12.3

字符类型:char

char 型数据用来表示通常意义上字符2字节

Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符,也因此每个字符占用空间都是(2byte,16bit)

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

  1. 字符常量是用单引号''括起来的单个字符。例如:char c1 = 'a'; char c2= '中'; char c3 = '9';

  2. Java中还允许使用转义字符\来将其后的字符转变为特殊字符型常量。例如:char c3 = ‘\n’; \n表示换行符。

  3. 直接使用 Unicode 值来表示字符型常量:'\uXXXX'。其中,XXXX代表一个十六进制整数。如:\u000a 表示\n

char类型是可以进行运算的。因为它都对应有Unicode(整数)。

class VariableTest1{ 
  public static void main(String[] args){
    char c1 = 'a'; 
    System.out.println(c1); 
    char c2 = '中';
    System.out.println(c2);    
  }
} 
输出a中

unicode、utf8、ascii的关系

  • ASCII,只有英文、数字、符号
    • ASCII 只有127个字符,表示英文字母的大小写、数字和一些符号,但由于其他语言用ASCII 编码表示字节不够,例如:常用中文需要两个字节,且不能和ASCII冲突,中国定制了GB2312编码格式,相同的,其他国家的语言也有属于自己的编码格式
  • Unicode,表示多语言,但是每个字符都是两个字节
    • 由于每个国家的语言都有属于自己的编码格式,在多语言编辑文本中会出现乱码,这样Unicode应运而生,Unicode就是将这些语言统一到一套编码格式中,通常两个字节表示一个字符,而ASCII是一个字节表示一个字符,这样如果你编译的文本是全英文的,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
  • UTF-8,表示多语言,可以根据字符类型编码为1-6字节
    • 为了解决上述问题,又出现了把Unicode编码转化为“可变长编码”UTF-8编码,UTF-8编码将Unicode字符按数字大小编码为1-6个字节,英文字母被编码成一个字节,常用汉字被编码成三个字节,如果你编译的文本是纯英文的,那么用UTF-8就会非常节省空间,并且ASCII码也是UTF-8的一部分。

转义字符

说明: untitle.png

布尔类型:boolean

boolean类型数据只允许取值true和false,无null(1字节)

boolean 类型用来判断逻辑条件,一般用于程序流程控制:

if条件控制语句;

while循环控制语句;

do-while循环控制语句;

for循环控制语句;

变量的分类-按声明的位置的不同

在方法体外,类体内声明的变量称为成员变量。

在方法体内部声明的变量称为局部变量。

说明: untitle.png

二者在初始化值方面的异同:

同:都有生命周期

异:局部变量除形参外,需显式初始化。

基本数据类型转换

前提:boolean类型不能与其它数据类型运算。

自动类型提升

容量小的类型自动转换为容量大的数据类型。数据类型按容 量大小排序为:(容量的大小表示数的范围的大小)

说明: untitle.png

byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。

class VariableTest2{ 
  public static void main(String[] args) { 
    byte b1 = 2;
    int i1 = 129;
    //byte i2 = b1 + i1;  解析不通过
    int i2 = b1 + i1;    //使用容量较大的类型int
    System.out.println(i2);    
  } 
}
输出
131

强制类型转换

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

class VariableTest2{ 
  public static void main(String[] args) { 
    double d1= 12.3;
    int i1 = (int)d1;          //使用强转符(),截断操作损失精度		
    System.out.println(i1);   
  } 
} 
输出
12

字符串类型:String

String不是基本数据类型,属于引用数据类型,声明String变量值的时候,使用一对双引号""

一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。例如:

字符串的定义是public final class String{},所以+拼接字符串并不是在原来的字符串上进行拼接,而是在内存中生成了一个新的字符串,所以如果需要进行频繁的字符串拼接那么使用StringBufferStringBuilder更好。

str = str + "xyz";
intn = 100; 
str = str + n;

String类型可以和八种基本数据类型进行运算,且只能是连接运算,运算结果仍然是String类型。

class VariableTest2{ 
  public static void main(String[] args){ 
    String numberStr = "学号:";
    int number = 1997; 
    String info = numberStr + number; 
    System.out.println(numberStr + number);    
  } 
} 
输出学号:1997

String类型索引、长度

String a = "12345"; 
//获取字符串的长度
int long = a.length(); 
//索引指定位置的字符
char b = a.charAt(0);

获取指定索引的数字,并且用来运算

可以使用字符减去字符0,获得编码的差

String a = "12345"; 
char b = a.charAt(2);
int num = b - '0'; 
输出
3

比较字符串是否相等

String a = "yes"; 
String b = "no";
boolean c = a.equals(b);
System.out.println(c); 
输出
false

进制

所有数字在计算机底层都以二进制形式存在。

二进制(binary):0-1 ,满2进1,以0b0B开头。

十进制(decimal):0-9 ,满10进1。

八进制(octal):0-7 ,满8进1,以数字0开头表示。

十六进制(hex):0-9及A-F,满16进1,以0x0X开头表示,此处的A-F不区分大小写,如:0x21AF + 1 = 0X21B0

二进制转换十进制,以及负数的原码、反码、补码

说明: untitle.png

计算机底层都以补码的方式存储数据!

位、字节、字符、编码

位(Bit):数据存储的最小单位。每个二进制数字0或者1就是1个位

字节(Byte):8个位构成一个字节;即:1 byte(字节)= 8 bit(位)

img

字符(char)aA+*均表示一个字符

编码:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。(其实际是对字符集中字符进行编码,即:每个字符用二进制在计算中表示存储)

  • ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
  • UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
  • Unicode 编码中,中英文都是两个字节。
  • UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
  • UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

算术运算符

说明: untitle.png

赋值运算符

符号:=

=两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。

支持连续赋值。

比较运算符

说明: untitle.png

逻辑运算符

说明: untitle.png

变量的类型全部都是boolean类型的

区分&和&&:

相同点:

1、&&&运算的结果相同

2、当符号左边是true时,都会运行符号右边的运算

不同点:

当符号左边是false时,&符号右边的运算继续执行,&&右边的运算不再执行。

区别 |和||:

相同点:

1、|||运算的结果相同

2、当符号左边是false时,都会执行符号右边的运算

不同点:

当符号左边是true时,|符号右边的运算继续执行,||右边的运算不再执行。

异或

异或^就是运算符两边值相同则为false,不同则为true

位运算符

说明: untitle.png

说明: untitle.png

结论:

1、位运算符操作的都是整形数据

1、<<每向左移一位,相当于*2

2、>>每向右移一位,相当于/2

面试题:

1、最高效的计算2 * 8? 答:2 << 38 << 1

2、int num1 = 10;int num2 = 20; 交换两个变量的值。

class AriTest { 
  public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20; 
    int temp = num1;
    num1 = num2;
    num2 = temp; 
    System.out.println("num1 = " + num1 + ",num2 = " + num2);   
  } 
} 
输出
num1 = 20,num2 = 10

或者使用位运算符^k = m ^ n,m= k ^ n = (m ^ n) ^ n

class AriTest {
  public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20; 
    inttemp = num1 ^ num2; 
    num2 = temp ^ num2; 
    num1 = temp ^ num1;
    System.out.println("num1 = " + num1 + ",num2 = " + num2);     
  }
} 
输出
num1 = 20,num2 = 10

三元运算符

格式:

说明: untitle.png

说明:

1、条件表达式的结果为boolean类型

2、根据条件表达式的结果为ture或false,决定执行表达式1,还是表达式2

如果结果为true,则执行表达式1

如果结果为false,则执行表达式2

3、表达式1和表达式2类型要求是一致的

4、三元运算符可以嵌套使用

5、凡是可以使用三元运算符的地方,都可以改写为if...else...

运算符的优先级

说明: untitle.png

! > & > | > && > ||