数据类型:
基本数据类型:
数值型:
1)、整数类型: byte(1字节) 、short(2字节)、int(4字节)、long(8字节)注意:整型数据默认为int类型 定义为long类型时末尾需加“L”或“l”不添加不会报错
long l1 = 12344L;2)、浮点类型: float(4字节)、double(8字节)
注意:浮点型默认为double类型,定义float类型是需在末尾添加“F”或“f”不添加时报错
float f1 = 12.3F;字符型: char(2字节)
注意: 每个char类型变量只能存放一个字母(如一个英文字母、一个汉字、一个日文等),用单引号
括起,若要表示多个字母,则应用String类型,用双引号括起
char c1 = ‘c’;布尔类型: boolean
注意: boolean类型只能取值true或false ,不能取值null
引用数据类型:
类: class (字符串属于类)
本质上,一个类就是程序员定义的类型,并且,类是一种引用数据类型,表面上看,对象引用变量中似乎存放的一个对象,但事实上,它只是包含了该对象的引用接口: interface
数组:
Java中,数组被看做对象,一个数组变量实际上是一个包含数组引用的变量,
数组既可以存储基本数据类型值,也可以存储对象
(详见Java Array)字符串:String 类 也是一种常用的数据类型
注意:字符串与基本数据类型之间只能进行连接运算:+ 将两者拼接在一起 运算结果仍是一个字符串
String nation = "what is your name?";
String nation1 = nation + m1 // "what is your name?57"
类型转换
类型转换是一种将一种数据类型的值转换为另一种数据类型的操作
自动类型转换:范围小的类型数据与范围大的类型数据之间运算得到的数据类型取大范围的类型
总是可以将一个数值赋给支持更大数值范围类型的变量,若不进行类型转换,就不能把一个值赋给范围较小类型的变量
char、byte、short ===> int ===> long ===> float ===> double
short s = 1;
int i;
i = s; // 自动转换
char、byte、short三者之间运算得到的结果默认取int类型
强制类型转换:范围大类型数据的转换为范围小的类型数据
long l1 = 12345L;
int m1 = (int)l1; // 57
注意: 如果要将一个值赋给范围较小类型的变量,若在这种情况下没有使用强制类型转换,就会出现编译错误,强制类型转换的问题:容易损失精度
变量及其作用域
每个变量都代表一个存储值得内存位置,声明一个变量即告诉编译器这个变量存放什么类型的值
每个变量都有其作用范围,并且,一个变量在可以使用前,必须被声明和初始化
基本类型变量与引用变量
基本类型变量:
即其数据类型为基本数据类型,其存储在内存的栈空间中,对应内存中存储的是基本类型的值
将一个变量赋值给另一个变量时:
对于基本类型变量,就是将一个变量的实际值赋给另一个变量,之后改变其中任何一个变量的值,都不会影
响到另一个变量的实际值
int a = 2;
int b = 3;
System.out.println("a: " + a); // 2
System.out.println("b: " + b); // 3
b = a;
System.out.println("a: " + a); // 2
System.out.println("b: " + b); // 2
a = 4;
System.out.println("a: " + a); // 4
System.out.println("b: " + b); // 2
包装类类型
基本数据类型不是一个对象,可以使用包装类来包装成一个对象
/**
* byte --> Byte
* short --> Short
* int --> Integer
* long --> Long
* float --> Float
* double --> Double
* boolean --> Boolean
* char --> Character
*/
Integer i = new Integer("123");
Integer i = new Integer(123);
注意: 包装类没有无参构造器,所有包装类实例都是不可变的,一旦创建,其内部值就不能再改变
将基本类型值转换为包装类对象的过程称为装箱,相反的转换过程称为开箱,Java允许基本类型和包装类型之间自动转换(自动装箱和自动开箱)
// 自动装箱
Integer[] intArray = {1, 2, 3};
Integer x1 = 3 + new Integer(5);
Integer x2 = 3;
// 自动开箱
System.out.println(intArray[0] + intArray[1] + intArray[2]); // 6
int x4 = new Integer(4);
int x5 = new Integer(3) + new Integer(4);
引用类型变量:
对应内存所存储的值是一个引用,即对象的存储地址,它存在于栈空间中,实际对象存储于堆空间中
对于引用类型变量,就是将一个变量的引用赋给另一个变量,之后二者都指向同一个对象,
故再改变其中意一个变量的属性值,另一个变量的相应属性值也会改变
public class TestCircle {
public static void main(String[] args) {
Circle circle1 = new Circle();
circle1.radius = 1;
Circle circle2 = new Circle();
circle2.radius = 3;
System.out.println("Circle1's radius: " + circle1.radius); // 1.0
System.out.println("Circle2's radius: " + circle2.radius); // 3.0
circle2 = circle1;
System.out.println("Circle1's radius: " + circle1.radius); // 1.0
System.out.println("Circle2's radius: " + circle2.radius); // 1.0
circle2.radius = 9;
System.out.println("Circle1's radius: " + circle1.radius); // 9.0
System.out.println("Circle2's radius: " + circle2.radius); // 9.0
}
}
class Circle {
double radius;
}
不同数据类型变量的默认值
基本数据类型:
byte、short、int、long: 默认值为 0
float、double: 默认值为 0.0
char: 默认值为 ‘\u0000’
boolean: 默认值为 false
引用数据类型:
声明引用数据类型变量而未初始化时,应对其进行显示赋值为null
注意: Java中只有在类中的成员变量没有手动赋值进行初始化时,才会对其自动初始化,赋予其对应类型的默认值,而对于方法中的局部变量不会自动赋默认值,因此,局部变量必须在使用前声明并初始化
局部变量
方法中定义的变量称为局部变量,其作用范围(作用域)从变量声明的地方开始,直到包含该变量的块结束为止,并且其在使用前必须进行声明和赋值
方法的参数也是一个局部变量,一个方法的作用域涵盖整个方法
for等循环体中声明的变量其作用域仅限于从声明处到其循环体结束,但在其头部(即小括号内)声明的局部变量作用域为整个循环体
可以在一个方法中的不同快中声明同名局部变量,但不能再嵌套快中或同一块中两次声明同一局部变量
// 这是正确的:
for (int i = 0; i < 9; i++) { ... }
for (int i = 0; i < 8; i++) { ... }
// 这是错误的:
public static void main(String[] args) {
int i = 1;
for (int i = 0; i < 9; i++) { ... }
}
类变量(数据域)
一个类的实例变量和静态变量被称为类变量或数据域
无论在何处声明,类变量的作用域都是整个类,类变量和方法可以在类以任意顺序出现,但是当一个类变量是基于另一个数据域的引用进行初始化时,则必须顺序出现(即被引用的先声明)
public class Test {
// 这种情况下first变量必须先与last变量声明
private int first;
private int last = first + 1;
}
类变量只能声明一次,但是在一个方法内的不同非嵌套块中,可以多次声明同名变量
若局部变量和一个类变量同名时,那么局部变量优先,而同名类变量被隐藏
public class Test {
private String name = "Tennyson";
private int age = 12;
public void test() {
String name = "Damocles";
System.out.println("name: " + name); // Damocles
System.out.println("age: " + age); // 12
// 此时要调用类变量应使用this
System.out.println("this.name: " + this.name); // Tennyson
}
}