第二章 Java基本语法


一、本章学习架构

第二章学习架构
  以上是博主根据课程在学习Java语言中,参照所记笔记构建得到的思维导图。但是在撰写博文的时候可能会根据实际情况进行适当的增加、删除亦或是修改。希望读者在看思维导图和博文的时候都能收获不同的东西,同时也能够通过反复强调加深记忆。


二、Java语言的数据类型

Java语言的数据类型

  依照上图所示,可以将Java的数据类型大类分为两类:基本数据类型(Primitive Type)引用数据类型(Reference Type),其中基本数据类型又包括了:数值型、字符型和布尔型;引用数据类型又包括了:类、接口和数组。


1、整数类型(Byte、Short、Int、Long)

  • 字节型(Byte):所占空间为1个字节(1 byte = 8 bit),一般用于表示0~255(0 ~ 28 -1)的无符号整数。(即不能表示负数)
  • 短整型(Short):所占空间为2个字节,一般用于表示范围在-32768~32767(-215 ~ 215 - 1)的整数
  • 整型(Int):所占空间为4个字节,一般用于表示范围在-32768~32767(-215 ~ 215 - 1)的整数
  • 长整型(Long):所占空间为4个字节,一般用于表示范围在-2147483648~2147483647(-2-31 ~ 231 - 1)的整数在声明long型变量的时候,需要以 “l” 或者 “L” 结尾。如果不加,则使用int类型来存原来的数。

2、浮点类型(Float、Double)

  • 单精度浮点数(Float):所占空间为4个字节,一般用于表示范围在- 3.4 × 10-38 ~ 3.4 × 1038浮点数在声明float型变量的时候,需要以 “f” 或者 “F” 结尾。如果不加,则使用double类型来存原来的数。
  • 双精度浮点数(Double):所占空间为8个字节,一般用于表示范围在- 1.7 × 10-308 ~ 1.7 × 10308浮点数

  注意:整型常量默认为int型,浮点型常量默认为double型。

3、字符型(Char):所占空间为1个字节,一般用于表示一个字符初始化时通常要加一对单引号,且里面只能含有一个字符。
4、布尔型(Boolean):所占空间为1个字节,一般用于表示“true” 和 “false”
5、类(Class):由用户定义的引用数据类型。每个类中包含数据说明以及一组操作数据亦或是传递消息的函数。且我们称类的实例为对象。(该内容将会在第四章进行详细讲解)
6、字符串(String):由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。
字符串的一些注意事项:
  (1)string类型的数据可以和其他8种数据类型的数据进行运算,且只能是连接运算
  (2)string类型的数据要想强制转换为int,需要使用Integer.parseInt(x),转换为其他数据类型的代码如下所示:

package day9_13;

import org.junit.Test;

public class test {
	public static String getType(Object o) { // 获取变量类型方法
        return o.getClass().toString(); // getClass()方法
    }
    
    //String类型数据转换
    @Test
    public void stringChange(){
        String str = "134";

        //1.转换为int型数据
        int str1 = Integer.valueOf(str);
        System.out.println("数据类型为:" + getType(str1) + ",数值为:" + str1);

        //2.转换为short型数据
        short str2 = Short.parseShort(str);
        System.out.println("数据类型为:" + getType(str2) + ",数值为:" + str2);

        //3.转换为字符型数组
        char[] str3 = str.toCharArray();
        System.out.print("数据类型为:" + getType(str3) + ",数值为:");
        for (int i = 0; i < str3.length;i++){
            System.out.print(str3[i]);
        }
        System.out.println();

        //4.转换为float型数据
        float str4 = Float.parseFloat(str);
        System.out.println("数据类型为:" + getType(str4) + ",数值为:" + str4);

        //5.转换为double型数据
        double str5 = Double.parseDouble(str);
        System.out.println("数据类型为:" + getType(str5) + ",数值为:" + str5);

        //6.转换为long型数据
        long str6 = Long.parseLong(str);
        System.out.println("数据类型为:" + getType(str6) + ",数值为:" + str6);

    }
}

结果验证:
String转换为其他类型数据
  (3)String利用“==”进行比较的时候,比较的String在堆空间中所存的地址是否相同,此时可以通过比较String的值是否相同(因为String的值如果相同,其在堆空间中所指的地址是一样的),但如果用new的方式造的话,地址则是不同的。

package day9_13;

import org.junit.Test;

