当前位置:   article > 正文

Java SE - Java基础,Java入门,Java基础语法,数据类型,变量,运算符,流程控制语句(顺序,分支,循环),数组

Java SE - Java基础,Java入门,Java基础语法,数据类型,变量,运算符,流程控制语句(顺序,分支,循环),数组

Java SE - Java基础-Java入门-Java基础语法

Java基础之Java入门及Java基础语法

1. Java入门

1.1 发展史

Java语言是美国Sun公司(Stanford University Network)在1995年推出的计算机语言;

Java之父:詹姆斯·高斯林(James Gosling)

2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com

通过访问oracle的官网来下载各个版本的JDK

1.2 Java跨平台

Java 的跨平台性是其设计的一个核心特点。这一特性是通过**Java虚拟机(Java Virtual Machine,JVM)**的存在来实现的。

  • Java 虚拟机(JVM): Java 虚拟机是一个运行时环境,负责在不同平台上解释和执行字节码。
  • 一次编写,到处运行(Write Once, Run Anywhere): 这是 Java 的著名口号。它意味着开发者只需编写一次 Java 代码,然后可以在任何具有相应 Java 虚拟机的平台上运行,而不需要对代码进行修改或重新编译。
  • 平台相关的部分: 尽管 Java 跨平台性提供了很高的灵活性,但仍有一些与平台相关的部分,例如与图形用户界面(GUI)相关的代码。为了解决这个问题,Java 提供了抽象的 GUI 库(如AWT和Swing),这样在不同平台上运行时,GUI 的外观和行为会适应该平台的风格。

1.3 JVM、JRE、JDK

image-20231118202913758

