当前位置: 首页 > news >正文

[Java基本语法] 逻辑控制与方法

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述
✒️ 今天开始,Java基本语法模块将进行重构.以保证文章质量.

目录

  • 1. 逻辑控制
    • 1.1 顺序结构
    • 1.2 分支结构
      • 1.2.1 if语句
      • 1.2.2 switch语句
    • 1.3 循环结构
      • 1.3.1 while循环
      • 1.3.2 break
      • 1.3.3 continue
      • 1.3.4 for循环
    • 1.4 输入与输出
      • 1.4.1 输出到控制台
      • 1.4.2 从键盘输入
  • 2. 方法的使用
    • 2.1 方法的概念与使用
      • 2.1.1 什么是方法
      • 2.1.2 方法的定义
      • 2.1.3 方法调用的执行过程
      • 2.1.4 实参和形参的关系
    • 2.2 方法的重载
      • 2.2.1 方法重载的概念
      • 2.2.2 方法签名
    • 2.3 递归
      • 2.3.1 递归的概念
      • 2.3.2 递归执行过程分析

1. 逻辑控制

1.1 顺序结构

顺序结构比较简单,按照代码书写一行一行地执行就可以.

System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");// 运行结果
//aaa
//bbb
//ccc

1.2 分支结构

1.2.1 if语句

  1. 语法格式1
if(布尔表达式){// 语句
}

如果布尔表达式结果为true,执行if中的语句,否则不执行.

  1. 语法格式2
if(布尔表达式){// 语句1
}else{// 语句2
}

如果布尔表达式结果为true,则执行if中语句,否则执行else中语句.

  1. 语法格式
if(布尔表达式1){// 语句1
}else if(布尔表达式2){// 语句2
}else{// 语句3
}

表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3.
[建议] if/else语句下只有一条语句的时候,可以不加花括号,此时的else和最接近的if匹配.但是实际开发中,我们不建议这样写,最好加上大括号.

int x = 10;
int y = 10;
if (x == 10) if (y == 10)System.out.println("aaa");
else System.out.println("bbb");//虽然和第3行的if对齐,但是是和第4行的if匹配.

1.2.2 switch语句

  • 基本语法:
switch(表达式){case 常量值1:{语句1;[break;]}case 常量值2:{语句2;[break;]}...default:{内容都不满足时执行语句;[break;]} 
}
  • 执行流程
  1. 先计算表达式的值
  2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束
  3. 当表达式的值没有与所列项匹配时,执行default.
  • 注意事项
    • 多个case后的常量值不可以重复
    • switch的括号内不能是以下类型的数据:float,double,boolean,long.
    • break不要遗漏,否则就会失去多分支选择的效果.

1.3 循环结构

1.3.1 while循环

  • 语法格式
while(循环条件){循环语句;
}

