第二章:基本语法

2021320

11:14

关键字(keyword)的定义和特点

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

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

 

标识符(Identifier)

标识符:

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

Ø技巧:凡是自己可以起名字的地方都叫标识符

l定义合法标识符规则:

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

Ø数字不可以开头。

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

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

Ø标识符不能包含空格。

 

lJava中的名称命名规范:

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

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

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

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

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

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

 

Java定义的数据类型

一、变量按照数据类型来分:

基本数据类型:

    整型:byte short int long 存储空间从小到大

    浮点型:float double

    字符型:char

    布尔型:boolean

引用数据类型:

    类(class)(字符串属于这个)

    接口(interface)

    数组(array)

二、变量在类中声明的位置:

成员变量 局部变量

 

byte(1字节=8bit)的取值范围 -128 ~ 127

声明long型变量,必须以“l”或“L”结尾

Java 的浮点型常量默认为double声明float型常量,须后加‘f’或‘F

 

float比long的取值范围还要大,但是精度不如long

 

定义char型变量,通常使用一对'',内部只能写一个字符

表示方式:1.声明一个字符 2.转义字符 3.直接使用Unicode值表示字符型常量

char c1 = '\n';

char c2 = '\u0028';

 

//布尔型

        boolean bb1 = true;

        //bb1 = 0;编译错误,Java的布尔型只能取两个值之一:true、false

 

\\n  可以输出\n

\"  可以输出"

 

char相加,是Unicode编码相加。用""双引号括住才是字符串相加

char c1 = '中';

System.out.println(c1 + 1);//20014

System.out.println('中' + '国');//42282

 

自动类型提升:

当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。(此时的容量大小指的是,表示数的范围的大和小。比如float容量要大于long的容量)

byte、char、short  int  long  float  double

特别的:当byte、char、short三种类型的变量做运算时,结果为int型(包括两个同类型运算)

 

整型常量,运算时默认类型为int型

浮点型常量,运算时默认类型为double型

byte b = 5;

b = b + 3;//编译失败,b+3此时变成了int

 

char c = '';//编译不通过

String c = "";//编译没问题

 

char c = 'a';

int num = 10;

String str = "hello";

System.out.println(c + num + str);//a10hello × 107hello

System.out.println(c + str + num);//ahello10

System.out.println(c + (num + str));//a10hello

System.out.println((c + num) + str);//107hello

System.out.println(str + num + c);//hello10a

 

“+”作为连接运算符还是加运算符,主要看有没有String。有String就是连接运算符,没有就是加号

********按单步的运算结果看 

c + num + str,结果是char和num先相加,再和String连接

 

a的ASCII码是97,A是65

 

String str1 = 4;//编译错误,int无法转换为String

String str1 = "123";

int num1 = (int)str1;//编译错误,无法强转

int num1 = Integer.parseInt(str1);

 

二进制,以0b或0B开头

十进制

八进制,以数字0开头

十六进制,以0x或0X开头,A-F不区分大小写

 

字节的第一位是符号位,0代表正数,1代表负数

原码除符号位取反变成反码,反码+1变成补码

计算机以二进制补码的形式保存所有的整数

Ø正数的原码、反码、补码都相同

Ø负数的补码是其反码+1

例如:

10101011是-43的原码

11010100是-43的反码

11010101是-43的补码

 

十进制转二进制:除2取余的逆

 

char c2 = 97;

System.out.println(c2);//a

char可以用ASCII码赋值,不用加单引号,但是通常不这么用

 

char c4 = '5';

int i2 = c4; //53

int i2 = (int)c4; //53

两种效果一样,char不用强转,可以直接赋值给int

int num1 = 12;

int num2 = 5;

double result6 = (double)num1 / num2; //2.4

double result7 = (double)(num1 / num2); //2.0

// 强转的优先级跟括号一样

 

//取余(取模)运算: %

//结果的符号与被模数的符号相同

//开发中,经常使用%来判断能否被除尽的情况

 

++i 先自增1,后运算

i++ 先运算,后自增1

自增1不会改变变量本身的数据类型

short s1 = 10;

//s1 = s1 + 1;//编译失败

//s1 = (short)(s1 + 1);//正确

s1++;//自增1不会改变变量本身的数据类型

short s2 = s1++; //s1=12,s2=11

 

+=不会改变变量本身的数据类型

 

int n2 = 10;

n2 += (n2++) + (++n2); //n2 = n2 + (n2++) + (++n2) = 10 + 10 + 12

System.out.println(n2); //32

 

比较运算符 

==  !=  <  >  <=  >=  instanceof

比较运算符的结果是boolean类型

        int i = 10;

        int j = 20;

        System.out.println(i == j);//false

        System.out.println(i = j);//20,把j赋值给i,然后输出i

        boolean b1 = true;

        boolean b2 = false;

        System.out.println(b2 == b1);//false

        System.out.println(b2 = b1);//true

 

逻辑运算符

& 逻辑与            && 短路与

| 逻辑或                || 短路或

! 逻辑非                ^ 逻辑异或

逻辑运算符操作的都是boolean类型的变量,结果也都是boolean型的变量

        //区分 & 与 &&

        // 相同点1:& 与 && 的运算结果相同

        // 相同点2:当符号左边是true时,二者都会执行符号右边的运算

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

        // 开发中,推荐使用&&

        //区分:| 与 ||

        // 相同点1:| 与 | 的运算结果相同

        // 相同点2:当符号左边是false时,二者都会执行符号右边的运算

        // 不同点3:当符号左边是true时,|继续执行符号右边的运算,||不再执行符号右边的运算

        // 开发中,推荐使用||