JDK中包含了JRE(开发工具中包含运行工具)

  • JVM(Java Virtual Machine),Java虚拟机,真正运行Java程序的地方;

  • JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API);所谓核心类库,就是Java已经写好的一些东西,直接拿来使用即可;

    System.out.println("Hello world!");    //这里的System、out、println都是java写好的类和方法
    
    • 1
  • JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具

    开发工具:

    常见的java开发工具有JDK提供的javac.exe、java.exe等命令

    • javac 编译工具
    • java 运行工具
    • jdb 调试工具
    • jhat 内存分析工具

    我们可以在cmd中使用这些指令,来编译、运行编写的java代码

    public class MavenTest{
    	public static void main(String args[]){
    		System.out.println("hello");	
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译、运行结果:

    example

1.4 JDK 与Java常用开发工具IntelliJ IDEA的下载与安装

2. Java基础语法

2.1 注释

  • 单行注释
// 这是单行注释文字
  • 1
  • 多行注释
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
注意:多行注释不能嵌套使用。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 文档注释。文档注释以/**开始,以*/结束。

    • 类的文档注释: 位于类的定义之前,提供了有关类的整体描述和用法的信息。

    • 方法的文档注释: 位于方法的定义之前,提供了有关方法的详细描述、参数说明和返回值说明的信息。

/**
 * 这是一个演示文档注释的例子。
 * 它可以包含多行描述,并提供有关类或方法的详细信息。
 */
public class Example {

    /**
     * 这是一个示例方法,用于展示文档注释的用法。
     * @param arg1 这是方法的第一个参数。
     * @param arg2 这是方法的第二个参数。
     * @return 返回两个参数的和。
     */
    public int add(int arg1, int arg2) {
        return arg1 + arg2;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.2 关键字

关键字是指被java语言赋予了特殊含义的单词。

关键字的特点:

​ 关键字的字母全部小写。

​ 常用的代码编辑器对关键字都有高亮显示,比如现在我们能看到的public、class、static等。

2.3 常量

常量:在程序运行过程中,其值不可以发生改变的量。

Java中的常量分类:

  • ​ 字符串常量 用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、“abc”、"中国"等

  • ​ 整数常量 整数,例如:-10、0、88等

  • ​ 小数常量 小数,例如:-5.5、1.0、88.88等

  • ​ 字符常量 用单引号括起来的一个字符,例如:‘a’、‘5’、‘B’、'中’等

  • ​ 布尔常量 布尔值,表示真假,只有两个值true和false

  • ​ 空常量 一个特殊的值,空值,值为null

除空常量外,其他常量均可使用输出语句直接输出。

2.4 数据类型 重点

2.4.1 存储单元基础

1B(字节) = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

2.4.2 Java中的数据类型

Java是一个强类型语言,Java中的数据必须明确数据类型。在Java中的数据类型包括基本数据类型和引用数据类型两种。

  1. Java中的基本数据类型:
数据类型关键字内存占用取值范围
整数类型byte1-128 ~ 127
short2-32768 ~ 32767
int(默认)4-2的31次方到2的31次方-1
long8-2的63次方到2的63次方-1
浮点类型float4负数: -3.402823E+38 到 -1.401298E-45
正数: 1.401298E-45 到 3.402823E+38
double(默认)8负数:-2.997693E+308 到 -4.9000000E-324
正数:4.9000000E-324 到2.997693E+308
字符类型char20-65535
布尔类型boolean1true,false

说明:

​ e+38表示是乘以10的38次方;e-45表示乘以10的负45次方。

​ 在java中整数默认是int类型,浮点数默认是double类型。

  1. Java中的引用数据类型:
引用数据类型示例特点
类(Class)public class MyClass { ... }自定义数据类型,包含属性和方法。
接口(Interface)public interface MyInterface { ... }定义方法规范,可由类实现。
数组(Array)int[] intArray = new int[5];存储相同类型元素的固定长度序列。
枚举(Enum)public enum Day { MONDAY, ... }表示具名常量的有限集合。
字符串(String)String myString = "Hello, World!";不可变字符串对象。
集合框架类(Collection)ArrayList<Integer> list = new ArrayList<>();Java提供的集合类,如ArrayList、HashMap等,用于存储和操作对象集合。
自定义引用类型自定义类和接口根据项目需求创建的自定义数据类型。

2.5 变量 重点

2.5.1 变量的定义

变量:在程序运行过程中,其值可以发生改变的量。

从本质上讲,变量是内存中的一小块区域,其值可以在一定范围内变化。

2.5.2 变量的分类
类型分类说明
声明位置
局部变量在方法、构造方法或语句块中声明,生命周期短
成员变量在类中声明,对象创建时初始化,生命周期与对象相同
静态变量使用 static 关键字声明的类变量,所有对象共享
数据类型
基本数据类型包括整数、浮点数、字符、布尔等
引用数据类型包括类、接口、数组等
访问权限
公共变量使用 public 关键字修饰,可被其他类访问
私有变量使用 private 关键字修饰,只能在声明类内部访问
受保护变量使用 protected 关键字修饰,同一包和子类可访问
默认变量没有明确的访问修饰符,默认在同一包内可访问
2.5.3 使用变量时的注意事项
  1. 在同一对花括号中,变量名不能重复。
  2. 变量在使用之前,必须初始化(赋值)。
  3. 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围。
  4. 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是double, double的取值范围是大于float的,类型不兼容。

2.6 标识符

标识符是用户编程时使用的名字,用于给类、方法、变量、常量等命名。

Java中标识符的组成规则:

​ 由字母、数字、下划线“_”、美元符号“$”组成,第一个字符不能是数字。

​ 不能使用java中的关键字作为标识符。

​ 标识符对大小写敏感(区分大小写)。

Java中标识符的命名约定:

​ 小驼峰式命名:变量名、方法名

​ 首字母小写,从第二个单词开始每个单词的首字母大写。

​ 大驼峰式命名:类名

​ 每个单词的首字母都大写。

​ 另外,标识符的命名最好可以做到见名知意

​ 例如:username、studentNumber等。

附:阿里巴巴Java开发手册中关于变量命名的约定(部分):

image-20231122161719267 image-20231122161806102

2.7 类型转换

在Java中,一些数据类型之间是可以相互转换的。分为两种情况:自动类型转换和强制类型转换。

  1. 自动类型转换:

​ 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。例如:

double num = 10; // 将int类型的10直接赋值给double类型
System.out.println(num); // 输出10.0
  • 1
  • 2
  1. 强制类型转换:

​ 把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。

​ 强制类型转换格式:目标数据类型 变量名 = (目标数据类型)值或者变量;

​ 例如:

double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)
  • 1
  • 2
  • 3

1543196882672

说明:

  1. char类型的数据转换为int类型是按照码表中对应的int值进行计算的。比如在ASCII码表中,'a’对应97。
int a = 'a';
System.out.println(a); // 将输出97
  • 1
  • 2
  1. 整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型。
byte b1 = 10;
byte b2 = 20;
byte b3 = b1 + b2; 
// 第三行代码会报错,b1和b2会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。
// 修改为:
int num = b1 + b2;
// 或者:
byte b3 = (byte) (b1 + b2);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

boolean类型不能与其他基本数据类型相互转换。

当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型

2.8 运算符

2.8.1 算术运算符
符号作用说明
+参看小学一年级
-参看小学一年级
*参看小学二年级,与“×”相同
/参看小学二年级,与“÷”相同
%取余获取的是两个数据做除法的余数
2.8.2 赋值运算符
符号作用说明
=赋值a=10,将10赋值给变量a
+=加后赋值a+=b,将a+b的值给a
-=减后赋值a-=b,将a-b的值给a
*=乘后赋值a*=b,将a×b的值给a
/=除后赋值a/=b,将a÷b的商给a
%=取余后赋值a%=b,将a÷b的余数给a
2.8.3 自增运算符
符号作用说明
++自增变量的值加1
自减变量的值减1
2.8.4 关系运算符
符号作用说明
++自增变量的值加1
自减变量的值减1
2.8.5 逻辑运算符
符号作用说明
&逻辑与a&b,a和b都是true,结果为true,否则为false
|逻辑或a|b,a和b都是false,结果为false,否则为true
^逻辑异或a^b,a和b结果不同为true,相同为false
!逻辑非!a,结果和a的结果正好相反

短路逻辑运算符

符号作用说明
&&短路与作用和&相同,但是有短路效果
||短路或作用和|相同,但是有短路效果

区别:重要

  • 逻辑与&,无论左边真假,右边都要执行。

  • 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。

  • 逻辑或|,无论左边真假,右边都要执行。

  • 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。

int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算
System.out.println(x); // 4
System.out.println(y); // 5

System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算
System.out.println(x); // 4
System.out.println(y); // 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
2.8.6 三元表达式
关系表达式 ? 表达式1 : 表达式2;
  • 1

问号前面的位置是判断的条件,判断结果为boolean型,为true时调用表达式1,为false时调用表达式2。其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。

2.9 流程控制语句

  • 顺序结构
  • 分支结构(if, switch)
  • 循环结构(for, while, do…while)
2.9.1 顺序结构

最基本的流程控制:

image-20231122184036679

2.9.2 分支结构
2.9.2.1 if分支结构:

if分支结构1:

格式:
if (关系表达式) {
    语句体;	
}
  • 1
  • 2
  • 3
  • 4

image-20231122184109186

if分支结构2:

格式:
if (关系表达式) {
    语句体1;	
} else {
    语句体2;	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

image-20231122184246190

if分支结构3:

格式:
if (关系表达式1) {
    语句体1;	
} else if (关系表达式2) {
    语句体2;	
}else {
    语句体n+1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
2.9.2.2 switch语句

格式:

witch (表达式) {
	case 1:
		语句体1;
		break;
	case 2:
		语句体2;
		break;
	...
	default:
		语句体n+1;
		break;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意:

  • 首先计算出表达式的值
  • Java 7及以上版本才支持表达式为字符串
  • 如果switch中得case,没有对应break的话,则会出现case穿透的现象
2.9.3 循环结构
2.9.3.1 for循环
for (初始化语句;条件判断语句;条件控制语句) {
	循环体语句;
}
  • 1
  • 2
  • 3

执行流程:

  1. 执行初始化语句

  2. 执行条件判断语句,看其结果是true还是false

    2.1 如果是false,循环结束

    2.2 如果是true,继续执行

  3. 执行循环体语句

  4. 执行条件控制语句

  5. 回到2.继续

引申

增强型for循环

int[] array = {1, 2, 3, 4, 5};
for (int element : array) {
    System.out.println(element);
}
  • 1
  • 2
  • 3
  • 4

无限循环

for (;;) {
    // 无限循环
}
  • 1
  • 2
  • 3
2.9.3.2 while循环
初始化语句;
while (条件判断语句) {
	循环体语句;
    条件控制语句;
}
  • 1
  • 2
  • 3
  • 4
  • 5

执行流程:

  1. 执行初始化语句

  2. 执行条件判断语句,看其结果是true还是false

    2.1 如果是false,循环结束

    2.2 如果是true,继续执行

  3. 执行循环体语句

  4. 执行条件控制语句

  5. 回到2. 继续

do…while循环:

初始化语句;
do {
	循环体语句;
	条件控制语句;
}while(条件判断语句);
  • 1
  • 2
  • 3
  • 4
  • 5

执行流程:

  1. 执行初始化语句

  2. 执行循环体语句

  3. 执行条件控制语句

  4. 执行条件判断语句,看其结果是true还是false

    4.1 如果是false,循环结束

    4.2 如果是true,继续执行

  5. 回到2. 继续

2.9.3.3 总结 重点
  • 三种循环的区别

    • for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
    • do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)
  • for循环和while的区别

    • 条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
    • 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
  • 死循环(无限循环)的三种格式

    1. for( ; ; ){}

    2. while(true){}

    3. do {} while(true);

2.9.4 跳转控制语句
  • 跳转控制语句(break)
    • 跳出循环,结束循环
  • 跳转控制语句(continue)
    • 跳过本次循环,继续下次循环
  • 注意: continue只能在循环中进行使用!

2.10 数组 重点

2.10.1 什么是数组

数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致

2.10.2 数组的定义

第一种

//数据类型[] 数组名
int[] arr;        
double[] arr;      
char[] arr;
  • 1
  • 2
  • 3
  • 4

第二种

//数据类型 数组名[]
int arr[];
double arr[];
char arr[];
  • 1
  • 2
  • 3
  • 4
2.10.3 动态初始化数组

数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

初始化格式:

数据类型[] 数组名 = new 数据类型[数组长度];
  • 1
int[] arr = new int[3];
  • 1

详细分析:

  • 等号左边:

    • int:数组的数据类型

    • []:代表这是一个数组

    • arr:代表数组的名称

  • 等号右边:

    • new:为数组开辟内存空间
    • int:数组的数据类型
    • []:代表这是一个数组
    • 5:代表数组的长度
2.10.4 数组元素的访问

利用索引访问:

数组名[索引];
  • 1
2.10.5 内存分配 重点

内存是计算机中的重要原件,临时存储区域,作用是运行程。

我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

java中的内存分配

区域名称作用
寄存器给CPU使用,和我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

最需要注意的两个区域 :栈内存 和 堆内存

  1. 堆内存(Heap):

    • 堆内存是用于存储Java程序运行时创建的对象实例的地方。
    • 空间由程序员动态分配(所有通过new关键字创建的对象都存储在堆内存中。)
    • 大小不固定,可以动态扩容
    • 堆内存是共享的,被所有线程共享

    缺点:容易产生内存泄露(即应用程序持续分配内存而不释放)和内存碎片(动态分配和释放可能导致堆内存出现碎片,这些碎片化的空间不能被有效利用,可能导致内存利用效率降低),线程不安全(堆内存可以被一个进程里的所有线程访问)

    一个进程可以包含多个线程,它们共享同一个进程的资源

  2. 栈内存(Stack):

    • 栈内存用于存储线程的方法调用和局部变量(通过A a这类方法定义的变量)。

    • 每个线程都有自己的栈,用于跟踪方法的调用和返回。

    • 每个方法调用都会在栈上创建一个帧,帧包含了方法的局部变量、操作数栈和其他与方法调用相关的数据。

      栈帧(stack frame)是指在程序执行过程中,一个函数或方法的调用所需要的栈空间

    • 方法调用结束时,相应的栈帧会被弹出。

    • 栈内存是线程私有的,不同线程的栈互不干扰。

在Java程序执行期间,方法调用时的数据和执行状态存储在栈内存中,而动态创建的对象实例存储在堆内存中。这两者协同工作,使得Java程序能够灵活地管理内存并支持多线程并发执行。

定义数组时的内存分配情况:

image-20231123202322948

速度
空间管理高效,不会产生碎片会产生内存碎片
访问权限只能局部变量可以访问全局变量
空间大小限制操作系统限制没有特定的限制
内存分配连续随机分配
分配和释放编译器指令自动管理程序员手动管理
开销
灵活性固定大小可以resize
2.10.6 静态初始化格式
  • 完整版格式

    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
    
    • 1
  • 简化版格式

    数据类型[] 数组名 = {元素1,元素2,...};
    
    • 1
2.10.7 常见异常
  1. 索引越界异常

  2. 空指针异常
    堆内存中。这两者协同工作,使得Java程序能够灵活地管理内存并支持多线程并发执行。

定义数组时的内存分配情况:

[外链图片转存中…(img-HxVi41B4-1700743561297)]

速度
空间管理高效,不会产生碎片会产生内存碎片
访问权限只能局部变量可以访问全局变量
空间大小限制操作系统限制没有特定的限制
内存分配连续随机分配
分配和释放编译器指令自动管理程序员手动管理
开销
灵活性固定大小可以resize
2.10.6 静态初始化格式
  • 完整版格式

    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
    
    • 1
  • 简化版格式

    数据类型[] 数组名 = {元素1,元素2,...};
    
    • 1
2.10.7 常见异常
  1. 索引越界异常

  2. 空指针异常

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号