Java SE 入门到精通—基础语法【Java】

敲重点! 本篇讲述了比较重要的基础,是必须要掌握的

1.程序入口

在Java中,main方法是程序的入口点,是JVM(Java虚拟机)执行Java应用程序的起始点

main方法的方法签名必须遵循下面规范:

public static void main(String[] args){...}
  • public: main方法必须是public,以便JVM能够调用它。
  • static: main方法必须是静态的,因为在调用时不会创建类的实例,而是通过类名直接调用。
  • void: main方法不返回任何值,其返回类型必须是void
  • String[] args: main方法的参数是一个字符串数组,用于接收命令行输入的参数。

当Java应用程序运行时,JVM会先加载应用程序的主类(包含main方法的类)再执行main方法。

2.输入输出

3.标识符与变量

标识符

所谓标识符就是变量、方法,类,接口等对象的名字,标识符的命名规则必须以下换线(_),$或者英文字母开头,并且不能使用关键字和保留字。

一般变量命名遵守小驼峰命名法大驼峰命名法

小驼峰命名法命名变量和方法名时,例如$userName,age,myFunction(),getResult(),除第一个单词其他单词首字母大写。

大驼峰命名法命名变量和方法名时,例如$UserName,Age,MyFunction(),GetResult(),所有单词首字符大写。

变量与常量

基本概念

变量与常量是指内存中的一个存储区域的引用,变量其值可以改变,而常量不可变。

基本数据类型变量名和值都存储在栈中,引用类型的变量名/对象引用 (内存地址)存储在栈中,变量值(实例)存储在堆中

变量

变量初始化(赋值) 有两种方式,分布是静态初始化和动态初始化。

静态初始化

声明并分配内存空间。

int a=1;
动态初始化

先声明变量,后面使用再赋值。

int a;
a=1

常量

常量值一旦赋值不可被修改,已经被确定,变量前加关键字:final 。

final int  a=1;

还有final 方法:最终方法,final 类:最终类,不可被继承

4.关键字与保留字

关键字被Java语言赋予了特殊含义,用做专门用途的字符串,不可被使用,如class ,interface ,enum ,byte ,short,void等等

保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字,如goto 、const等

5.数据类型

数据类型分类

Java中的数据类型分为 基本数据类型引用数据类型

来源于网络

基本数据类型

  • 整型:shortintlong
  • 浮点:floatdouble
  • 字节:byte
  • 字符:char
  • 布尔:boolean

注意:

  • float 精度为8位有效数字,超出部分四舍五入,需带 f/F 后缀表示。
  • double 精度为17位有效数字。

引用数据类型

  • 接口
  • 数组
  • 字符串

数组

一维数组

声明格式:数组类型[] 数组名={…} 或者 数组类型 数组名[]= {…}

数组初始化
动态初始化

通过new关键字分配内存空间,使用时再赋值,若未赋值则默认值为0

int[] list=new int(a) //申请a位空间数(整数)
int[] list=new int(5) //申请了5个元素空间
list[0]=1;
list[1]=8;
system.out.print(list[0],list[1])
>>>1,8
静态初始化

用花括号声明的同时并赋值

int[] list={1,2,3,4,5}
system.out.print(list[0])
>>>1

创建二维数组

声明格式:数组类型[][] 数组名={…} 或者 数组类型 数组名[][]= {…}

规则二维数组

子数组元素个数相同

静态初始化
int[][] list={{1},{2},{3},{4},{5}}
动态初始化
int[][] list=[5][1]
不规则二维数组

子数组元素个数不相同

静态初始化
int[][] list={{1},{23},{4,56}}
动态初始化
int[][] list=[3][]
list[0]=new int[1]   为第1个子数组分配1个空间
list[1]=new int[2]   为第2个子数组分配2个空间
list[2]=new int[3]   为第3个子数组分配3个空间

字符串

字符串底层为final修饰私有的字符数组,String类在long包中,无需导入

创建字符串对象

无参构造直接赋值即可,如String str=‘abc’;

带参构造
public String(char[] a/byte[] a)                
//byte  97,98,99---->a,b,c    字节对应相关字符
//char{'a','b','c'}---->abc    将字符输出为字符串(拼接)

字符数组和字节数组作为参数创建字符串对象,可以指定字节字符区间以及字符集,带参构造字符串通常用于io流数据类型转换

字符串相关操作和方法

字符串拼接

通常用StringBuilder,效率更高

str=str1+str2 产生一个新的字符串(和可变字符串相比会产生新对象,耗时,浪费空间)

