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);//true
        System.out.println(s3==s4);//false
        System.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的值为3

long 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:
        // 执行语句1
        break; // 终止当前分支的执行
    case2/入口2:
        // 执行语句2
        break;
    case3/入口3:
        // 执行语句3
        break;
    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.mfbz.cn/a/401002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css知识:盒模型盒子塌陷BFC

1. css盒模型 标准盒子模型&#xff0c;content-box 设置宽度即content的宽度 width content 总宽度content&#xff08;width设定值&#xff09; padding border IE/怪异盒子模型&#xff0c;border-box width content border padding 总宽度 width设定值 2. 如何…

好用的备忘录便签软件推荐哪一款?

好用的备忘录便签软件推荐哪一款&#xff1f;备忘录便签软件支持放在桌面上&#xff0c;可以辅助大家快捷记录&#xff0c;而且可以高效辅助大家进行记录&#xff0c;支持在电脑桌面显示的便签工具是比较多的&#xff0c;但是论其是否好用&#xff0c;大家还需要耐心的筛选一番…

Chromium的下载地址

Chromium的下载地址&#xff1a; Download Chromiumhttps://www.chromium.org/getting-involved/download-chromium/ https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefixWin_x64/https://commondatastorage.googleapis.com/chromium-br…

LLM之RAG实战(二十七)| 如何评估RAG系统

有没有想过今天的一些应用程序是如何看起来几乎神奇地智能的&#xff1f;这种魔力很大一部分来自于一种叫做RAG和LLM的东西。把RAG&#xff08;Retrieval Augmented Generation&#xff09;想象成人工智能世界里聪明的书呆子&#xff0c;它会挖掘大量信息&#xff0c;准确地找到…

Kafka进阶

文章目录 概要应用场景消息队列两种模式kafka的基础架构分区常见问题小结 概要 kafka的传统定义&#xff1a;kafka是一个分布式的基于发布\订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。 kafka的最新概念&#xff1a;kafka是一个开源的分布式事件流平台&#x…

一种基于动态水位值的Flink调度优化算法(flink1.5以前),等同于实现flink的Credit-based反压原理

优化flink反压 说明1 flink反压介绍1.1 介绍1.2 大数据系统反压现状1.4 flink task与task之间的反压1.5 netty水位机制作用分析 2 反压优化算法3 重点&#xff01; 但是 可但是 flink1.5以后的反压过程。4 flink反压问题的查找瓶颈办法 说明 首先说明&#xff0c;偶然看了个论…

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件&#xff0c;可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点&#xff1a; 数据备份和恢复&#xff1a;iMazing 提供了强大的数据备份和恢复功能&#xff0c;可以备份 iOS 设备上的各种数据…

Unity xLua开发环境搭建与基础进阶

Unity是一款非常流行的游戏开发引擎&#xff0c;而xLua是一个为Unity开发者提供的Lua框架&#xff0c;可以让开发者使用Lua语言来进行游戏开发。在本文中&#xff0c;我们将介绍如何搭建Unity xLua开发环境&#xff0c;并进行基础进阶的学习。 环境搭建 首先&#xff0c;我们需…

MATLAB练习题:拉马努金的恒等式

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 拉马努金是印度历史上最著名的数学家之一&#xff0c;他没有接…

【电子书】产品经理

资料 wx&#xff1a;1945423050 个人整理了一些互联网电子书 产品经理 破茧成蝶2——以产品为中心的设计革命.epub产品经理的20堂必修课.epub信息无障碍_提升用户体验的另一种视角.epub引爆用户增长.epub在你身边&#xff0c;为你设计 腾讯的用户体验设计之道.epub以匠心&…

新版Java面试专题视频教程——多线程篇①

新版Java面试专题视频教程——多线程篇① Java多线程相关面试题 0. 问题汇总0.1 线程的基础知识0.2 线程中并发安全 1.线程的基础知识1.1 线程和进程的区别&#xff1f;1.2 并行和并发有什么区别&#xff1f;1.3 创建线程的四种方式1.4 runnabl…

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

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

基于CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN&#xff08;卷积神经网络&#xff09;部分 4.2 GRU&#xff08;门控循环单元&#xff09;部分 4.3 Attention机制部分 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版…

详解 IT/OT 融合的五层架构(从PLC/SCADA到MES/ERP)

作为一个电气自动化的从业者&#xff0c;有必要搞懂下面术语的意思。 IT&#xff1a;Information Technology的缩写&#xff0c;指信息技术&#xff1b; OT&#xff1a;Operational Technology的缩写&#xff0c;指操作层面的技术&#xff0c;比如运营技术&#xff1b;CT&…

智慧城市环卫车辆监控管理方案

二&#xff0e;方案设计 智慧城市环卫系统主要包括以下几个方面&#xff1a; 1、通过 RFID 实时自动采集功能&#xff0c;自动统计了解各处垃圾桶每天清理情况&#xff1b; 2、GPS 与 DTU 透传相结合&#xff0c;实时掌握保洁及垃圾车辆的工作状态&#xff0c; 行驶路线以及任…

Vue路由缓存问题

路由缓存问题的产生 VueRouter允许用户在页面中创建多个视图&#xff08;多级路由&#xff09;&#xff0c;并根据路由参数来动态的切换视图。使用带参数的路由时&#xff0c;相同的组件实例将被重复使用。因为两个路由都渲染同一个组件&#xff0c;比起销毁再创建&#xff0c;…

OpenAI Sora 技术报告: Video generation models as world simulators

Paper name OpenAI Sora 技术报告&#xff1a;Video generation models as world simulators Paper Reading Note 官网&#xff1a;https://openai.com/sora 技术报告&#xff1a;https://openai.com/research/video-generation-models-as-world-simulators TL;DR 2024 Op…

高维数据的中介效应【中介分析】《R包:HIMA》

允许基于高级中介筛选和惩罚回归技术来估计和测试高维中介效应 Hima包浏览 高维中介示意图 图1. 在暴露和结果之间有高维中介的情况 本包的作用 在确定独立筛选和极小极大凹惩罚技术的基础上&#xff0c;采用联合显著性检验方法对调解效果进行检验。使用蒙特卡罗模拟研究来展…

鸿蒙应用/元服务开发实战-Serverless云存储没法创建处理方式

新账户&#xff0c;Serverless云存储没法创建 &#xff0c;没法进行下一步。 解决方式 请按照这个方式修改一下就能正常创建了&#xff0c;浏览器中打开控制台输入 window.top.cfpConfig.cloudStorageSwitch‘off’ 后再创建桶

二叉树基础知识总结

目录 二叉树基础知识 概念 : 根节点的五个形态 : 特殊的二叉树 满二叉树 : 完全二叉树 : 二叉搜索树 : 平衡二叉搜索树 : 二叉树的性质 : 二叉树的存储结构 二叉树的顺序存储结构 二叉树的链式存储结构 二叉树的遍历方式 : 基础概念 前中后遍历 层序遍历 :…