变量类型
Java是强类型的语言,有多种数据类型:
基本数据类型(Primitive Data Types)
类型 | 字节数 | 值 |
---|---|---|
byte | 1 | -128-127 |
short | 2 | -32768-32767 |
int | 4 | -2147483648-2147483647 |
long | 8 | -2的63次方-2的63次方-1 |
float | 4 | 单精度浮点数 |
double | 8 | 双精度浮点数 |
char | 2 | 单个字符 |
boolean | 1 | true 或者 false |
String | N | 任意字符串 |
引用数据类型(Reference Data Types)
类型 | ||
---|---|---|
class | ||
interface | ||
array |
声明变量
声明变量格式为:<数据类型> <变量名> <值>;
public class Mek {
// 声明一个字符串变量;
String name = "mek";
// 声明一个整数变量;
int age = 18;
// 声明一个char变量;
char sex = '男';
// 声明一个双精度浮点;
double wallet = 100.5;
// 声明一个单精度浮点 *** 注意float格式赋值时末尾需添加f;
float alipay = 12.6f;
// 声明一个布尔类型
boolean stats = false;
// 声明变量 再需要时赋值
int r;
r=1;
}
整数类型的拓展
在给int类型赋值时可以选择整数的进制
package com.company;
class Abcdefg {
public static void main(String[] args) {
int i1 = 10; // 10进制
int i2 = 010; // 8进制
int i3 = 0x10; // 16进制
System.out.printf("%s-%s-%s\n", i1, i2, i3); // 10-8-16
}
}
类型的转换
当你在Java中进行数据类型转换时,有两种常见的情况:自动类型转换和强制类型转换。
- 自动类型转换(类型提升):
自动类型转换是指将一个小范围的数据类型转换为一个大范围的数据类型。在这种情况下,Java会自动执行类型转换,而无需显式地编写代码来实现。自动类型转换是安全的,因为它不会导致数据丢失。
数据类型的大小对应数据类型所占用的字节数
以下是一些自动类型转换的示例:
int numInt = 100;
double numDouble = numInt; // int自动转换为double
char ch = 'A';
int num = ch; // char自动转换为int
byte b = 10;
int num = b; // byte自动转换为int
- 强制类型转换:
强制类型转换是指将一个大范围的数据类型转换为一个小范围的数据类型。在这种情况下,你需要使用强制类型转换运算符()
来明确表示你正在执行类型转换,并且需要注意可能会发生的数据丢失。
以下是一些强制类型转换的示例:
double numDouble = 3.14;
int numInt = (int) numDouble; // double强制转换为int,将丢失小数部分
int numInt = 100;
byte b = (byte) numInt; // int强制转换为byte,可能导致数据溢出或丢失
需要注意的是,强制类型转换可能导致数据溢出或丢失精度。因此,在进行强制类型转换时,你应该确保转换是安全的,并且不会导致意外的结果。
class Abcdefg {
public static void main(String[] args) {
byte i = 10;
int b = i;
System.out.println(b); // 10
int c = 512;
byte d = (byte) c;
System.out.println(d); // 0 大类型往小类型转换导致精度丢失
// 字符串转int
String name = "10086";
int names = Integer.parseInt(name);
System.out.println(names);
}
}
大数字计算时的注意事项
用int做大数字计算时应注意结果是否会溢出,可以在计算式前进行类型转换
package com.company;
class Abcdefg {
public static void main(String[] args) {
int wallet = 1000000000;
int yers = 20;
long total = wallet * yers;
System.out.println(total); // -1474836480 溢出
long total2 = (long) wallet * yers;
System.out.println(total2); // 20000000000
}
}
变量作用域
在Java中,变量的作用域是指变量在程序中可访问的区域或范围。它决定了变量的可见性和生命周期。Java中有几种不同的变量作用域:
-
类级别的作用域:这是在类中声明的变量的最大作用域。类级别的变量可以在整个类中访问。它们通常用关键字
public
、protected
或private
进行修饰。 -
方法级别的作用域:方法级别的变量在方法内部声明,并且只能在该方法中访问。当方法执行结束后,这些变量的生命周期也就结束了。
-
块级别的作用域:块是由一对花括号
{}
包围的代码片段。在块内声明的变量只在该块内部有效。典型的块包括if
语句、循环语句和方法内部的嵌套块。 -
构造器参数和局部变量的作用域:构造器参数和方法内部声明的局部变量的作用域限定于其声明所在的方法或构造器中。它们在方法或构造器被调用时创建,并在方法或构造器执行完毕后销毁。
-
类成员变量和实例变量的作用域:类成员变量是声明在类中、方法外部的变量,而实例变量是声明在类中、方法内部的变量。它们的作用域限定于整个类及其实例。类成员变量在任何实例中都具有相同的值,而实例变量的值是每个实例单独拥有的。
需要注意的是,Java中的局部变量必须显式初始化才能使用,否则编译器会报错。而类成员变量和实例变量会有默认的初始值(数值为0,布尔值为false,对象引用为null)。
在使用变量时,要根据作用域的规则来保证变量的可见性和正确的使用。
package com.company;
class Main {
// 类变量 在该类里可以直接使用的变量 ** 声明时加static
static double job = 2000;
// 常量 声明后不可改变
static final String TAB = "Mek";
// 实例变量 新建该实例才能使用,实例变量可以不初始化
String name;
int age;
public static void main(String[] args) {
// 使用类变量
System.out.println(job);
System.out.println(TAB);
// 使用实例变量
Main m = new Main();
System.out.println(m.name);
System.out.println(m.age);
// 局部变量 只在该void内生效
int cot = 123;
System.out.println(cot);
m.add();
}
void add() {
// 局部变量 只在该void内生效
int cot = 456;
System.out.println(cot);
}
}
在Java中,变量命名必须遵循一定的规则。以下是Java变量命名的约定和规则:
- 变量的命名必须以字母、下划线(_)或美元符号($)开头。
- 变量名可以包含字母、数字、下划线和美元符号。
- 变量名是大小写敏感的,即"myVariable"和"myvariable"被视为不同的变量。
- 避免使用Java关键字(如"int"、“class”、"if"等)作为变量名。
- 选择有描述性的变量名,可以使代码更易读和理解。例如,使用"firstName"代替"fN"。
- 使用驼峰命名法来命名变量。对于普通变量,首字母小写,后续单词的首字母大写,例如"myVariableName"。对于常量(final变量),通常使用全大写字母,并用下划线分隔单词,例如"MAX_VALUE"。
- 尽量避免使用单个字符作为变量名,除非它们在上下文中具有明确的含义。例如,使用"i"表示迭代计数器是一个常见做法,但在其他情况下应该使用更有描述性的名称。
以下是一些合法的Java变量名示例:
int age;
String firstName;
double accountBalance;
final int MAX_VALUE = 100;
请注意,良好的命名实践有助于提高代码的可读性和可维护性。选择清晰、描述性的变量名可以使代码更易于理解,并且能够更快地定位和修复潜在的问题。