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

news/发布时间2024/5/15 16:04:44

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

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://www.bcls.cn/AToK/2387.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

林浩然与杨凌芸的Java List大冒险

林浩然与杨凌芸的Java List大冒险 Lin Haoran and Yang Lingyun’s Java List Adventure 在一个阳光明媚的日子&#xff0c;程序员界的“侠客”林浩然和他那聪明伶俐的同事兼好友杨凌芸正在Java王国里进行一场别开生面的大冒险。这次他们的目标是征服两个强大的List家族成员——…

Vue 中 onclick和@click区别

文章目录 一、直接上结论二、验证代码&#xff0c;可直接运行三、点击结果 一、直接上结论 onclick 只能触发 js的原生方法&#xff0c;不能触发vue的封装方法click 只能触发vue的封装方法&#xff0c;不能触发js的原生方法 二、验证代码&#xff0c;可直接运行 <!DOCTYP…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…

JMeter 配置元件之按条件读取CSV Data Set Config

实践环境 win10 JMeter 5.4.1 需求描述 需求是这样的&#xff0c;需要压测某个接口(取消分配接口)&#xff0c;请求这个接口之前&#xff0c;需要先登录系统(物流WMS系统)&#xff0c;并在登录后&#xff0c;选择并进入需要操作的仓库&#xff0c;然后请求接口&#xff0c;…

数据结构-邻接矩阵

介绍 邻接矩阵&#xff0c;是表示图的一种常见方式&#xff0c;具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。 假设一共有以下顶点&#xff0c;其连接关系如图所示 那么&#xff0c;怎么表示它们之间的连接关系呢&#xff1f; 我们发现&#xff0c;各条边所连接的都…

中科大计网学习记录笔记(十二):TCP 套接字编程

前前言&#xff1a;大家看到这一章节的时候一定不要跳过&#xff0c;虽然标题是编程&#xff0c;但实际上是对 socket 的运行机制做了详细的讨论&#xff0c;对理解 TCP 有很大的帮助&#xff1b;但是由于本节涉及到了大量的编程知识&#xff0c;对于一些朋友来说不是很好理解&…

Linux守护进程和会话

守护进程&#xff1a; 守护进程也叫精灵进程&#xff0c;是Linux中的后台服务进&#xff0c;通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事情。一般采用以d结尾的名字。 Linux后台的一些系统服务进程&#xff0c;没有控制终端&#xff0c;不能直接和用户…

2024年及以后在您的项目中使用的最佳CSS框架

在过去几年中&#xff0c;CSS已经取得了长足的进步。在过去&#xff0c;您可能会使用CSS来创建依赖于HTML表格和CSS浮动作为其布局系统的简单外观的Web应用程序。而现在&#xff0c;您可以设计复杂的交互式用户界面&#xff0c;具有优雅的设计。 尽管CSS变得越来越先进&#x…

【数据库】达梦数据库DM8开发版安装

目录 一、达梦数据库概述 1.1 达梦数据库简介 1.2 产品特性 1.3 产品架构 二、安装前准备 2.1 新建 dmdba 用户 2.2 修改文件打开最大数 2.3 挂载镜像 2.4 新建安装目录 2.5 修改安装目录权限 三、数据库安装 3.1 命令行安装 3.2 配置环境变量 四、配置实例 4.1…

自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

自动驾驶中的 DCU、MCU、MPU 1. 分布式电子电气架构2. 域集中电子电气架构架构2.1 通用硬件定义 3. 车辆集中电子电气架构4. ADAS/AD系统方案演变进程梳理4.1 L0-L2级别的ADAS方案4.2 L2以上级别的ADAS方案 5. MCU和MPU区别5.1 MCU和MPU的区别5.2 CPU与SoC的区别5.3 举个例子 R…

java面试题之SpringMVC篇

Spring MVC的工作原理 Spring MVC的工作原理如下&#xff1a; DispatcherServlet 接收用户的请求找到用于处理request的 handler 和 Interceptors&#xff0c;构造成 HandlerExecutionChain 执行链找到 handler 相对应的 HandlerAdapter执行所有注册拦截器的preHandler方法调…

Redis 单个与多节点如何实现分布式锁

分布式锁 在许多环境中&#xff0c;分布式锁是非常有用的原语&#xff0c;在这些环境中&#xff0c;不同的进程必须以互斥的方式操作共享资源。在应对并发问题时&#xff0c;Redis 客户端还可以通过加锁的方式&#xff0c;来控制并发写操作对共享数据的修改&#xff0c;从而保…

数据分析 — Matplotlib 、Pandas、Seaborn 绘图

目录 一、Matplotlib1、折线图2、柱状图3、水平条形图4、直方图5、散点图6、饼图 二、pandas1、折线图2、柱状图 三、seaborn1、散点图2、箱线图3、直方核密度图4、成对图 一、Matplotlib Matplotlib 是一个用于绘制数据可视化图形的 Python 库。它提供了丰富的绘图工具&#…

从零开始学习Netty - 学习笔记 - NIO基础 - 文件编程:FileChannel,Path,Files

3.文件编程 3.1.FileChannel FileChannel只能工作在非阻塞模式下面&#xff0c;不能和selector一起使用 获取 不能直接打开FIleChannel&#xff0c;必须通过FileInputSream&#xff0c;或者FileOutputSetream &#xff0c;或者RandomAccessFile来获取FileChannel 通过FileIn…

如何使用Docker本地部署Jupyter+Notebook容器并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)

文章目录 10.1 构建微服务架构 - 探索 Go 语言的微观世界10.1.1 基础知识讲解10.1.2 重点案例:订单处理系统订单服务测试服务10.1.3 拓展案例 1:用户认证服务安装所需的包实现用户模型和存储实现 JWT 生成和验证实现认证服务测试服务10.1.4 拓展案例 2:商品推荐服务设计商品…

深入浅出熟悉OpenAI最新大作Sora文生视频大模型

蠢蠢欲动&#xff0c;惴惴不安&#xff0c;朋友们我又来了&#xff0c;这个春节真的过的是像过山车&#xff0c;Gemini1.5 PRO还没过劲&#xff0c;OpenAI又放大招&#xff0c;人类真的要认输了吗&#xff0c;让我忍不住想要再探究竟&#xff0c;到底是什么让文生视频发生了质的…

Fiddler工具 — 19.Fiddler抓包HTTPS请求(二)

5、查看证书是否安装成功 方式一&#xff1a; 点击Tools菜单 —> Options... —> HTTPS —> Actions 选择第三项&#xff1a;Open Windows Certificate Manager打开Windows证书管理器。 打开Windows证书管理器&#xff0c;选择操作—>查看证书&#xff0c;在搜索…

建造者模式

1.模式定义: 将一个复杂对象的创建与他的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示 2.应用场景 1.需要生成的对象具有复杂的内部结构 2.需要生成的对象内部属性本身相互依赖 3.与不可变对象配合使用 3.优点&#xff1a; 1、建造者独立&#xff0c;易扩展…

Django视图

HttpRequests对象 利用http协议向服务器传参的4种途径 提取url特定部分&#xff0c;如/web/index/&#xff0c;可以通过在服务器端的路由中用正则表达式截取查询字符串&#xff0c;形如?key1value&keyvalue2&#xff0c;&#xff08;&#xff1f;前面是路由&#xff0c;…
推荐文章