Java第2章作业:Java语言基础

第1题:Java包含哪些数据类型?请举例说明

概述

Java中的数据类型分为两类,分别是基本数据类型(如整型、浮点型、字符类型、布尔类型)和复合数据类型(类、数组)。

一、基本数据类型

1 整数类型:
类型位数范围举例
byte8-27~27-1byte a=3;
short16-215~215-1short a=5;
int32-231~231-1int a=10;
long64-263~263-1long a=115;

在Java中,两个整数相加,结果的数据类型有两种情况:

  • 若两个数的类型均为byte、short、int中的一种,则结果是int类型
  • 若有一个整数为long,那么结果是long类型。
2 浮点类型
  • 单精度占32位;
  • 双精度占64位。

有十进制法与科学计数法两种表示方法。

  1. 十进制:由数字与小数点组成,必须有小数点。
  2. 科学计数法:如1e3(1000.0),3E3(3000.0),e(E)之前必须有数字,并且e(E)之后的数字必须是整数。

单精度数float)的定义方法:

float a=2.0; //报错 Type mismatch: cannot convert from double to float
float a=2f; // 正常执行
float a=2F; // 同上
float a=2e3; // 报错 Type mismatch: cannot convert from double to float
float a=2e3f; // 正常执行

上面第一行命令之所以会报错,原因是在Java中数字默认都是双精度数,并且当将高级数据类型转换为低级数据类型时(这里是double转为float),需要强制转换类型,否则无法转换。

双精度数double)的定义方法:

double a=2.0; //不报错 
double a=2d; // 正常执行
double a=2D; // 同上

第一行代码中换成double a=2也可以运行,因为这里使用了自动类型转换,从int转换为了double

3 字符类型

字符型占2个字节,16位;单个字符用单引号括起来。

字符串常量:用双引号括起来表示字符串常量;
字符串变量:使用String类来定义字符串变量,如String a="Hello",其中"Hello"是一个String对象,若改成char [] a="Hello"则会报错,因为char[]的类型是字符数组,而"Hello"是String对象
字符数组的定义方式为:

char[] a={'H','e','l','l','o'};
System.out.println(a); // Hello
4 布尔类型

有且只有两个值:true与false
定义方式为:boolean c=true; boolean c=false;

所有的数字均不与布尔值对应!这一点与C、C++很不同。
若写成boolean c=1;则会报错,报错信息为Type mismatch: cannot convert from int to boolean

二、复合数据类型

主要有3种

  • 类(class)
  • 数组
  • 接口(interface)

自定义的类可以看做一种数据类型,这一点与C++是一致的;
数组的定义方式为int[] a;(还有另一种定义方式,但推荐使用这种方式),即将数据类型与[]紧挨着放在一起,这样就组成了一种复合数据类型。

第2题:Java基本数据类型转换包含哪两类?请举例说明

包含自动类型转换强制类型转换两类。

首先需要知道数据类型的优先级:

byte, short, char, int, long, float, double------------------------------------------->
  1. 自动类型转换
    指的是数据类型从低级转换为高级,如short类型的变量a与float类型的变量b进行运算,则需要先将a的数据类型提升为float,得到的结果就是float类型。
    举例如下:

    short a=3;
    float b=4;
    System.out.println(a+b); 
    // 结果为7.0,表明在运算之前a的数据类型已经转换为了float
    
  2. 强制类型转换
    因为当数据类型从高级向低级转换时可能会损失精度(高级数据类型字节多,表示的数的范围大),所以当数据类型从高级向低级转换需要进行强制类型转换。
    转换方式type a=(type)b,type为基本数据类型中的一种。
    举例如下:

    float b=4f;
    int c=b; // 会报错,因为b的数据类型比c的级别高,无法使用自动数据类型转换
    int c=(int)b; // 使用了强制数据类型转换
    System.out.println(c); 
    
    

第3题:为什么需要包装类

1 包装类具有许多非常有用的静态属性与静态方法
  1. Integer.MAX_VALUE, Integer.MIN_VALUE,这两个属性表示int数据类型可以表示的最大值与最小值,可以用来防止数据溢出。
  2. 包装类有一些静态方法,可以实现不同数据类型的转换。如int a=Integer.parseInt("234");可以将字符串234转换为int类型的值234.
