数据类型

java是强类型语言,对于每一种数据都定义了明确的数据类型,不同的数据类型在内存中分配不同的空间

数据分类

基本数据类型

数字

  • byte 字节
  • short 短整形
  • int 整形
  • long 长整形
  • float 单精度浮点
  • double 双精度浮点

字符型

  • char

布尔型

  • boolean

引用数据类型

  • 接口
  • 数组
数据类型占用(字节)数据范围默认值
byte1-128-127,最大存储数量2550
short2-32768-32767最大存储数据量655350
int4-2^31-2^31-10
long8-2^63-2^63-10L
char2-,2^16-1u0000
float4-2^31-2^31-10.0F
double8-2^63-2^63-10.0D
boolean1位true和flasefalse

理由:boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中按位算,仅需1位(bit)即可存储,位是计算机最小的存储单位。在传智播客java基础班中也有有此理由(复习时所参考的视频)。

2、1个字节
理由:虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。

4个字节

在java虚拟机规范中一书描述,虽然定义了boolean这种数据类型,但只对它提供非常有限的支持.在java虚拟机中没有任何提供布尔值专用的字节码指令,java语言表达式所操作的boolean值,在编译之后都是用java虚拟机中的int数据类型来代替,二boolean数组将会被变异成java虚拟机的byte数组,每个元素boolean单独占用是4个字节,在数组中是一个字节

java的默认整数字面量是int类型比如Sytstem.out.printfln(11);

默认小数字面量是double类型

浮点类型的字面量默认是double类型 ,若要申明一个常量为float型则需要在常量后面加上f或者F,double后面的d或者D可以省略

char有三种表示形式,直接使用单个字符来指定字符串常量如‘a’

直接作为十进制数数值来使用,但是数据范围 在0-65535之间,格式如97

但大于出来的值依然是ascii码表对应的符号如,97出来是字符a

public class Main {
    public static void main(String[] args) {
        final int a=0;
        System.out.println("hello world");
        double c=1.2D;
        float d=2.2F;
        char e=97;
        System.out.println(e);
    }
}

基本数据类型转换

在运算的时候可能会发生数据类型不匹配的情况

规则

不能直接把一个大的数据类型给一个小的数据类型

可以把一个小的数据类型赋值给大的数据类型

强制类型转换

把大的范围的数值类型或变量赋值给一个小范围类型变量时,此时系统不能完成自动转换,需要加上强制转换符

但这样操作可能造成数据精度降低或者溢出,使用的时候要格外注意

public class Main {
    public static void main(String[] args) {
        int a=10;
        byte c;
        c=(byte)a;
        System.out.println(c);
    }
}

自动类型提升

当算是表达式包含多个基本数据类型boolean除外的值时

整个算数表达式的数据类型讲在数据运算时自动进行类型提升所有byte,short,char类型被自动提升到int类型

整个表达式最终结果类型被提升到表达式中的最高类型

小的数据类型与大的数据类型进行运算时,会自动提升为大的数据类型

public class Main {
    public static void main(String[] args) {
        int a=10;
        byte c=4;
        int b=c+a;

        System.out.println(b);
    }
}

方法与数组

方法

方法的完整形式

[修饰符]返回类型 方法名(形参){

方法体

return值

}

方法的重载

在同一个类中允许方法的名称相同,但是方法的俩个参数必须不同,

方法的重载解决了功能相同参数不同,就不需要定义多个方法名称了

注意

  • 方法名称必须相同
  • 参数列表必须不同
  • 方法的返回类型可以相同也可以不相同
  • 仅仅返回类型不同不足以成为方法的重载

数组

概念

它是把相同的数据类型有序的组成在一起,我们称这样的集合为数组

数组初始化有俩种

public class Main {
    public static void main(String[] args) {
        //静态初始化
        int a[]=new int []{1,2,3,45};
        //这里可以进行省略,java在编译的时候会做一个类型的推导,自动编译为上面的形式
        int b[]={1,2,3,45};
        //动态初始化
        //一开始不知道要存哪些数据,先定义一个大小
        int c[]=new int[4];//默认全是0
        c[0]=1;
        c[1]=2;
    }
}

可变参数

public class Main {
    public static void main(String[] args) {
        int sum=sum(1,3,5,76,3,123);
        System.out.println(sum);
    }
    public static int sum(int... nums){
        int sum=0;
        for (int value:nums) {
            sum+=value;
        }
        return sum;
    }
}

作用域

变量的作用域是定义好变量之后的生效范围,

在创建变量的大括号中生效.超过了大括号就不生效了,在方法内部定义的变量,和外界没有任何关系

面向对象

面向对象三大特征

继承,封装,多态

jvm内存划分

虚拟机栈

执行引擎每调用一个函数时,就为这个函数创建一个栈帧,并加入虚拟机栈

每个函数从执行到执行结束,其实是对应一个战帧的入栈和出栈,声明每的变量都是存到栈中的

被线程所共享的一块区域,在虚拟机启动时创建,所有的对象以及实例都在堆上分配

使用new关键字,表示在堆中开辟一块存储空间

方法区

又叫静态区,存放的是字节码和static变量,方法去中包含的都是在程序中永远唯一的元素

先进后出,没执行一个方法就会为该方法创建一个栈帧,在执行时,让战帧进行入栈操作当方法执行完毕时,战帧就会出栈

程序计数器

每个线程有计数器记录到当前执行到哪个指令

可以把它看成是当前线程执行字节码行号指示器

本地方法区

本地方法栈与虚拟机栈所发挥的作用很相似,他们的区别在于虚拟机栈位执行java代码方法服务,而本地方法是native方法服务

static

static修饰的内容随着类的加载而加载,优先于对象的存在,static修饰的成员你变了被该类型的所有对象共享,可以直接使用当前类名访问static对象成员

Last modification:March 29, 2021
如果觉得我的文章对你有用,请随意赞赏