循环条件为 true, 则执行循环语句; 否则结束循环.
[建议]

  • 和if类似,while下面可以不写花括号,但是不写的时候只能支持一条语句,建议还是加上花括号.
  • 和if类似,while后面的{建议和while写在同一行.

1.3.2 break

break 的功能是让循环提前结束.
示例:找到 100 - 200 中第一个 3 的倍数

int num = 100;
while (num <= 200) {if (num % 3 == 0) {System.out.println("找到了 3 的倍数, 为:" + num);break;}num++;
}

1.3.3 continue

continue 的功能是跳过这次循环, 立即进入下次循环.
示例:找到 100 - 200 中所有 3 的倍数

int num = 100;
while (num <= 200) {if (num % 3 != 0) {num++; continue;}System.out.println("找到了 3 的倍数, 为:" + num);num++;
}

执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句.

1.3.4 for循环

  • 基本语法
for(表达式①;布尔表达式②;表达式③){表达式④;
}
  • 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
  • 表达式2: 循环条件,满则循环继续,否则循环结束
  • 表达式3: 循环变量更新方式
    [注意事项] 和while类似,不再赘述

1.4 输入与输出

1.4.1 输出到控制台

  • 基本语法
System.out.println(msg);            // 输出一个字符串, 带换行
System.out.print(msg);              // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
  1. println 输出的内容自带 \n, print 不带 \n
  2. printf 的格式化输出方式和C 语言的 printf 是基本一致的.

示例:

System.out.println("hello world");int x = 10;
System.out.printf("x = %d\n", x)

1.4.2 从键盘输入

使用 Scanner 读取字符串/整数/浮点数.
举例说明:

import java.util.Scanner;  // 需要导入 util 包Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close(); // 注意, 要记得调用关闭方法

解释:

  • 创建一个Scanner类型的对象,使用sc引用.
  • 之后调用sc中的next()系列的方法.
    • next():返回字符串,自动消除有效字符之前的空格,直到结束符.(换行)
    • nextLine():返回字符串,不会自动消除空格,录入所有的字符,直到回车.
    • nextInt():返回十进制整数.
    • nextFloat():返回浮点数.
  • sc实质上是一个流对象的引用,我们在最后需要关闭.

2. 方法的使用

2.1 方法的概念与使用

2.1.1 什么是方法

方法就是一个代码片段. 类似于 C 语言中的 “函数”.

  1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
  2. 做到代码被重复使用, 一份代码可以在多个位置使用.
  3. 让代码更好理解更简单.
  4. 直接调用现有方法开发, 不必重复造轮子.

2.1.2 方法的定义

  • 语法格式
修饰符 返回值类型 方法名称([参数类型 形参 ...]){方法体代码;[return 返回值];
}

示例:判断一个年份是否是闰年

public class Method{// 方法定义public static boolean isLeapYear(int year){if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){return true;}else{return false;}}
}

[注意事项]

  1. 修饰符:现阶段直接使用public static 固定搭配
  2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void,注意这里的返回值 和c语言有所不同,这里返回的参数还可以是数组类型.
  3. 方法名字:采用小驼峰命名
  4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
  5. 方法体:方法内部要执行的语句
  6. 在java当中,方法必须写在类当中
  7. 在java当中,方法不能嵌套定义.

2.1.3 方法调用的执行过程

调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行

  • 方法参数传递的注意事项
  1. 匹配参数的个数
  2. 匹配参数的类型
  3. 匹配参数的顺序
  4. 匹配返回值的类型

2.1.4 实参和形参的关系

方法的形参相当于数学函数中的自变量,比如:1 + 2 + 3 + … + n的公式为sum(n) = (1+n)*n/2.
Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值.

public static int getSum(int N){    // N是形参return (1+N)*N / 2;
}
getSum(10);      // 10是实参,在方法调用时,形参N用来保存10
getSum(100);     // 100是实参,在方法调用时,形参N用来保存100

[注意] 在Java中,实参的值永远都是临时拷贝到形参中,形参和实参本质是两个实体.
代码实例:交换两个整形变量.

public class TestMethod {public static void main(String[] args) {int a = 10;int b = 20;swap(a, b);System.out.println("main: a = " + a + " b = " + b);}public static void swap(int x, int y) {int tmp = x;x = y;y = tmp;System.out.println("swap: x = " + x + " y = " + y);}
}// 运行结果
//swap: x = 20 y = 10
//main: a = 10 b = 20

可以看到,在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功.

  • 原因解释:
    实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响.
    在这里插入图片描述
    [总结] 对于基础类型来说,形参相当于实参的拷贝.即传值调用.
  • 解决办法
    使用引用类型参数.(比如数组)
public class TestMethod {public static void main(String[] args) {int[] array = {10, 20};swap(array);System.out.println("array[0] = " + array[0] + " array[1] = " + array[1]);}public static void swap(int[] arr) {int tmp = arr[0];arr[0] = arr[1];arr[1] = tmp;}
}// 运行结果
//arr[0] = 20 arr[1] = 10

在这里插入图片描述

2.2 方法的重载

2.2.1 方法重载的概念

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了.
参数列表不同一般指的是:个数,数据类型,或者是顺序不同.
返回值的类型是否一样,不影响方法的重载.即只有方法的名字是一样的,参数列表必须修改,返回值类型可以修改.
举例:下面这几个方法就相互构成重载.

public class TestMethod {public static void main(String[] args) {add(1, 2);                // 调用add(int, int)add(1.5, 2.5);            // 调用add(double, double)add(1.5, 2.5, 3.5);       // 调用add(double, double, double)}public static int add(int x, int y) {return x + y;}public static double add(double x, double y) {return x + y;}public static double add(double x, double y, double z) {return x + y + z;}
}

2.2.2 方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字

2.3 递归

2.3.1 递归的概念

从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:
"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:
“从前有座山,山上有座庙…”
“从前有座山……”
在这里插入图片描述
上面这个故事有一个特征:自身中又包含了自己.我们从而引出递归的概念.
一个方法在执行过程中调用自身, 就称为 “递归”.
递归的必要条件:

  • 将原问题划分为其子问题.但子问题和原问题的解法相同.
  • 递归结束条件

示例:递归求n的阶乘

public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);
}public static int factor(int n) {if (n == 1) {return 1;}return n * factor(n - 1); // factor 调用函数自身
}// 执行结果
//ret = 120

2.3.2 递归执行过程分析

我们还是那上面n的阶乘来说明:

public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);
}public static int factor(int n) {System.out.println("函数开始, n = " + n);if (n == 1) {System.out.println("函数结束, n = 1 ret = 1");return 1;}int ret = n * factor(n - 1);System.out.println("函数结束, n = " + n + " ret = " + ret);return ret;
}// 执行结果
//函数开始, n = 5
//函数开始, n = 4
//函数开始, n = 3
//函数开始, n = 2
//函数开始, n = 1
//函数结束, n = 1 ret = 1
//函数结束, n = 2 ret = 2
//函数结束, n = 3 ret = 6
//函数结束, n = 4 ret = 24
//函数结束, n = 5 ret = 120
//ret = 120

在这里插入图片描述

相关文章:

[Java基本语法] 逻辑控制与方法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…...

新手教学系列-​​​​​​基础知识(SSH使用)

基础知识(SSH使用) 什么是ssh Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[2]。虽然任何网络服务都可以通过SSH实现安全传输,SS…...

如何通过细节处理,让展馆展示效果倍增?

如今&#xff0c;企业展览馆已经成为企业树立形象、产品推广的重要平台&#xff0c;他们利用当下流行的多媒体技术&#xff0c;精心设计出一个展览馆&#xff0c;不仅能够吸引观众的眼球&#xff0c;还能够让企业品牌形象更加突出&#xff0c;不过想要制作出一个优质的企业展览…...

汽车IVI中控开发入门及进阶(二十九):i.MX6

前言: i.MX 6双/6Quad处理器集成多媒体应用处理器,是不断增长的多媒体产品系列的一部分,提供高性能处理,并针对最低功耗进行了优化。 i.MX 6Dual/6Quad处理器采用先进的quad-ArmCortex-A9内核,运行速度高达800 MHz,包括2D和3D图形处理器、1080p视频处理和集成电源管理。…...

2024-Pop!_OS新版本,新桌面环境的消息

原文:A Blog to Satisfy Your Monthly COSMIC Fix(es) - System76 Blog Pop!_OS开发团队正在为他们的发行版开发一个定制桌面。这个新的桌面环境被称为COSMIC&#xff0c;是用Rust语言编写的&#xff0c;超快的COSMIC应用商店几乎已经实现&#xff01;alpha版本只剩下一些次要…...

三分钟了解链动3+1模式

在电商领域的营销策略中&#xff0c;链动31模式以其独特的魅力和优势&#xff0c;吸引了众多商家的目光。下面&#xff0c;我们将对这一模式进行深度剖析&#xff0c;并探讨其相较于链动21模式的优势所在。 一、身份设置与奖励机制 链动31模式在身份设置上分为三种&#xff1…...

加密excel(Python)

文章目录 一、EXCEL加密 一、EXCEL加密 import randomfrom win32com.client import Dispatchdef random_password(length20):默认返回20位随机密码key ""characters "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"for i in range(l…...

解决Unity-2020 安卓异形屏黑边

背景 Unity 2020.3.17 版本开发的游戏&#xff0c;打apk包&#xff0c;发现两个问题 如图下午所示&#xff0c;实体白色导航栏&#xff0c;阻挡了整个安卓UI界面&#xff0c;难看还影响美观。 安卓系统 12-13 版本手机&#xff0c;异形屏。一侧安全区黑边遮挡&#xff0c;占空间…...

python-给你比个五彩斑斓的❤️

import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import LineCollectiont np.linspace(0, 2 * np.pi, 1000) x 16 * np.sin(t)**3 y 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t)# 创建一个颜色序列 colors …...

【Go】使用Go语言实现AES CBC No Padding加密和解密

冷雨悄悄停吧 天真的心因为你 那管多风雨天仍和你一起 告诉你我其实多么的想你 其实我我真的爱着你 &#x1f3b5; 蒋明周《真的爱着你》 引言 高级加密标准&#xff08;AES&#xff09;是一种广泛使用的加密算法。它可以工作在多种模式下&#xff0c;最…...

安装VS Code 提示This User Installer is not meant to be run as an Administrator问题

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 在vs code官网&#xff08;https://code.visualstudio.com/&#xff09;下载安装包&#xff0c;显示如下提示信息&#xff1a; This User Installer is not meant to be run as an Administrator.…...

keepalived服务详解与实验 基于centos8

目录 keepalivedHA简介常用的高可用软件keepalived简介 keepalived常用模块keepalived功能简介keepalived常用文件keepalived配置文件详解keepalived实验1-上手环境准备安装服务主配置文件修改启动服务效果查看 keepalived脑裂1. 脑裂现象简介2. 脑裂的原因3. 脑裂的预防和解决…...

vue技巧(十)全局配置使用(打包后可修改配置文件)

1、背景 vue打包目前主流用的有webpack和vite两种&#xff0c;默认用的webpack。&#xff08;二者的区别大家可以各自上网查&#xff0c;我没用过vite&#xff0c;所以不过多介绍&#xff09;vue通过webpack打包后&#xff0c;源码会被压缩&#xff0c;但一些关键配置可…...

计算机网络 —— 运输层(运输层概述)