public class test {
    @Test
    public void stringAddress(){
        String str1 = "123";
        String str2 = "123";
        String str3 = new String("123");
        System.out.println("str1和str2地址是否相等:" + (str1 == str2));
        System.out.println("str1和str3地址是否相等:" + (str1 == str3));
    }
}

结果验证:
  String地址比较

7、接口(Interface):是一系列方法的声明,及一些方法特征的集合。(该内容将会在第四章进行详细讲解)
8、数组(Array):是有序的元素序列(该内容将会在第三章进行详细讲解)


9、自动类型提升:当容量小的数据类型的变量与容量大的数据类型的变量进行运算时,结果会自动提升为容量大的数据类型。对于以上的7种基本数据类型而言(不包含布尔型),其自动类型提升关系如下所示:
byte、char、short → int → long → float → double
10、强制类型转换:自动类型提升的逆运算。分为显式强制类型转换和隐式强制类型转换。两者的区别在于:显式强制类型转换需要使用强制转换类型符号,而隐式强制类型转换不需要使用强制转换符,其强制转换发生在赋值表达式和有返回值的函数调用表达式中。(注意:强制类型转换可能会导致数据精度损失。)

package day9_13;

import org.junit.Test;

public class test {
    public static String getType(Object o) { // 获取变量类型方法
        return o.getClass().toString(); // getClass()方法
    }
    
    //强制类型转换
    @Test
    public void typeChange(){
        //1.显式强制类型转换
        double num = 1.5; //声明一个double类型的数据
        int num1 = (int)num;//将double类型元素显式强制转换为int类型(需要加强制转换符,否则会报错)
        System.out.println("数据类型为:" + getType(num1) + ",数值为:" + num1);//打印输出验证


        //2.隐式强制类型转换
        float num2 = 1.23f; //声明一个float类型的数据(记得结尾加f)
        double num3 = num2;//将float类型元素隐式强制转换为double类型(不需要加强制转换符,不会报错)
        System.out.println("数据类型为:" + getType(num3) + ",数值为:" + num3);//打印输出验证
    }
}

结果验证:
显式、隐式数据类型转换


三、Java语言的运算符

1、算术运算符
  包含了:+(正),-(负),+(加),-(减),*(乘),/(除),前++,后++,前–,后–,%(取余),+(连接),共12种运算符。
  说明:这里只强调一些特殊的运算符,数学中运用的常见运算符在这里不进行说明。(例如:加减乘除)

  (1)前++(++num)、后++(num++):(对于减法同样适用) 前++表示先自增1,然后再运算;后++表示先运算,然后再自增1。且此过程中,不会改变原始变量的数据类型。

package day9_13;

import org.junit.Test;

public class test {
    @Test
    public void plusForward(){
        int num = 1;
        int num1 = ++num; //前++,最后num1的结果为2;
        int num2 = num++; //后++,最后num2的结果也为2;但num的最后结果为3

        System.out.println("num1的结果为:" + num1);
        System.out.println("num2的结果为:" + num2);
        System.out.println("num的结果为:" + num);
    }
}

  结果验证:
在这里插入图片描述

  (2)连接符“+”只能使用在String类型和其他数据类型变量之间。
  (3)取余运算(%):取余运算的结果的符号与被模数的符号相同


2、比较运算符
  包含:==(判断是否相等)、!=(判断是否不等)、>(判断是否大于)、<(判断是否小于)、>=(判断是否大于且等于)、<=(判断是否小于且等于)、instanceof(测试一个对象是否是一个类的实例),共7种比较运算符。

  强调:“==”用于比较基本数据类型变量时,是比较两个变量保存的数据是否相等(不一定类型要相同);比较引用数据类型变量时,比较两个变量的地址值是否相等,即两个变量是否指向同一个对象。


3、逻辑运算符
  包含:&(逻辑与)、&&(短路与)、|(逻辑或)、||(短路或)、!(取非)、^(取异或),共6种运算符。
  (1)& 和 &&
      相同点:1、& 和 &&的运算结果相同
          2、当符号左边是true时,二者都会执行符号右边的运算
      不同点:当符号左边是false时,“&”继续执行符号右边的运算,“&&”不再执行符号右边的运算

  (2)| 和 ||
      相同点:1、| 和 ||的运算结果相同
          2、当符号左边是false时,二者都会执行符号右边的运算
      不同点:当符号左边是true时,“|”继续执行符号右边的运算,“||”不再执行符号右边的运算

package day9_13;

import org.junit.Test;