字符串的比较

使用“==”做比较时

  • 基本类型:比较值是否相等
  • 引用类型:比较引用地址是否相同

构造方法创建的字符串对象不同对象不同地址
直接赋值相同内容的字符串对象共用一个地址(存储在常量池,已存在则直接引用)

        String s1="A";String s2="A";String s3=new String("A");String s4=new String("A");System.out.println(s1==s2);//trueSystem.out.println(s3==s4);//falseSystem.out.println(s1==s4);//false
引用类型比较值

引用类型判断值是否相等时,使用equals()方法

//方法1
str1.equals(str2)
//方法2
Objects.equals(str1, str2)

注意:

a.equals(b), 当a是null, 会抛出NullPointException空指针异常,因为null对象无equals方法。
使用Objects.equals(a, b)比较时不会抛出空指针异常

返回字符串元素个数
//xxx.length()
System.out.println("abc".length()); //3
修改字符串值

字符串对象不可变,若修改产生新对象,可以覆盖引用或者申请新地址,调用replace替换,字for循环替换等等

//覆盖原引用地址内容,使常量池中b值的引用指向a
String a="1"
String b="0"
a=b;
//a-->0 , b-->0
提取子串(切片)
//按索引截取指定子串
//若省略endIndex则从起始位置取到最后一个
//若startIndex=endIndex,则返回空串
str.substrng(startIndex[,endIndex]) (不计endIndex,开区间)
遍历字符串
 //取字符串索引i的元素
str="abc"
for (....){str.charAt(0)   
}
String a="123456";
for (int i=0;i<a.length();i++){System.out.println(a.charAt(i));
}

Stringbuilder

Stringbuilder是可变字符串,其值修改,地址不变(修改后还是原对象,不会在常量池中创建新对象),相同的还有StringBuffered(线程安全类)

创建可变字符串对象
构造方法创建
//无参
Stringbuilder str=new Stringbuilder()//带参
Stringbuilder str=new Stringbuilder(string)  //String转StringBuilder(还支持其他类型参数) 
可变字符串的相关操作和方法
拼接
append方法
//其返回原对象(可使用链式编程)
StringBuilder str=new StringBuilder()
str.append(str1)
逆置(序列反转)
reverse方法
StringBuilder str=new StringBuilder(str1)
str.reverse(str)
//abc-->cba

数据类型转换

自动类型转换

自动类型转换又为隐式转换,Java内部自动完成。

基本类型由低级到高级分别为(byte,short,char)->int->long->float->double

自动类型转换是从低到高的,所以当int+float的结果还是float

        int a=1;float b=1.5f;float result = a + b;

强制类型转换

强制类型转换是手动进行,将高级类型转换为低级类型,可能丢失精度

double d = 3.14;
int i = (int) d; // 强制转换为整数,丢失小数部分,i的值为3long l = 1000000000L;
int i = (int) l; // 强制转换为整数,可能会导致数据溢出char c = 'A';
int i = (int) c; // 强制类型转换为整数,i的值为65,即字符'A'对应的ASCII码值

字符串数组转换整型数组

通过遍历将每个元素转换成int型,long包中的Intege.parseInt(str)方法

字符数组转换整型数组

getNumericValue方法将字符转换为整型

    char[] chars = "abc".toCharArray();int[] ints = new int[chars.length];for (int i = 0; i < chars.length; i++) {int numericValue = Character.getNumericValue(chars[i]);ints[i] = numericValue;}System.out.println(Arrays.toString(ints)); //[10, 11, 12]

string和stringBuilder类型转换

//string->stringBuilder 直接在创建stringBuilder对象时传参
//tringBuilder->string 调用tooString方法
StringBuilder str=new StringBuilder(astr);
String fstr=str.toString(); //此时fstr为string类型

字符串转字符数组

//字符串->字符数组
"abc".toCharArray(); //["a","b","c"]

int转string

//int -> string
Integer.parseInt(str)
//string -> int
string.valueOF(i)

装箱与拆箱

装箱(Boxing)和拆箱(Unboxing)是指基本数据类型和对应的包装类(引用类型)之间的转换。

手动

通过传参进行转换

       int a=10;
//    手动装箱  基本类型---->包装类Integer b=new Integer(a);//    手动拆箱  包装类---->基本数据类型int c= b.intValue();
自动

java内部会自动实现拆箱操作,将包装类型转换为基本类型。

//    自动装箱  基本类型---->包装类  直接将值赋给对应的包装/基本类int a=10;Integer b=a;
//    自动拆箱  包装类---->基本数据类型int c= b;