计算机网络 —— 运输层&#xff08;运输层概述&#xff09; 运输层运输层端口号复用分用复用&#xff08;Multiplexing&#xff09;分用&#xff08;Demultiplexing&#xff09; 常用端口号页面响应流程 我们今天进入到运输层的学习&#xff1a; 运输层 我们之前学习的物理层…...

BKP备份寄存器RTC实时时钟

BKP备份寄存器&RTC实时时钟 VDDA和VSSA是内部模拟部分的电路 VDD和VSS_1、2、3是内部数字电路的供电。系统以VDD开头的电源都是主电源。在正常使用STM32时&#xff0c;全部需要接到3.3v电源上。 VBAT备用电池供电引脚&#xff0c;如使用STM32内部的BKP和RTC&#xff0c;引…...

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…...

IEEE754、linear11、linear16浮点数应用原理

IEEE754、linear11、linear16浮点数应用原理 1 浮点数应用1.1 IEEE754 浮点数标准1.2 PMBUS浮点数格式 2 浮点数原理2.1 IEEE754 浮点数解析2.2 PMBUS浮点数解析 3 浮点数代码应用3.1 IEEE754 浮点数应用3.1.1 将浮点变量赋值&#xff0c;直接打印整型&#xff08;32位&#xf…...

6、 垃圾回收 浏览器事件循环

垃圾回收 & 浏览器事件循环 垃圾回收引用计数算法标记清除&#xff08;mark-sweep&#xff09;算法标记整理&#xff08;Mark-Compact&#xff09;算法 内存管理浏览器事件循环宏任务微任务整体流程 垃圾回收 垃圾回收&#xff0c;又称为&#xff1a;GC&#xff08;garbag…...

Java多线程面试重点-2

16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法&#xff0c;是对类进行加锁&#xff08;Class对象&#xff09;&#xff0c;如果该类中有methodA和methodB都是被Synch修饰的静态方法&#xff0c;此时有两个线程T1、T2分别调用methodA()和methodB()&#x…...

LLaMA Factory多卡微调的实战教程(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

IOUtils的妙用

查看IOUtils的api文档&#xff0c;它的方法大部分都是重载的&#xff0c;方法的用法总结如下&#xff1a; 方法名使用说明buffer将传入的流进行包装&#xff0c;变成缓冲流。并可以通过参数指定缓冲大小closeQueitly关闭流contentEquals比较两个流中的内容的是否一致copy将输入…...

目标检测——室内服务机器人LifelongSLAM数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …...

Mysql学习笔记-进阶篇

一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层&#xff1b; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是库的&#xff0c;所以存储引擎也可被称为表类型。 1&#xff09;在创…...

AI写真:ControlNet 之 InstantID

但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好&#xff0c;SDXL 模型上的表现较差&#xff0c;不能用于实际生产。可是很多同学已经在使用SDXL了&#xff0c;而且SDXL确实整体上出图效果更好&#xff0c;怎么办&#xff1f; 这篇文章就来给大家介绍一个在SDXL中创作A…...

单元测试的思考与实践

1. 什么是单元测试 通常来说单元测试&#xff0c;是一种自动化测试&#xff0c;同时包含一下特性&#xff1a; 验证很小的一段代码&#xff08;业务意义 或者 代码逻辑 上不可再分割的单元&#xff09;&#xff0c;能够更准确的定位到问题代码的位置 能够快速运行&#xff08;…...

C# Socket通讯简单Demo

C# Socket通讯简单Demo Client端Listener端 Client端 static void Main(string[] args) {XSocketService XSocketService new XSocketService();XSocketService.Init();while (true){Console.Write("请输入消息&#xff1a;");var msg Console.ReadLine();XSocket…...

视频融合共享平台LntonCVS视频监控管理平台技术方案详细介绍

LntonCVS国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发&#xff0c;提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能&#xff0c;包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲…...

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时&#xff0c;希望可以在单元格显示图片或其他控件&#xff0c;发现原生的ListView不支持&#xff0c;于是通过拓展&#xff0c;实现ListView可以显示任意控件的功能&#xff0c;效果如下&#xff1a; 实现方法 本来想着在单元格里面实现控件的自绘的…...

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践

随着企业业务的不断发展&#xff0c;数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长&#xff0c;普遍选择采用分库分表技术作为应对方案。然而&#xff0c;这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1&#xff1a;难以保证数据一致性。由于分库分…...

3个火火火的AI项目,开源了!

友友们&#xff0c;今天我要给你们安利三个超酷的开源项目&#xff0c;它们都和AI有关&#xff0c;而且每一个都能让你的日常生活变得更加有趣和便捷&#xff01;(最近AI绘图又又超神了&#xff0c;分享以下美图养眼) 01 字节出品&#xff0c;文字转语音Seed-TTS 字节推出了一…...