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

2 Java的基本程序设计结构(基本语法1)

文章目录

  • 前言
  • 一、数据类型
    • 0 与Python的一些区别
    • 1 基本数据类型
      • (1)整型
      • (2)浮点数类型
      • (3)字符(char)类型
      • (4)布尔类型(true、false)
      • (5)代码示例
    • 2 引用数据类型
  • 二、变量与常量
    • 1 变量
    • 2 常量(*)
    • 3 枚举类型变量(*)
    • 4 变量的作用域
  • 三、变量和类起名规范
    • 1 硬性要求(变量、方法、类通用)
    • 2 软性要求(不遵守没关系,只是一些建议)
      • (1)小驼峰命名法:方法、变量
      • (2)大驼峰命名法:类名、文件名
      • (3)下划线分隔法(我自己习惯的):变量、方法
  • 四、java重要的两个包 java.lang和 java.util
    • 1 java.lang 包
    • 2 java.util 包
  • 五、输入与输出方法
    • 1 简单打印输出 System.out.println("hello world!");
    • 2 格式化打印输出
      • (1)System.out.printf(formatString, arg1, arg2, ...);
      • (2)格式化语法
      • 示例详解
        • 示例 1:基本浮点数格式化
        • 示例 2:整数格式化
        • 示例 3:字符串格式化
      • 综合示例
    • 3 输入(键盘录入)Scanner类()
  • 六、生成随机数(Random类)
    • (1)nextInt(int bound): 生成一个范围在0(包括)到指定bound(不包括)之间的随机int值。不指定bound就是随机生成一个int值
    • (2)nextDouble(): 生成一个范围在0.0(包括)到1.0(不包括)之间的随机double值。不能指定范围
  • 七、运算符
    • 1 算术运算符
      • 补充:类型的隐式转换和强制转换(!!!重要)
        • (1)隐式转换(自动类型提升)
        • (2)强制转换 --- 数据类型互相转换
        • (3)字符串的 + 连接操作 和 字符的 + 运算
          • 字符串(String)的 + 连接操作
          • 字符(char)的 + 运算
    • 2 自增自减运算符
    • 3 赋值运算符
    • 4 比较(关系)运算符
    • 5 逻辑运算符
      • (1)四种常规逻辑运算符
      • (2)两种短路逻辑运算符
    • 6 三元(条件)运算符
    • 6 位运算符(*)
  • 八、判断与循环语句
    • 1 判断分支结构 if 和 switch
      • (1)if 分支结构
      • (2)switch分支结构
    • 2 循环结构
      • (1)for循环
      • (2)while循环
      • (3)do...while循环
      • (4)循环控制语句break和continue
  • 九、练习
    • 1 逢七过
    • 2 求平方根
    • 3 求质数
    • 4 猜数字小游戏


前言


一、数据类型

java数据类型分为两大类:基本数据类型和引用数据类型

  • 基本数据类型:整数、浮点数、字符(char)、布尔类型
  • 引用数据类型:封装在类对象里面的数据类型,字符串(不可变)、数组(可变)、集合(可变)、字典(可变)

0 与Python的一些区别

我们主要的目的就是为了搞清楚这些和Python里面有什么异同。
首先,Python传参传的全是传引用。

给出java里面传参规则:

  • 基本数据类型是传值:即传递的是这个变量的值的副本;

  • 引用数据类似是传引用:一般情况下传引用会修改一个就会影响另一个;但如果在类里面规定不可修改,其实也可以实现不影响另一个的;
    典型例子就是java里面的字符串是引用数据类型,但是不可变;对原字符串修改其实是新创建一个字符对象在赋值过去,并不是在原来的内存地址上面修改。

基本数据类型需解释一下这里和Python的区别,用整数来说吧。
Python里面整数是不可修改的,传的是引用,

  • 修改是新创建一个整数对象在赋值过去;
  • 且在函数中传参于全局变量与局部变量的关系和Python不可变数据类型的特殊修改方式,导致在函数内部修改不会影响外部的全局变量,因为内部只是一个局部变量;下面代码中的两个 a 实际上是两个不一样的东西,一个放在全局空间,一个放在局部空间。