6.运算符

算术运算符

算术运算符用于执行基本的数学运算,包括加法、减法、乘法、除法、取余以及自增自减操作。

  • 加法(+):将两个数相加。
  • 减法(-):将右操作数从左操作数中减去。
  • 乘法(*):将两个数相乘。
  • 除法(/):将左操作数除以右操作数。
  • 取余(%):返回左操作数除以右操作数的余数。
  • 自增(++):将操作数的值增加1。
  • 自减(–):将操作数的值减少1。

除法运算符在处理不同数据类型时会产生不同的结果:

System.out.println(4 / 3);    // 输出:1
System.out.println(4 / 3.0);  // double 输出:1.3333333333333333
System.out.println(4 / 3f);   // float  输出:1.3333334

根据向上转型返回不同数据类型。

i++和++i

  • i++:先返回 i 的值,然后将 i 的值加1。
  • ++i:先将 i 的值加1,然后返回 i 的值。
int i = 5;
System.out.println(i++);  // 输出:5,i先返回自增前的值
System.out.println(++i);  // 输出:7,i先自增后返回自增后的值

逻辑运算符

逻辑运算符用于执行逻辑操作,常用的有与、或、非。

  • 与(&&):当且仅当两个操作数都为true时,结果为true。
  • 或(||):当两个操作数中至少有一个为true时,结果为true。
  • 非(!):用于反转操作数的逻辑状态。

逻辑运算符可能会出现短路现象,即在逻辑运算过程中,如果根据左操作数已经可以确定整个表达式的结果,则右操作数将不再计算。例如:

boolean a = false;
boolean b = true;
boolean c = true;if (a && b || c) {// 如果a为false,则不会计算b
}

关系运算符

关系运算符用于比较两个值之间的关系,返回一个布尔值。

  • 小于(<)
  • 大于(>)
  • 小于等于(<=)
  • 大于等于(>=)
  • 等于(==)
  • 不等于(!=)

移位运算符

移位运算符用于对二进制位进行移动操作。

  • 左移(<<):将操作数的所有位向左移动指定数量的位。
  • 右移(>>):将操作数的所有位向右移动指定数量的位,右移时,左边用符号位填充。
  • 无符号右移(>>>):将操作数的所有位向右移动指定数量的位,右移时,左边用0填充。

位运算符

位运算符用于对操作数的位进行操作。

  • 与(&):对两个操作数的每个位执行逻辑与操作。
  • 或(|):对两个操作数的每个位执行逻辑或操作。
  • 异或(^):对两个操作数的每个位执行逻辑异或操作(相同为0,不同为1)。
  • 非(~):对操作数的每个位执行逻辑非操作(0变为1,1变为0)。

三元运算符

三元运算符也称为条件运算符,用于根据表达式的结果选择执行不同的操作。

语法:表达式1 ? 表达式2 : 表达式3;

int value = (a == 0) ? 1 : (b + c);

如果表达式a等于0,则将1赋值给value,否则将b+c的结果赋值给value。

复合运算符

复合运算符是一种组合了赋值运算符和算术运算符的运算符,用于简化代码。

例如,+=-=*=/=等等。

7.流程控制

分支结构

分支结构用于根据条件选择不同的执行路径。

单分支:if

if (条件) {// 如果条件为真,执行这里的代码块
}

双分支:if… else

if (条件) {// 如果条件为真,执行这里的代码块
} else {// 如果条件为假,执行这里的代码块
}

多分支 if…else if… else

if (条件1) {// 如果条件1为真,执行这里的代码块
} else if (条件2) {// 如果条件2为真,执行这里的代码块
} else if (条件3) {// 如果条件3为真,执行这里的代码块
} else {// 如果以上条件都不满足,执行这里的代码块
}

Switch语句

Switch语句用于根据表达式的值选择执行不同的分支。

switch (表达式/) {case1/入口1:// 执行语句1break; // 终止当前分支的执行case2/入口2:// 执行语句2break;case3/入口3:// 执行语句3break;default:// 如果以上入口都不匹配,执行这里的语句break;
}

如果不使用break关键字,将会继续执行下一个分支。如果没有匹配的分支,将执行default分支(可选)。

循环结构

循环结构用于重复执行一段代码。

for循环

for (初始化表达式; 判断表达式; 增减表达式) {// 循环体,当判断表达式为true时执行
}

增强for循环(foreach)

for (循环变量 : 数组/集合) {// 对数组/集合中的每个元素执行相同的操作
}