public class test {
    @Test
    public void logicOperator(){
        int num = 0;
        int num1 = 0;

        //逻辑与:由于是逻辑与,因此前后表达式都会得到执行。
        if((num++ != 1) & (num1++ != 1));
        System.out.println("第一个if过后num的值为:" + num);
        System.out.println("第一个if过后num1的值为:" + num1);

        //短路与:由于是短路与,且前面一个表达式所得结果为false,因此第二个表达式不会执行。
        if((num++ != 1) && (num1++ != 1));
        System.out.println("第二个if过后num的值为:" + num);
        System.out.println("第二个if过后num1的值为:" + num1);

        //逻辑或:由于是逻辑或,因此前后表达式都会得到执行。
        if((num++ != 1) | (num1++ != 1));
        System.out.println("第三个if过后num的值为:" + num);
        System.out.println("第三个if过后num1的值为:" + num1);

        //短路或:由于是短路或,且前面一个表达式所得结果为true,因此第二个表达式不会执行。
        if((num++ != 1) || (num1++ != 1));
        System.out.println("第四个if过后num的值为:" + num);
        System.out.println("第四个if过后num1的值为:" + num1);
    }
}

  结果验证:
逻辑与短路
  通过以上可知,短路与/短路或的效率相对逻辑与/逻辑或而言更高,因此开发中更推荐使用短路与/短路或。


4、位运算符 (具体内容会根据需要补充在后期的《计算机组成原理》解读中)
  包含:>>(算术右移)、<<(算术左移)、>>>(逻辑右移)、<<<(逻辑左移)、&(按位与)、|(按位或)、^(按位异或)、~(按位取反),共8种运算符。
  强调:~表示按位取反,在计算过程中应包含符号位一起取反。



四、程序流程控制

  流程控制方式采用结构化程序设计中规定的三种基本流程结构:顺序结构、分支结构、循环结构。

1、顺序结构:按照解决问题的顺序执行相应的语句,它的执行顺序是自上而下,依次执行,是最简单、最常用的程序结构。

2、分支结构:分支结构在执行过程中,是参照一定的条件选择执行路径,而不是严格按照语句出现的顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。 分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。1
(1)Switch - Case 语句
① 执行方法:一旦匹配成功,则进入相应的case语句结构中,调用其执行语句。当调用完执行语句之后,则仍可以向下执行其他 case 结构中的执行语句,直到遇到break关键字,或直到执行到switch - case结构末尾为止。
② 说明:<1> switch 结构中的表达式,只能是6种数据类型之一:byte、short、char、int、枚举类型、String类型。
     <2> case之后只能声明常量。
     <3> 在同等条件(不太复杂)下,switch-case的执行效率相对于if-else执行效率而言更高。

3、循环结构:指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。
(1)结构:循环语句的四个组成部分(① 初始化部分、② 循环条件部分、③ 循环体部分、④ 迭代部分),其具体逻辑结构如下图所示:循环逻辑结构图
(2)for 循环(此处的①、②、③、④对应于循环语句的四个组成部分)
结构:for (① ; ② ; ④) { ③ }
  这里以遍历打印1-100作为for循环语句编写的例子:

for(int i = 1; i <= 100; i++){
	System.out.println(i);
}

(3)while 循环(此处的①、②、③、④对应于循环语句的四个组成部分)
结构:①
   while (②){
     内容
   }
  这里以遍历打印1-100作为while循环语句编写的例子:

int i = 1;
while(i <= 100){
	System.out.println(i);
	i++;
}

(4)do - while 循环(此处的①、②、③、④对应于循环语句的四个组成部分)
结构:①
   do {
     ③;
     ④;
   } while();
  这里以遍历打印1-100作为do - while循环语句编写的例子:

int i = 1;
do{
	System.out.println(i);
	i++;
}while(i <= 100)

(5)break 和 continue的异同
相同点:break 和 continue关键字之后不能声明执行语句。
不同点:break:作为计算机编程语言的保留字,大多数情况下用于终止所在层的循环,可以用于在执行完一个case(分支)后
        立即跳出当前的当前的switch结构。在某些程序调试过程中则使用break设置断点。
    continue:表示结束本次循环,进行下一次循环,但却不终止整个循环的执行。

注意:① while 循环要小心不要迭代条件,一旦丢了,就可能导致死循环;
   ② for 循环和 while 循环是可以相互转换的。
   ③ do-while循环至少会执行一次循环体。


  1. 参考自:https://baike.baidu.com/item/%E5%88%86%E6%94%AF%E7%BB%93%E6%9E%84 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值