开发中,推荐使用 && 和 ||

 

& 和 | 属于逻辑运算符还是位运算符,取决于操作的数据类型,如果是布尔型就是逻辑运算符,如果是数值就是位运算符

沙 
2 . 4 . 5 运 算 符 : 位 运 算 符 
位 运 算 符 的 细 节 
空 位 补 0 , 被 移 除 的 高 位 丢 弃 , 空 缺 位 补 0 。 
被 移 位 的 二 进 制 最 高 位 是 0 , 右 移 后 , 空 缺 位 补 0 ; 
最 高 位 是 1 , 空 缺 位 补 1 。 
被 移 位 二 进 制 最 高 位 无 论 是 0 或 者 是 1 , 空 缺 位 都 用 0 补 。 
二 进 制 位 进 行 & 运 算 , 只 有 1 & 1 时 结 果 是 1 , 否 则 是 0 ; 
二 进 制 位 进 行 | 运 算 , 只 有 0 丨 0 时 结 果 是 0 , 否 则 是 1 ; 
相 同 二 进 制 位 进 行 ^ 运 算 , 结 果 是 0 : 1 ^ 1 = 0 , 0 ^ 0 = 0 
不 相 同 二 进 制 位 ^ 运 算 结 果 是 1 。 1 ^ 0 = 1 , 0 ^ 1 = 1 
正 数 取 反 , 各 二 进 制 码 按 补 码 各 位 取 反 
负 数 取 反 , 各 二 进 制 码 按 补 码 各 位 取 反 
尚 硅 谷

 

三元运算符可以嵌套使用

如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。

 

如何从键盘获取不同类型的变量:需要使用Scanner类

具体实现步骤:

1. 导包: import java.util.Scanner;

2. Scanner的实例化:Scanner scan = new Scanner(System.in);

3. 调用Scanner类的相关方法,来获取指定类型的变量

        Scanner scan = new Scanner(System.in);

        int num = scan.nextInt();

        //对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串

        next(); 字符串

        nextBoolean();

        nextByte();

        nextDouble();

 

if(b = false){};

这种写法,是先把false赋值给b,然后再用b判断,类似于

System.out.println(b = 4);

先把4赋值给b,然后再输出b

 

int y = 1;

if(y > 2)

    System.out.println(y); //不会输出

    System.out.println("第二条输出"); //正常输出

//有输出,下面第二条输出语句跟if是并列的。if不带大括号,只可以包含一条语句。

        int m = 4;

        int n = 1;

        if(m > 2)

            if(n > 2)

                System.out.println(m + n);

                //System.out.println("atguigu");

        else //就近原则,这个else会跟着离它最近的if,所以上面的if变成了大环境

            System.out.println("m is " + m);

没有大括号的情况下,else会遵循就近原则,跟着离它最近的if

 

获取随机数

        //如何获取一个随机数: 10 - 99

        int value = (int)(Math.random() * 90 + 10); //[0.0,1.0) -- [0.0,90.0) -- [10.0,100.0) -- [10,99]

        //公式:[a,b] : (int)(Math.random() * (b - a + 1) + a)

 

判断字符串是否相等字符串.equals("字符串");

switch-case结构:

1.格式

switch(表达式){

case 常量1:

    执行语句1;

    //break;

case 常量2:

    执行语句2;

    //break;

...

default:

    执行语句n;

    //break;

}

2. 说明:

根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。

  当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止。

break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构

switch结构中的表达式,只能是如下的6种数据类型之一:

    byte 、 short 、 char 、 int 、 枚举类型(JDK5.0新增) 、 String类型(JDK7.0新增)

case之后只能声明常量,不能声明范围

break关键字是可选的

default:相当于if-else结构中的else

    default结构是可选的,而且位置是灵活的。放在其他位置不影响default的作用(兜底),但是如果default放在前面并且没有break的话,default执行之后会继续往下执行其他case,直到碰到break。

case常量的值不可以相同,会编译失败

可以通过不写执行语句和break的方式实现多个case匹配一样的执行语句

switch(表达式){

case 0:

case 1:

case 2:

        执行语句;

        break;

case 3:

case 4:

        执行语句2;

        break;

}

可以用switch-case不写break依次执行的特性计算某一天是当年的第几天(case倒着写,从12写到1,到第几月的时候就把前几个月的时长加上)

        //获取当前时间距离1970-01-01 00:00:00的毫秒数

        long start = System.currentTimeMillis();

        //返回long类型

    for(int j = 2;j <= Math.sqrt(i);j++){}

    //Math.sqrt(double) 开方,参数是double类型,返回也是double类型

       //计算i是否为质数的时候,只需要判断小于等于根号i的整数有没有i的约数就可以了,不用遍历到i

 

break 结束当前循环,默认结束的是包裹此关键字最近的一层循环

continue 结束当次循环

结束指定标识的一层循环结构

    label:for(;;){

        for(;;){

            //break; //默认跳出包裹此关键字最近的一层循环

            //continue;

            break label; //结束label循环

            continue label; //结束当次label循环,进入label的下一次循环

        }

    }

break和continue关键字后面都不能声明执行语句(编译失败:无法访问的语句)

string.toUpperCase(); //将此 String 中的所有字符都转换为大写

string.toLowerCase(); //将此 String 中的所有字符都转换为小写

 

 

结尾

 

使用 Microsoft OneNote 2016 创建。 版权所有:古木苏