while循环

while (判断表达式) {// 循环体,当判断表达式为true时执行
}

do…while循环

do {// 循环体,至少会执行一次
} while (判断表达式);

do...while循环先执行一次循环体,然后再判断条件是否满足。

8.代码块的分类

在Java中,代码块可以根据其位置和作用进行分类,包括局部代码块、构造代码块和静态代码块。

位置作用
局部代码块在方法当中使用,作用是控制变量的生命周期。 局部代码块的变量,只能在代码块内部使用,在执行结束后会被Java回收//相当于Python中函数或类中方法
构造代码块在类的成员位置使用。 在每次执行构造方法前先执行构造代码块, 可以将多个构造方法中的相同的代码放到构造代码块中,对对象进行初始化.//相当于Python类——init——构造函数,初始化对象
静态代码块在类的成员位置,代码块前添加static修饰符。一般用于给类初始化,被静态修饰的代码块仅执行一次.静态代码块是主动执行的代码块,在JVM加载类时就会执行,且最高优先权限执行 static{…}

局部代码块

局部代码块通常位于方法内部,用于控制变量的生命周期。在局部代码块中定义的变量只能在代码块内部使用,并且在代码块执行结束后会被Java回收。局部代码块的作用类似于Python中函数或类中的方法。

public void exampleMethod() {{// 这是一个局部代码块int x = 10;System.out.println("在局部代码块中:" + x);}// 这里无法访问局部代码块中定义的变量 x
}

构造代码块

构造代码块位于类的成员位置,每次执行构造方法之前都会先执行构造代码块。构造代码块可以将多个构造方法中相同的代码放到一起,对对象进行初始化。构造代码块类似于Python中的类__init__构造函数。

public class Example {{// 这是一个构造代码块System.out.println("执行构造代码块");}public Example() {// 构造方法System.out.println("执行构造方法");}
}

静态代码块

静态代码块也位于类的成员位置,但在代码块前需要添加static修饰符。静态代码块用于给类初始化,它仅在类加载时执行一次。静态代码块是被动执行的,在JVM加载类时就会执行,并且具有最高优先级。

public class Example {static {// 这是一个静态代码块System.out.println("执行静态代码块");}public static void main(String[] args) {System.out.println("执行main方法");}
}

在上面的示例中,静态代码块会在main方法执行之前先执行,并且只会执行一次。

好了,到这里,你已经掌握了java中最基础重要的内容了,动动你们的小手,一键三连,让我们进入下一篇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2799495.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

游戏配置二级缓存一致性问题解决方案

游戏服务器进程在启动的时候&#xff0c;一般会把所有策划配置数据加载到内存里&#xff0c;将主键以及对应的记录存放在一个HashMap容器里&#xff0c;这称为一级缓存。部分功能可能还需要缓存其他数据&#xff0c;这些称为二级缓存。举个例子&#xff0c;对于如下的玩家升级表…

电脑wifi丢失修复

当你打开电脑突然发现wifi功能不见了&#xff0c;可以先查看一下网卡的状态 在控制面板中找到设备管理器&#xff0c;打开就能找到网络适配器&#xff0c; 我这里是修复过的&#xff0c;wifi丢失后这里可能会显示WALN是丢失的&#xff0c;其他项显示黄色感叹号。 如何修复呢…

跳表是一种什么样的数据结构

跳表是有序集合的底层数据结构&#xff0c;它其实是链表的一种进化体。正常链表是一个接着一个用指针连起来的&#xff0c;但这样查找效率低只有O(n)&#xff0c;为了解决这个问题&#xff0c;提出了跳表&#xff0c;实际上就是增加了高级索引。朴素的跳表指针是单向的并且元素…

第十八章 Redis的使用

文章目录 1. Redis安装2. Redis的使用命令3. python使用redis 1. Redis安装 链接&#xff1a;https://pan.baidu.com/s/1EIGLFjDRxWyy1bU9Hwr_dw?pwdoloh 提取码&#xff1a;oloh 添加环境变量 Redis 启动 在命令行输入&#xff1a;redis-server 命令 设置redis数据库的…

【Vuforia+Unity】AR04-地面、桌面平面识别功能

不论你是否曾有过相关经验&#xff0c;只要跟随本文的步骤&#xff0c;你就可以成功地创建你自己的AR应用。 官方教程Ground Plane in Unity | Vuforia Library 这个功能很棒&#xff0c;但是要求也很不友好&#xff0c;只能支持部分移动设备&#xff0c;具体清单如下&#xf…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化

在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现…

4.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-模拟游戏登陆器启动游戏并且完成注入

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏启动流程的分析 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;bcf7559184863febdcad819e48aaacad9f25d633 代码下…

写一份简单的产品说明书:语言和表达技巧

在当今竞争激烈的市场环境中&#xff0c;一个好的产品说明书对于产品的销售和推广起着至关重要的作用。无论是软件、电子产品还是日用品&#xff0c;一份简洁明了、语言精准的产品说明书能够有效地传达产品的特点和使用方法&#xff0c;吸引消费者的注意力并建立信任感。接下来…

计网 - 域名解析的工作流程

文章目录 Pre引言1. DNS是什么2. 域名结构3. 域名解析的工作流程4. 常见的DNS记录类型5. DNS安全6. 未来的发展趋势 Pre 计网 - DNS 域名解析系统 引言 在我们日常使用互联网时&#xff0c;经常会输入各种域名来访问网站、发送电子邮件或连接其他网络服务。然而&#xff0c;我…

JS知识点学习

构造函数 构造函数语法: 大写字母开头的函数创建构造函数。 // 1.创建构造函数 function Pig(name) { this.name name } // 2. new关键字调用函数 // new Pig(佩奇) // 接受创建的对象 const peppa new Pig(佩奇) console.log(peppa) // {name:佩奇} …

微服务篇之监控

一、为什么要监控 1.问题定位 假设客户端查询一些东西的时候&#xff0c;需要经过网关&#xff0c;然后服务A调用服务H&#xff0c;服务H调用K&#xff0c;服务K调用MySQL&#xff0c;当查询不出来的时候&#xff0c;我们不能快速定位到底是哪个服务的问题&#xff0c;这就需要…

YOLOv5代码解读[02] models/yolov5l.yaml文件解析

文章目录 YOLOv5代码解读[02] models/yolov5l.yaml文件解析yolov5l.yaml文件检测头1--->耦合头检测头2--->解耦头检测头3--->ASFF检测头Model类解析parse_model函数 YOLOv5代码解读[02] models/yolov5l.yaml文件解析 yolov5l.yaml文件 # YOLOv5 &#x1f680; by Ult…

分组统计

目录 分组统计 根据部门编号分组&#xff0c;查询每个部门的编号、人数、平均工资 根据职位分组&#xff0c;统计出每个职位的人数、最低工资与最高工资 如果查询不使用 GROUP BY 子句&#xff0c;那么 SELECT 子句中只允许出现统计函数&#xff0c;其他任何字段不允许出现…

Global Gamers Challenge | 与 Flutter 一起保护地球

作者 / Kelvin Boateng 我们知道 Flutter 开发者热爱挑战&#xff0c;因此我们很高兴地宣布&#xff0c;新一轮的 Flutter 挑战赛来了&#xff01; 挑战https://flutter.cn/events/puzzle-hack Global Gamers Challenge 是一项为期 8 周的比赛&#xff0c;参赛者需要设计、构建…

【数据结构】单向循环链表

一、mian函数 #include <stdio.h> #include "./3.looplinklist.h" int main(int argc, const char *argv[]) {looplinklist* head create_looplinklist();insertHead_looplinklist(head,100);insertHead_looplinklist(head,200);insertHead_looplinklist(hea…

观察者模式和发布订阅模式的区别

从下图中可以看出&#xff0c;观察者模式中观察者和目标直接进行交互&#xff0c;而发布订阅模式中统一由调度中心进行处理&#xff0c;订阅者和发布者互不干扰。这样一方面实现了解耦&#xff0c;还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息&#xff0c;但…

《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表&#xff0c;每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中&#xff0c;只有在内核重启&#xff08;即操作系统重启&#xff09;或显示地删除一个消息队列时&#xff0c;该消息队列才会被真正的删除。 操作消息…

使用python构建Android,探索跨平台应用开发Kivy框架

使用python构建Android&#xff0c;探索跨平台应用开发Kivy框架 1. 介绍Kivy框架 Kivy是什么&#xff1f; Kivy是一个开源的Python跨平台应用程序开发框架&#xff0c;旨在帮助开发者快速构建创新的、可扩展的移动应用和多点触控应用。Kivy采用MIT许可证&#xff0c;允许开发…

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

Git笔记——2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、撤销修改__情况一 二、撤销修改__情况二 三、撤销修改__情况三 四、删除文件 五、理解分支 六、创建、切换和合并分支初体验 七、删除分支 八、合并冲突 总…