学习任何语言,第一步就是学习该门语言的基本数据结构,然后在此基础上进行扩展。

java的基本数据类型有 int, byte, short, long, float, double, boolean, char,使用类型声明变量然后进行赋值,这个跟c类似, 基本数据类型就是CPU可以直接运算的类型。

public class HelloWorld {
    public static void main(String[] args) {
        int m = 1;
        System.out.println(m);
    }
}

接下来分析一下这个值的传递过程

public class HelloWorld {
    public static void main(String[] args) {
        int m = 1;
        int x = m;
        x = 100;
        System.out.println(m);  // 1
        System.out.println(x);  // 100
    }
}

首先我们可以看到,在对m进行初始化是,JVM在内存中为m分配了一个存储单元,然后存储单元保存的数据是1,接下来x进行初始化时,又会重新分配一个存储单元,并将存储单元对应的数据填入,然后对x进行重新赋值,因此x现在的存储单元对应的值就是100

首先我么来看一下整型类型,各整型类型所占内存空间如下:

byte: 1字节,范围:-128~127

short:2字节,范围:-32768~32767

int:4字节,范围:-2147483648 ~ 2147483647

long:8字节,范围:-9223372036854775808 ~ 9223372036854775807

public class HelloWorld {
    public static void main(String[] args) {
        // long y = 2_147_483_648;  // Error:(3, 18) java: 整数太大
        long x = 2_147_483_64;
        long m = 1_000_000_000_000_000L;
        System.out.println(x); // 2147483647
        System.out.println(m); // 1000000000000000
    }
}

例如上述在进行定义长整型时,_是为了更方便看清楚这是多大的数字,就是千位分隔符号“,”,另外我们也可以看出,当这个数字范围在int范围之间时,可以不用加后面的L符号,但超出范围之后,必须加上,否则会报错。

接下来,看一下浮点数 float, double

float:4字节,最大范围是3.4*10^38

double:8字节,最大输出可为1.79*10^308

接下来我们看一下这两种值的赋值情况:

  • float的精度是8位,他只能保留8位有效数值
  • double的精度是17位,他只能保留17位的有效数值
  • float进行赋值时,后面必须跟f否则会报错
  • double后面不需要跟f,如果跟着f就是把float类型数值转化为double类型,因此在用flaot转化为整型的时候,后面会发生变化
  • 而对double来讲,输出格式默认转化位科学技术,并只保留17位有效数值,剩余的会切掉。
public class HelloWorld {
    public static void main(String[] args) {
        // float x = 1.123456789; // Error:(4, 19) java: 不兼容的类型: 从double转换到float可能会有损失
        float x = 1234.123456789f;
        double y1 = 1234.123456789f;
        double y2 = 1234567890.1234567;
        double y3 = 1234567890.1234567890;
        System.out.println(x); // 1234.1234
        System.out.println(y1); // 1234.1234130859375
        System.out.println(y2); // 1.2345678901234567E9
        System.out.println(y3); // 1.2345678901234567E9
    }
}

所以以后想要表示比较大的数值,还是尽量用科学计数把

 

布尔类型

boolean就是true,false或者关系运算的结构,按道理来讲只需要一个字节,但是jvm通常在内部会把boolean表示为4字节整数,java语言对布尔类型存储没有做规定

public class HelloWorld {
    public static void main(String[] args) {
        boolean x = true;
        boolean y1 = false;
        boolean y2 = 1 > 2;
        boolean y3 = 1 * 2 == 2;
        System.out.println(x); // true
        System.out.println(y1); // false
        System.out.println(y2); // false
        System.out.println(y3); // true
    }
}

 

字符类型

字符类型声明 char

char占2个字节,char保存的是unicode字符

注意声明char类型需要用单引号,注意单引号跟双引号的区别,双引号是字符串类型,另外只能放一个字符,否则就会报错

public class HelloWorld {
    public static void main(String[] args) {
        char x = '我';
        // char x1 = '我在中国';  // Error:(4, 19) java: 未结束的字符文字
        char y = 'a';
        //char y1 = 'i love china';  // Error:(6, 19) java: 未结束的字符文字
        System.out.println(x);  // 我
        System.out.println(y);  // a
    }
}

 

 常量

所谓常量就是一旦定义就不能进行更改的值,只需要在定义变量的时候在前面加一个final修饰符

public class HelloWorld {
    public static void main(String[] args) {
        final char x;
        x = 's';
        // x= 'd';  // Error:(5, 9) java: 可能已分配变量x
        System.out.println(x);  // s
    }
}

从例子中也可以看出,常量可以先进行声明,然后再进行赋值,但能且只能赋值一次

 

var 关键字

java提供了var关键字,也就是说你可以不用声明变量的属性,直接var一下,然后编译器就会自动推断出你这个变量的属性

public class HelloWorld {
    public static void main(String[] args) {
        var x = 1;
        System.out.println(x);  // 1
    }
}

变量的作用域,这个就是看你在哪里声明的,js以前还有变量提升,现在也正在逐步废弃,因此这个作用域如果全局声明的就是全局,如果在函数内部,就是函数内部,如果在花括号里面,作用域就是在花括号里,基本所有的编程变量作用域都差不多。

注意基本类型只有上述提到的这些,对于String,数组属于引用类型,后面在谈