2 包装类是为了保持面向对象的完整性

因为Java是一门纯面向对象的语言,而基本数据类型不是类,不具备对象的特性,因此需要对基本数据类型进行扩充出包装类,以保证面向对象的完整性。

第4题:int与Integer有什么区别,它们之间的相互转化是怎样的?

int是基本数据类型,Integer是与int相对应的包装类。

1 int转化为Integer(3种方式):

Integer varInteger1 = new Integer(100); // 此种方式在JDK9之后已经弃用,但仍可以使用。The constructor Integer(int) is deprecated since version 9
Integer varInteger2 = Integer.valueOf(200);
Integer varInteger3 = 300 ;   // 自动装箱,很方便

2 Integer转化为int(2种方式):

int varInt1 =  varInteger1.intValue();
int varInt2 =  varInteger2; // 自动拆箱,很方便

第5题:逻辑运算符&和&&的区别是什么?逻辑运算符&与位运算符&的区别是什么?请分别举例说明

1 逻辑运算符&和&&的区别是什么?

这两个运算符都执行逻辑“与”运算,&&更加高效,若位于&&前面的表达式为false,则不会判断&&后面的表达式是否为truefalse

若使用a==b && b==c,则会先判断a==b,若a==b返回false,则不会判断b==c,整个表达式直接返回false

若使用a==b & b==c,则会先判断a==b,然后判断b==c,若第一个判断(a==b)是false,还会继续判断b==c,然后返回false

举例:

public class Test{
    public static void main(String[] args){
        int a=2;
        if(a==3 & (++a)==3){
        }
        System.out.println("Using &, a is "+a);

        int b=2;
        if(b==3 && (++b)==3){
        }
        System.out.println("Using &&, b is "+b);
    }
}
输出为:
Using &, a is 3
Using &&, b is 2

可以看到,使用&时,a进行了自增运算,这是因为即使a==3不成立,表达式(++a)==3)也会执行并判断;
而使用&&时由于b==3不成立,所以没有执行&&后面的语句(++b)==3),因此b没有进行自增运算。

2 逻辑运算符&与位运算符&的区别是什么?

逻辑运算符&:执行的是逻辑“与”运算,该运算符两边只能是布尔值(boolean类型),不能是数字;

位运算符&:执行的是位与运算,该运算符两边是二进制的数字(若数字是十进制则会自动转化为二进制在进行位运算)。

位与运算的规则:全1为1,否则为0。

位运算符&举例:

public class Test{
    public static void main(String[] args){
        int a=Integer.parseInt("110",2); // 将二进制数110转化成十进制数,a是6
        int b=Integer.parseInt("010",2); // 将二进制数010转化成十进制数,b是2
        int c=a&b; // 110&010 = 010
        System.out.println(c); // 010,转化成十进制就是2
    }
}

第6题:Java语言中可以采用什么语句跳出多重循环?请举例说明

可以采用break lab来跳出多重循环,下面分别讲一下breakbreak lab的用法。

用法:
  • break; 单个break语句用来跳出离break语句最近的一层循环。
  • break lab; lab是用户自定义的标号,放在for循环前面,然后使用break lab就可以跳出lab标识的那一层循环。

break用法如下:

public class Test{
    public static void main(String[] args){
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(j==2){
                    System.out.println("***** break happens");
                    break;
                }
            }
        }
    }
}
输出结果:
***** break happens
***** break happens
***** break happens

会有3次break发生,因为break只跳出了内层循环,外层循环还在继续运行。

break lab用法如下:

public class Test{
    public static void main(String[] args){
        lab: //lab(可以换成其他的标识)要放在需要跳出的循环的前面,并且需要冒号分隔。
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(j==2){
                    System.out.println("***** break happens");
                    break lab; // break后面的标识必须与for循环前面的标识一致
                }
            }
        }
    }
}
输出结果:
***** break happens

仅会输出一次,因为break跳出了最外层循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值