赞
踩
Java基础之Java入门及Java基础语法
Java语言是美国Sun公司(Stanford University Network)在1995年推出的计算机语言;
Java之父:詹姆斯·高斯林(James Gosling)
2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com
通过访问oracle的官网来下载各个版本的JDK
Java 的跨平台性是其设计的一个核心特点。这一特性是通过**Java虚拟机(Java Virtual Machine,JVM)**的存在来实现的。
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写好的类和方法
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
编译、运行结果:
// 这是单行注释文字
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
注意:多行注释不能嵌套使用。
文档注释。文档注释以/**
开始,以*/
结束。
类的文档注释: 位于类的定义之前,提供了有关类的整体描述和用法的信息。
方法的文档注释: 位于方法的定义之前,提供了有关方法的详细描述、参数说明和返回值说明的信息。
/** * 这是一个演示文档注释的例子。 * 它可以包含多行描述,并提供有关类或方法的详细信息。 */ public class Example { /** * 这是一个示例方法,用于展示文档注释的用法。 * @param arg1 这是方法的第一个参数。 * @param arg2 这是方法的第二个参数。 * @return 返回两个参数的和。 */ public int add(int arg1, int arg2) { return arg1 + arg2; } }
关键字是指被java语言赋予了特殊含义的单词。
关键字的特点:
关键字的字母全部小写。
常用的代码编辑器对关键字都有高亮显示,比如现在我们能看到的public、class、static等。
常量:在程序运行过程中,其值不可以发生改变的量。
Java中的常量分类:
字符串常量 用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、“abc”、"中国"等
整数常量 整数,例如:-10、0、88等
小数常量 小数,例如:-5.5、1.0、88.88等
字符常量 用单引号括起来的一个字符,例如:‘a’、‘5’、‘B’、'中’等
布尔常量 布尔值,表示真假,只有两个值true和false
空常量 一个特殊的值,空值,值为null
除空常量外,其他常量均可使用输出语句直接输出。
重点
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
Java是一个强类型语言,Java中的数据必须明确数据类型。在Java中的数据类型包括基本数据类型和引用数据类型两种。
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
整数类型 | byte | 1 | -128 ~ 127 |
short | 2 | -32768 ~ 32767 | |
int(默认) | 4 | -2的31次方到2的31次方-1 | |
long | 8 | -2的63次方到2的63次方-1 | |
浮点类型 | float | 4 | 负数: -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 | |
字符类型 | char | 2 | 0-65535 |
布尔类型 | boolean | 1 | true,false |
说明:
e+38表示是乘以10的38次方;e-45表示乘以10的负45次方。
在java中整数默认是int类型,浮点数默认是double类型。
引用数据类型 | 示例 | 特点 |
---|---|---|
类(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等,用于存储和操作对象集合。 |
自定义引用类型 | 自定义类和接口 | 根据项目需求创建的自定义数据类型。 |
重点
变量:在程序运行过程中,其值可以发生改变的量。
从本质上讲,变量是内存中的一小块区域,其值可以在一定范围内变化。
类型分类 | 说明 |
---|---|
声明位置 | |
局部变量 | 在方法、构造方法或语句块中声明,生命周期短 |
成员变量 | 在类中声明,对象创建时初始化,生命周期与对象相同 |
静态变量 | 使用 static 关键字声明的类变量,所有对象共享 |
数据类型 | |
基本数据类型 | 包括整数、浮点数、字符、布尔等 |
引用数据类型 | 包括类、接口、数组等 |
访问权限 | |
公共变量 | 使用 public 关键字修饰,可被其他类访问 |
私有变量 | 使用 private 关键字修饰,只能在声明类内部访问 |
受保护变量 | 使用 protected 关键字修饰,同一包和子类可访问 |
默认变量 | 没有明确的访问修饰符,默认在同一包内可访问 |
标识符是用户编程时使用的名字,用于给类、方法、变量、常量等命名。
Java中标识符的组成规则:
由字母、数字、下划线“_”、美元符号“$”组成,第一个字符不能是数字。
不能使用java中的关键字作为标识符。
标识符对大小写敏感(区分大小写)。
Java中标识符的命名约定:
小驼峰式命名:变量名、方法名
首字母小写,从第二个单词开始每个单词的首字母大写。
大驼峰式命名:类名
每个单词的首字母都大写。
另外,标识符的命名最好可以做到见名知意
例如:username、studentNumber等。
附:阿里巴巴Java开发手册中关于变量命名的约定(部分):
在Java中,一些数据类型之间是可以相互转换的。分为两种情况:自动类型转换和强制类型转换。
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。例如:
double num = 10; // 将int类型的10直接赋值给double类型
System.out.println(num); // 输出10.0
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。
强制类型转换格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
例如:
double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)
说明:
int a = 'a';
System.out.println(a); // 将输出97
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);
boolean类型不能与其他基本数据类型相互转换。
当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型
符号 | 作用 | 说明 |
---|---|---|
+ | 加 | 参看小学一年级 |
- | 减 | 参看小学一年级 |
* | 乘 | 参看小学二年级,与“×”相同 |
/ | 除 | 参看小学二年级,与“÷”相同 |
% | 取余 | 获取的是两个数据做除法的余数 |
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | 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 |
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与 | 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;
问号前面的位置是判断的条件,判断结果为boolean型,为true时调用表达式1,为false时调用表达式2。其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。
最基本的流程控制:
if分支结构1:
格式:
if (关系表达式) {
语句体;
}
if分支结构2:
格式:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
if分支结构3:
格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
…
else {
语句体n+1;
}
格式:
witch (表达式) {
case 1:
语句体1;
break;
case 2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
注意:
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
执行流程:
执行初始化语句
执行条件判断语句,看其结果是true还是false
2.1 如果是false,循环结束
2.2 如果是true,继续执行
执行循环体语句
执行条件控制语句
回到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
初始化语句;
while (条件判断语句) {
循环体语句;
条件控制语句;
}
执行流程:
执行初始化语句
执行条件判断语句,看其结果是true还是false
2.1 如果是false,循环结束
2.2 如果是true,继续执行
执行循环体语句
执行条件控制语句
回到2. 继续
do…while循环:
初始化语句;
do {
循环体语句;
条件控制语句;
}while(条件判断语句);
执行流程:
执行初始化语句
执行循环体语句
执行条件控制语句
执行条件判断语句,看其结果是true还是false
4.1 如果是false,循环结束
4.2 如果是true,继续执行
回到2. 继续
重点
三种循环的区别
for循环和while的区别
死循环(无限循环)的三种格式
for( ; ; ){}
while(true){}
do {} while(true);
重点
数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
第一种
//数据类型[] 数组名
int[] arr;
double[] arr;
char[] arr;
第二种
//数据类型 数组名[]
int arr[];
double arr[];
char arr[];
数组动态初始化就是只给定数组的长度,由系统给出默认初始化值
初始化格式:
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
详细分析:
等号左边:
int:数组的数据类型
[]:代表这是一个数组
arr:代表数组的名称
等号右边:
利用索引访问:
数组名[索引];
重点
内存是计算机中的重要原件,临时存储区域,作用是运行程。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
java中的内存分配
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
最需要注意的两个区域 :栈内存 和 堆内存
堆内存(Heap):
new
关键字创建的对象都存储在堆内存中。)缺点:容易产生内存泄露(即应用程序持续分配内存而不释放)和内存碎片(动态分配和释放可能导致堆内存出现碎片,这些碎片化的空间不能被有效利用,可能导致内存利用效率降低),线程不安全(堆内存可以被一个进程里的所有线程访问)
一个进程可以包含多个线程,它们共享同一个进程的资源
栈内存(Stack):
栈内存用于存储线程的方法调用和局部变量(通过A a这类方法定义的变量)。
每个线程都有自己的栈,用于跟踪方法的调用和返回。
每个方法调用都会在栈上创建一个帧,帧包含了方法的局部变量、操作数栈和其他与方法调用相关的数据。
栈帧(stack frame)是指在程序执行过程中,一个函数或方法的调用所需要的栈空间
方法调用结束时,相应的栈帧会被弹出。
栈内存是线程私有的,不同线程的栈互不干扰。
在Java程序执行期间,方法调用时的数据和执行状态存储在栈内存中,而动态创建的对象实例存储在堆内存中。这两者协同工作,使得Java程序能够灵活地管理内存并支持多线程并发执行。
定义数组时的内存分配情况:
栈 | 堆 | |
---|---|---|
速度 | 快 | 慢 |
空间管理 | 高效,不会产生碎片 | 会产生内存碎片 |
访问权限 | 只能局部变量 | 可以访问全局变量 |
空间大小限制 | 操作系统限制 | 没有特定的限制 |
内存分配 | 连续 | 随机分配 |
分配和释放 | 编译器指令自动管理 | 程序员手动管理 |
开销 | 低 | 高 |
灵活性 | 固定大小 | 可以resize |
完整版格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
简化版格式
数据类型[] 数组名 = {元素1,元素2,...};
索引越界异常
空指针异常
堆内存中。这两者协同工作,使得Java程序能够灵活地管理内存并支持多线程并发执行。
定义数组时的内存分配情况:
[外链图片转存中…(img-HxVi41B4-1700743561297)]
栈 | 堆 | |
---|---|---|
速度 | 快 | 慢 |
空间管理 | 高效,不会产生碎片 | 会产生内存碎片 |
访问权限 | 只能局部变量 | 可以访问全局变量 |
空间大小限制 | 操作系统限制 | 没有特定的限制 |
内存分配 | 连续 | 随机分配 |
分配和释放 | 编译器指令自动管理 | 程序员手动管理 |
开销 | 低 | 高 |
灵活性 | 固定大小 | 可以resize |
完整版格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
简化版格式
数据类型[] 数组名 = {元素1,元素2,...};
索引越界异常
空指针异常
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。