Java基础01-开发环境&数据类型
Java开发环境
-
JVM(Java Virtual Machine)
- 在需要运行Java应用程序的操作系统上,安装一个与操作系统对应的JVM
-
JRE(Java Runtime Environment)
- 是Java程序运行时的环境,包含JVM和运行时需要的核心类库
-
JDK(Java Development Kit)
- Java程序开发工具包,包含JRE和开发人员使用的编译器工具
- 开发工具:编译工具(javac.exe)和运行工具(java.exe)
- 想要开发一个全新的Java程序,必须安装使用JDK
- 关系图:
Java运行的内存分配
各部分名称 | 作用 |
---|---|
栈(Stack) | 存储方法中的局部变量(方法的参数或方法体内部的变量);方法的运行过程一定在栈中;一旦超出作用域,立刻从栈内存中消失 |
堆(Heap) | 凡是new关键字创建的新对象,都存在于堆中;堆内存中每个对象都有一个地址值(16进制);堆内存中的数据,都有默认值(如整数默认值为0等) |
方法区(Method Area) | 存储.class相关的数据,包含方法的信息; |
本地方法栈(Native Method Stack) | 与操作系统相关; |
寄存器(pc Register) | 与CPU相关; |
Hello,World!
package 基础;
// 单行注释
/*多行注释
* public class 均为关键字,其后为定义的类名,其必须保持与该文件名完全一致。
* 类是Java当中所有源代码的基本组织单位。
* public static void 为固定写法,意为程序入口main方法。
* System.out.println 表示打印到控制台。
* */
public class Demo01_HelloWorld { // 单行注释
public static void main(String[] args) {
System.out.println("Hello,world!");
}
}
标识符
package 基础;
public class Demo02_标识符 {
/*标识符的命名规则
* 1. 可以使用英文字母(区分大小写),0-9数字,$(美元符号),_(下划线)
* 2. 不能以数字开头
* 3. 标识符不能是关键字
*
* 命名规范
* 1. 类名: 大驼峰 (HelloWorldClass)
* 2. 变量名: 小驼峰 (helloWorld)
* 3. 方法名: 同变量名
* */
}
常量
package 基础;
public class Demo03_常量 {
/*常量的分类
* 1. 字符串常量:双引号引用的部分,如:"abc", "字符串"
* 2. 整数常量: 没有引号的整数,如: 100,200, -250
* 3. 浮点数常量: 没有引号的小数, 如: 2.5, 3.14, 2.56
* 4. 字符常量: 单引号引用的单个字符,如:'A', 'b', '字'
* 5. 布尔常量: 仅两种: true false
* 6. 空常量: 表示没有任何数据: null
* */
public static void main(String[] args) {
// 字符串常量:
System.out.println("abc");
System.out.println("");
// 整数常量:
System.out.println(30);
System.out.println(-5);
// 浮点数常量:
System.out.println(3.15);
System.out.println(-2.5);
// 字符常量:
System.out.println('A');
// System.out.println(''); 报错,有且必须有一个字符。
// System.out.println('AC'); 报错
// 布尔常量:
System.out.println(true);
System.out.println(false);
// 空常量:
// System.out.println(null); 报错,空常量不能直接打印输出。
}
}
数据类型
package 基础;
public class Demo04_数据类型 {
/*数据类型分类: 基本数据类型、引用数据类型
* 基本数据类型:
* 1.整数型:byte short int(默认) long
* 占用字节数 1 2 4 8
* 2.浮点型: float double(默认)
* 4 8
* 3.字符型: char
* 2
* 4.布尔型: boolean
* 1
*
*
* 引用数据类型:
* 1.字符串
* 2.数组
* 3.类
* 4.接口
* 5.Lambda
* ......
*
*
* 注意:
* 1. 字符串是引用数据类型。
* 2. 浮点型可能只是一个近似值,并非精确的值。
* 3. 数据范围和所占字节数不一定相关:float(4字节)数据范围比long(8字节)范围更大,
* 4. 浮点数当中默认的类型是double,如果需要使用float类型,需要加上后缀F。
* 如果是整数,默认是int,需要使用long类型,需要加上后缀L。
* */
}
变量
package 基础;
public class Demo05_变量 {
/*变量:程序运行期间,可以发生改变的量。
*
* 创建一个变量的格式:
* 1.数据类型 变量名称; // 创建了一个变量
* 变量名称 = 数据值; // 赋值,将右边的数据值,赋值交给左边的变量
* 2.数据类型 变量名称 = 数据值; // 创建变量并赋值
*
* 使用变量时的注意事项:
* 1.如果创建多个变量,那么变量之间的名称不可以重复。
* 2.对于float和long类型来说,字母后缀F和L不要省略。
* 3.如果使用byte或short类型的变量,右侧的数据值不能超过左侧类型的范围。
* 4.没有进行赋值的变量,不能直接使用,一定要赋值之后,才能使用。
* 5.变量使用不能超过作用域的范围。
* 【作用域】: 从定义变量的开始,直到所属的代码块结束,即大括号结束位置。
* 6.可以通过一个语句,创建多个变量,但不建议。
* */
public static void main(String[] args) {
int num1;
num1 = 10;
System.out.println(num1);
int num2 = 20;
System.out.println(num2);
// 修改num1的值
num1 = 30;
System.out.println(num1);
byte by1 = 30;
System.out.println(by1);
// byte by2 = 400; byte的范围: -128 ~ 127
// 注意:右侧数值的范围不能超过左侧数据类型的取值范围。
short sh1 = 50;
long lo1 = 50;
float fl1 = 2.5F;
double do1 = 1.2;
char ch1 = 'A';
boolean bool1 = true;
// int a = 10;
// int b = 20;
// int c = 30;
int a, b, c;
a = 10;
b = 20;
c = 30;
int x = 100, y = 200, z = 300;
}
}
数据类型转换
package 基础;
public class Demo06_数据类型转换 {
/*
*当数据类型不同时,会发生数据类型转换,分为两种:
* 自动类型转换:
* 1. 特点: 代码不需要进行特殊处理,自动完成转换。
* 2. 规则: 数据范围从小到大。
*
* 强制类型转换:
* 1. 特点: 代码需要进行特殊的格式处理,不能自动完成转换。
* 2. 格式: 范围小的类型 范围小的变量名 = (范围小的类型)范围大的数据;
* 如: int num = (int)100L;
* 注意事项:
* 1. 强制类型转换不推荐使用,因为可能发生精度损失或数据溢出。
* 2. byte/short/char 这三种类型都可以发生数学运算,如:+
* 3. byte/short/char 在发生数学运算时,**都会首先被提升为int类型**,再参与计算。
* 4. boolean类型不能发生数据类型转换。
* */
public static void main(String[] args) {
System.out.println(1024); // 整数,默认为int
System.out.println(3.14); // 浮点数,默认double
long num1 = 100L;
long num2 = 100;
System.out.println(num1); // 100
System.out.println(num2); // 100
//如上,加不加L都会输出100,其中发生了数据类型转换。
/*
左边为long类型,右边默认为int类型,等号赋值,将右侧的int常量赋值给了左侧的
变量long类型进行存储,由于 int --> long 符合了数据范围由小到大的要求,自动类型转换。
*/
double dou1 = 2.5F;
System.out.println(dou1);
// float --> double 符合由小到大,发生自动类型转换。
float fl1 = 3L;
// long --> float 符合由小到大,发生自动类型转换。
// 强制类型转换:
// int number1 = 100L;
// 直接报错;long --> int 不是由小到大的范围关系,
// 不能发生自动类型转换,需要强制类型转换:
int number1 = (int)100L;
System.out.println(number1);
// long 强制转换为 int类型,发生数据溢出。
int number2 = (int)6000000000L;
System.out.println(number2); // 1705032704
// double 强制转换为 int,发生数据精度缺失。
int number3= (int)3.99;
System.out.println(number3); // 3
// A字符被当做65进行处理。
char cha1 = 'A';
System.out.println(cha1 + 1); // 66
// 计算机底层会用一个数字(二进制)来代表字符'A',即65
// 一旦char类型的数据进行了数学运算,则会按一定的规则翻译为数字。
/*注意事项:
* 1. 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过左侧数据类型范围,javac编译器会自动
* 隐含的进行强制类型转化:(byte),(short),(char)
* 2. 给变量进行赋值的时候,如果右侧的表达式中全部都是常量,没有任何变量时,
* 编译器javac会直接将若干个常量进行计算得到结果后,赋值给左侧变量,如下例:
* short result2 = 5 + 8; 等价于: short results2 = 13;
* 此过程成为“编译器的常量优化“
* 但是一旦有变量参与,不在进行常量优化。
* */
byte byteNum1 = /*(byte)*/30; // 等价于 byte byteNum1 = (byte)30;
System.out.println(byteNum1);
short s1 = 5;
short s2 = 8;
// short result1 = s1 + s2; //报错,左侧需要是int数据类型
short result2 = 5 + 8;
System.out.println(result2);
}
}