数据类型
java是强类型语言,对于每一种数据都定义了明确的数据类型,不同的数据类型在内存中分配不同的空间
数据分类
基本数据类型
数字
- byte 字节
- short 短整形
- int 整形
- long 长整形
- float 单精度浮点
- double 双精度浮点
字符型
- char
布尔型
- boolean
引用数据类型
- 类
- 接口
- 数组
数据类型 | 占用(字节) | 数据范围 | 默认值 |
---|---|---|---|
byte | 1 | -128-127,最大存储数量255 | 0 |
short | 2 | -32768-32767最大存储数据量65535 | 0 |
int | 4 | -2^31-2^31-1 | 0 |
long | 8 | -2^63-2^63-1 | 0L |
char | 2 | -,2^16-1 | u0000 |
float | 4 | -2^31-2^31-1 | 0.0F |
double | 8 | -2^63-2^63-1 | 0.0D |
boolean | 1位 | true和flase | false |
理由: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对象成员