但在java中,基本数据类型传的是值的副本。什么叫副本就是一个完全不相关的东西,修改一个不会影响另一个的那种。

  • 先说一下修改吧,java中基本数据类型是存在一个栈中,单独没有独立的内存地址(你当他有也行),我们就当它有吧,进行修改操作就直接是在原内存上修改值就可以了。意思理解成假设java中整数有地址,a = a + 1这种操作是在原地址上操作。
  • 然后就是函数传参,由于传参传的是值的副本,那函数内怎么修改肯定不会影响外面的了。
a = 10
def f(a):a = a+1
f(a)
public class Main {public static void main(String[] args) {int a = 10;modifyValue(a);     // 11   内部自动新创建了一个a的值的副本变量传了进去System.out.println("Outside method: " + a);  // 10}public static void modifyValue(int x) {   x = x + 1;System.out.println("Inside method: " + x);}
}

在这个例子中,a 是一个整数变量,初始值为10。当我们将 a 传递给 modifyValue 方法时,传递的是 a 的值的副本(即10)。在 modifyValue 方法内部,对参数 x 的修改不会影响外部的 a。这就是Java中基本类型按值传递的体现。
python里面用全局变量与局部变量解释,java里面更简单直接用传的是值的副本就可以解释了。

相信还有一个疑问,在Python中的不可变和java中的不可变什么意思;
整数在Python和java中都是不可变的,不可变指的是一个数据类型创建了,它的内存地址就不能改变。Python中直接就硬到底,整数对象生成了就赖在那个地方了;java宽松一点,地址不能变,但里面值还是可以变的。

数组这种虽然最外层的地址不可以变,但内部的其他地址随时都可以变,那就可变了呗。

【注】:java里面基本数据类型都看做不可变数据类型 ,不可变指的是地址不可变。对象创立了,无论内部地址还是外部地址都不能变的那种。如此看来,虽然Python和java内部规则有不同,但最终结果却是一样的,我们直接可以无缝衔接上。
所以看很多博客将Python的不可变数据函数传参解释成 ‘传值’ 也是有道理的,毕竟和真的传值最后结果是一样的,不过我们还是要牢牢记住还是传引用的。虽然最后结果一样,但档次不一样嘛,拿出去吹牛皮也好啊!

在函数内部Python和java还是有一个奇奇怪怪的区别:

a = 10
def add(a):a = 5      # 在Python中,函数内部这种 a 是创建了一个新的局部变量,并不是传进来的那个 a,# 可以看到,上面括号里面的a还是灰色的,说明压根没用上海
add(a)
print(a)   # 10lst = [1, 2, 3, 4, 5]
def add2(lst):lst = [1]add2(lst)
print(lst)   # [1, 2, 3, 4, 5]
public class Main {public static void main(String[] args) {int a = 10;modifyValue(a);     // 20System.out.println("Outside method: " + a);  // 10}public static void modifyValue(int x) {x = 20;       // java这里并没有创建局部变量(很显然没有声明变量的语法),说明用的就是传进来的 x ,和Python不一样System.out.println("Inside method: " + x);}
}

奇奇怪怪的吧!这些如果不注意不一定能发现!奇奇怪怪的知识又增加了。

1 基本数据类型

(1)整型

类型存储需求取值范围
int4字节-2 147 483 648 ~ 2 147 483 647(略高于20亿)
short2字节-32 768 ~ 32 767
long8字节-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
byte1字节-128 ~ 127

【注】:通常情况下 int 最常用,long也常用;short和byte类型主要在特定场合下用。
【特别注意】:使用long时需要再数据后面加一个大写或小写 L ,类似 long a = 999999999L。其他的正常,就long有点神经病

(2)浮点数类型

类型存储需求取值范围
float4字节大约 ± 3.40282347 × 1 0 38 \pm 3.402 823 47\times 10^{38} ±3.40282347×1038(6~7位有效数字)
double8字节大约 ± 1.79769313486231570 × 1 0 308 \pm 1.79769313486231570\times 10^{308} ±1.79769313486231570×10308(15位有效数字)

【注】:double的精度是float的两倍,故也称为双精度;通常float类型的精度并不能满足要求,因此用的少,实际中还是要用double
【特别注意】:由于默认是double,所以使用float是数据后面要加一个大写或小写的F,类似 float a = 0.99F

另外,有三个特殊的浮点数表示溢出和出错情况:

  • 正无穷大 :Double.POSITIVE_INFINITY
  • 负无穷大 : Double.NEGATIVE_INFINITY
  • NaN(不是一个数,或者称为一个无法表示的浮点数),例如 0/0 就出现 NaN : Double.NaN

【注】不能用 == 判断一个特定结果是否是Double.NaN ,但是可以用 Double.isNaN(x)

if (x==Double.NaN)   // 会报错if (Double.isNaN(x))  // 这样才行

【注】这里关于数据类型的取值大小关系:double>float>long>int>short>byte

(3)字符(char)类型

类型符号取值范围
字符char0-65535(这里是指编码表里对应的数,一般是Unicode编码)

(4)布尔类型(true、false)

类型符号取值范围
布尔booleantrue、false

(5)代码示例

public class HelloWord{public static void main(String[] args) {// intint i = 9999999;System.out.println(i);// shortshort s = 9999;System.out.println(s);// bytebyte b = 100;System.out.println(b);// longlong l = 999999999999999999L;    // long类型后面要加一个大写或小写LSystem.out.println(l);// doubledouble d = 0.98;System.out.println(d);// floatfloat f = 0.98F;       // float类型后面要加一个大写或小写FSystem.out.println(f);// charchar c = 'a';         // 字符必须用单引号System.out.println(c);// booleanboolean t = true;System.out.println(t);}
}

2 引用数据类型

  • 引用数据类型:封装在类对象里面的数据类型,字符串(不可变)、数组(可变)、集合(可变)、字典(可变)

【注】:这里只对字符串做一个简单的解释,具体的需要学到具体的在说

类型符号注意
字符串(不可变)Stringjava中字符串必须使用双引号
public class HelloWord{public static void main(String[] args) {String a = "hello world!";   // java中字符串必须使用双引号System.out.println(a);}
}

二、变量与常量

1 变量

使用语法

  • 声明变量: 数据类型:变量名; 数据类型:变量名; 数据类型:变量名;
  • 初始化变量: 数据类型:变量名 = 数据值; 数据类型:变量名=数据值; 数据类型:变量名=数据值;
public class HelloWord{public static void main(String[] args){int a;                  // 声明变量a = 10;System.out.println(a);  // 10double b = 2.0;          // 声明变量+初始化b = b + 10;System.out.println(b);   // 12.0int i,j = 0, 1; System.out.println(i,j);}}

【注】:声明变量类型只需要声明一次即可,声明过后后面再用直接用变量名即可;声明变量和变量初始化可以同时进行;
另外,声明变量名时声明变量名不能相同。

与Python相比的小细节

  • java支持同时声明多个变量,但多重赋值语法和Python有区别
  • java的打印函数不支持Python一样同时打印多个变量
public class HelloWord{public static void main(String[] args){int i,j;i = 0;j = 1;System.out.println(i);    // 0System.out.println(j);    // 1int a = 4 , b =5;         // java的多重赋值语法System.out.println(a);    // 4System.out.println(b);    // 5System.out.println

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 外包干了1个月,技术明显退步。。。
  • SparkStreaming--scala
  • Apache访问机制配置
  • 阿里通义音频生成大模型 FunAudioLLM 开源
  • el-popover或el-popconfirm中button不展示问题
  • 从零开始学习c++全套通关系列(第二章)万字总结,建议收藏!
  • 混合贪心算法求解地铁线路调度
  • 结合C++智能指针聊聊观察者模式
  • WPF 框架 Prism IActiveAware接口使用
  • 前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)
  • boost::regex_replace的使用
  • 海外ASO:iOS与谷歌优化的相同点和区别
  • LabVIEW电子水泵性能测试平台
  • 四个“一体化”——构建数智融合时代下的一站式大数据平台
  • 印尼Facebook直播网络需要达到什么要求?
  • php的引用
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Angular 响应式表单 基础例子
  • angular2开源库收集
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Redux系列x:源码分析
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 在weex里面使用chart图表
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Prometheus VS InfluxDB
  • Semaphore
  • ​浅谈 Linux 中的 core dump 分析方法
  • %@ page import=%的用法
  • (C++17) std算法之执行策略 execution
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第一天)包装对象、作用域、创建对象
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)ORM
  • (转载)Linux网络编程入门
  • .form文件_一篇文章学会文件上传
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Micro Framework初体验
  • .NET 反射的使用
  • .net 后台导出excel ,word
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net2005怎么读string形的xml,不是xml文件。
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .Net中的集合
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [04]Web前端进阶—JS伪数组
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [Android]常见的数据传递方式
  • [BFS广搜]迷阵
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)