Java 基础:变量、操作符、代码块和控制流

news2025/1/17 3:06:04

目录

一、变量:Variables

1、基本数据类型

2、数组

二、操作符/运算符 Operators

三、表达式、语句和代码块

四、程序控制流


一、变量:Variables

Java 定义了以下几种变量:

  1. 实例变量/成员变量(非静态字段):Java 对象将它们各自的状态存储在“非静态字段”中,非静态字段,也就是没有使用 static 关键字声明的字段。非静态字段也被称为实例变量,因为它们的值对于每个实例(对象)都是唯一的;一辆自行车的速度与另一辆自行车的速度都是独立的。
  2. 类变量(静态字段):类变量是用 static 修饰符声明的字段;static 修饰符的作用是告诉编译器,不管类实例化了多少次,这个变量只存在一个副本。代码 static int numGears = 6;声明了一个静态字段。此外,也可以添加 final 关键字,以表明 numGears 的值永远不会改变
  3. 局部变量:对象的状态存储在非静态字段中,而方法通常将临时状态存储在局部变量中。局部变量仅对声明它们的方法可见;该类中的其他部分无法访问该方法的局部变量。
  4. 参数:在 Java 的 main 方法中:public static void main(String[] args),args 变量是这个方法的参数。参数总是被归类为“变量”而不是“字段”。

1、基本数据类型

Java 支持 8 种基本数据类型:// 8-bit 为 1 字节

        byte:字节类型是一个 8-bit、有符号的二进制补码整数。最小值为 -128,最大值为127(含)。在大型数组中,字节类型对于节省内存空间非常有用。

        short:短整型数据类型为 16-bit、有符号的二进制补码整数。最小值为 -32,768,最大值为32,767(含)。与 byte 一样,在节省内存非常重要的情况下,可以使用 short 来节省内存。

        int:int 数据类型是 32-bit、有符号的二进制补码整数。对于整数值,默认使用此类型。

        long:长整型数据类型为 64-bit、有符号的二进制补码整数。当需要表示的值范围大于 int 类型时,使用此数据类型进行替代。

        float:float 数据类型是一个单精度、32-bit 的浮点数。与 byte 和 short 一样,如果需要在大型浮点数数组中需要节省内存,则应该使用 float(而不是double)。注意,这种数据类型永远不应该用于精确的值,比如货币。如果要表示货币类型,应该使用  java.math.BigDecimal 替代。

        double:double 数据类型是一个双精度、64-bit 的浮点数。对于小数值,默认使用此类型。同样,这种数据类型永远不应该用于精确的值,比如货币。// 计算会出现误差

        boolean:布尔型数据类型只有 true 和 false 两种可能的值。这种数据类型表示一个 bit 的信息,但它的“大小”并不是精确定义的。

        char:char 数据类型是一个16-bit 的 Unicode 字符。它的最小值为 '\u0000'(或0),最大值为 '\uffff'(或65,535含)。// 16-bit -> 2字节

        除了上面列出的 8 种基本数据类型之外,Java 还通过 Java .lang. String 类提供了对字符串的支持。使用双引号括住一个字符串就会自动创建一个新的 String 对象;例如,String s = "this is a String ";字符串对象是不可变的,这意味着一旦创建,它们的值就不能更改

(1)基本数据类型的默认值

        声明一个字段时并不一定需要进行赋值。对于已声明但未被初始化的字段,编译器会为其设置默认值。一般来说,根据数据类型,默认值会设置为 0 或 null。

        下图总结了上述数据类型的默认值:

Data Type Default Value (for fields)
byte 0
short0
int 0
long 0L
float0.0f
double0.0d
char'\u0000'
String (or any object)null
booleanfalse

        注意:编译器不会为未初始化的局部变量进行赋值。如果局部变量不能在声明的地方进行初始化,那么要确保在使用它之前对它进行赋值,访问未初始化的局部变量将导致编译不通过。

(2)Java 中的字面量标记

整数字面量标记:

        整数字面量可以用以下数字系统表示:

  • 十进制:以10为基数,由数字0到9组成,默认为十进制
  • 十六进制:以16为进制,由数字0 ~ 9和字母A ~ F组成,前缀 0x 表示十六进制
  • 二进制:基数2,其数字由数字0和1组成,前缀 0b 表示二进制
// The number 26, 十进制
int decVal = 26;
//  The number 26, 十六进制
int hexVal = 0x1a;
// The number 26, 二进制
int binVal = 0b11010;

浮点数字面量标记:

        浮点字面值如果以字母 F 或 f 结尾,则为 float 类型;否则它的类型就是 double,并且可以选择以字母 D 或 d 结尾。

        浮点类型也可以用 E 或 e 表示(用于科学计数法)、F 或 f(32-bit 单精度字面值)和 D 或 d (64-bit 双精度字面值;这是默认值,按惯例可以省略)。// 使用 E 表示小数点的位置

double d1 = 123.4;
// same value as d1, but in scientific notation
double d2 = 1.234e2;
float f1  = 123.4f;

Character and String 字面量标记:

        char 和 String 类型可以包含任何 Unicode (UTF-16) 字符。如果编辑器和文件系统允许,你可以直接在代码中使用这些字符。但如果不支持,你可以使用转义符进行转义。

        Java 还支持一些针对 char 和 String 字面值的特殊转义序列:\b(退格)、\t(制表符)、\n(换行)、\f(换行)、\r(回车)、\"(双引号)、\'(单引号)和\\(反斜杠)。

        还有一个特殊的 null 文字,可以用作任何引用类型的值。null 可以赋给除基本类型外的任何变量。对于 null 值,除了测试它是否存在之外,几乎没有什么其他作用。因此,在程序中经常使用 null 作为标记,表示某些对象不可用。

        最后,还有一种特殊的字面量,称为类字面量,由类型名+".class"构成;例如,String.class。

在数字文字中使用下划线字符:

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;

2、数组

        数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度在创建数组时就已经指定。在创建之后,它的长度是不可变的。

        数组中的每一项都称为一个元素,每个元素都通过它的数值索引来访问。 

数组的操作类: java.util.Arrays 

        在 Java 中使用工具类 Arrays,方便了对数组的操作,如下,复制一个数组:

class ArrayCopyOfDemo {
    public static void main(String[] args) {
        String[] copyFrom = {
            "Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",   
            "Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",      
            "Marocchino", "Ristretto" };
        
        String[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);        
        for (String coffee : copyTo) {
            System.out.print(coffee + " ");           
        }            
    }
}

        Arrays 类中的方法还提供了的其他一些有用的操作,详情请阅读 Arrays 类的 API。

二、操作符/运算符 Operators

        // 操作符这章比较简单,只列举一些常见的操作符举例

        下表中的操作符按优先级顺序列出。操作符越靠近表的顶部,它的优先级就越高。优先级较高的操作符在优先级相对较低的操作符之前进行计算。同一行上的操作符具有相同的优先级。当相同优先级的运算符出现在同一个表达式中时,必须有一个规则规定先计算哪个运算符。除赋值操作符外,所有二进制操作符都从左向右求值;赋值操作符从右向左求值。

OperatorsPrecedence
postfix 后置式expr++ expr--
unary 一元运算++expr --expr +expr -expr ~ !
multiplicative 乘法* / %
additive 加减+ -
shift 位移<< >> >>>
relational 关系< > <= >= instanceof
equality== !=
bitwise AND&
bitwise exclusive OR^
bitwise inclusive OR|
logical AND&&
logical OR||
ternary 三元? :
assignment 赋值= += -= *= /= %= &= ^= |= <<= >>= >>>=

一元操作符(自增或自减)

        一元操作符只需要一个操作数;它们可以执行各种操作,例如,将值加1或减1,对表达式求反,或反转布尔值。

OperatorDescription
+Unary plus operator; indicates positive value (numbers are positive without this, however)
-Unary minus operator; negates an expression
++增量运算符;使一个值增加1
--减运算符;将一个值减1
Logical complement operator; inverts the value of a boolean

赋值操作中的自增和自减操作

        自增或自减操作符可以应用于操作数之前(前缀)或操作数之后(后缀)。代码 result++ 或 ++result,当执行结束后,result 都将加1。唯一的区别是前缀版本(++result)是计算之前增加值(使用增加的值),而后缀版本(result++)是计算之后增加值(使用原始的值)。如果你只是执行简单的递增或者递减操作(单独使用),那么选择哪个版本其实并不重要。但如果在其他表达式中使用此操作符,那么不同的选择可能会产生显著差异

        下面的程序演示了前缀和后缀的一元增量运算符:

class PrePostDemo {
    public static void main(String[] args){
        int i = 3;
        i++;
        // prints 4
        System.out.println(i);
        ++i;			   
        // prints 5
        System.out.println(i);
        // prints 6
        System.out.println(++i);
        // prints 6
        System.out.println(i++);
        // prints 7
        System.out.println(i);
    }
}

位移操作符

        一元逐位补码运算符“~”,用来反转位模式;它可以应用于任何整数类型,使每个“0”都变成“1”,每个“1”都变成“0”。例如,一个字节包含8位;将此运算符应用于 “00000000” 后,将其模式更改为“11111111”。

        带符号左移操作符 “<<” 将位模式向左移动,带符号右移操作符 “>>” 将位模式向右移动。无符号右移运算符 “>>>” 将 0 移到最左边的位置。

    public static void main(String[] args){
        System.out.println (100 << 2); // print 400
        System.out.println (100 >> 2); // print 25
        System.out.println (100 >>> 2);// print 25
    }

三、表达式、语句和代码块

        表达式是由变量、操作符和方法调用组成的构造,这些变量、操作符和方法调用是根据语言的语法构造的。下面为表达式的例子:

int cadence = 0;
anArray[0] = 100;
System.out.println("Element 1 at index 0: " + anArray[0]);

int result = 1 + 2; // result is now 3
if (value1 == value2) 
    System.out.println("value1 == value2");

        语句大致相当于自然语言中的句子。一条语句形成了一个完整的执行单元,通过使用分号(;)来结束一个表达式。下面是一些表达式语句的例子:

// assignment statement
aValue = 8933.234;

// increment statement
aValue++;

// method invocation statement
System.out.println("Hello World!");

// object creation statement
Bicycle myBike = new Bicycle();

        代码块是一组介于花括号之间的零条或多条语句。下面的例子说明了代码块的使用:

class BlockDemo {
     public static void main(String[] args) {
          boolean condition = true;
          if (condition) { // begin block 1
               System.out.println("Condition is true.");
          } // end block one
          else { // begin block 2
               System.out.println("Condition is false.");
          } // end block 2
     }
}

四、程序控制流

        // Java 中的一些控制流,大部分人都比较熟悉,因为是做知识梳理,所以只会简单带过。

        Java 支持的控制流有:决策流(if-then、if-then-else、switch)、循环语句(for、while、do-while)和分支语句(break、continue、return)。

        循环语句中,do-while 和 while 之间的区别在于 do-while 在循环的底部而不是顶部计算其表达式。因此,do 代码块中的语句总是至少执行一次。

        for 循环提供了一种紧凑的方法来迭代一系列值,它重复循环直到满足特定条件。for 循环的一般形式可以表示为:

for (initialization; // 初始化表达式 -> 循环开始的位置
     termination;    // 终止条件     -> false时种植循环
     increment) {    // 增量表达式   -> 在循环的每次迭代之后调用
    statement(s)
}

        for 循环的三个表达式是可选的;可以按如下方式创建一个无限循环:

// infinite loop
for ( ; ; ) {
    
    // your code goes here
}

break 语句

        break 语句有两种形式:有标记和无标记。使用一个无标记的 break 终止 for、while 或 do-while 循环,如下所示:

class BreakDemo {
    public static void main(String[] args) {

        int[] arrayOfInts = 
            { 32, 87, 3, 589,
              12, 1076, 2000,
              8, 622, 127 };
        int searchfor = 12;

        int i;
        boolean foundIt = false;

        for (i = 0; i < arrayOfInts.length; i++) {
            if (arrayOfInts[i] == searchfor) {
                foundIt = true;
                break;
            }
        }

        if (foundIt) {
            System.out.println("Found " + searchfor + " at index " + i);
        } else {
            System.out.println(searchfor + " not in the array");
        }
    }
}

        无标记的 break 语句将终止最里面的 switch、for、while 或 do-while 语句,而标记的 break 语句可以终止外部的循环语句。下面的程序与前面的程序类似,但是使用嵌套的 for 循环在二维数组中搜索值。当找到值时,用一个带标签的 break 结束外部的 for 循环("search"为标记):

class BreakWithLabelDemo {
    public static void main(String[] args) {

        int[][] arrayOfInts = { 
            { 32, 87, 3, 589 },
            { 12, 1076, 2000, 8 },
            { 622, 127, 77, 955 }
        };
        int searchfor = 12;

        int i;
        int j = 0;
        boolean foundIt = false;

    search: // 这是一个标记
        for (i = 0; i < arrayOfInts.length; i++) {
            for (j = 0; j < arrayOfInts[i].length;
                 j++) {
                if (arrayOfInts[i][j] == searchfor) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if (foundIt) {
            System.out.println("Found " + searchfor + " at " + i + ", " + j);
        } else {
            System.out.println(searchfor + " not in the array");
        }
    }
}

continue 语句

        continue 语句跳过 for、while 或 do-while 循环的当前迭代。不带标签的表单跳转到最内层循环体的末尾,并计算控制循环的布尔表达式。// continue 也分为带标签和不带标签两种

class ContinueDemo {
    public static void main(String[] args) {

        String searchMe = "peter piper picked a " + "peck of pickled peppers";
        int max = searchMe.length();
        int numPs = 0;

        for (int i = 0; i < max; i++) {
            // interested only in p's
            if (searchMe.charAt(i) != 'p')
                continue;

            // process p's
            numPs++;
        }
        System.out.println("Found " + numPs + " p's in the string.");
    }
}

        带标签的 continue 语句跳过使用给定标签标记的外部循环的当前迭代。下面的示例程序 ContinueWithLabelDemo 使用嵌套循环在另一个字符串中搜索子字符串。当中两个嵌套循环:一个用于遍历子字符串,另一个用于遍历正在搜索的字符串。下面的程序 ContinueWithLabelDemo 使用带标签形式的 continue 跳过外部循环中的迭代。

class ContinueWithLabelDemo {
    public static void main(String[] args) {

        String searchMe = "Look for a substring in me";
        String substring = "sub";
        boolean foundIt = false;

        int max = searchMe.length() - 
                  substring.length();

    test:
        for (int i = 0; i <= max; i++) {
            int n = substring.length();
            int j = i;
            int k = 0;
            while (n-- != 0) {
                if (searchMe.charAt(j++) != substring.charAt(k++)) {
                    continue test;
                }
            }
            foundIt = true;
                break test;
        }
        System.out.println(foundIt ? "Found it" : "Didn't find it");
    }
}

return 语句

        return 语句表示从当前方法退出,控制流返回到调用该方法的地方。return 语句有两种形式:一种返回值,另一种不返回值。return 语句比较简单,在此不做过多赘述。

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

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

相关文章

Docker+NETCore系列文章(五、推送自制镜像到Docker Hub、阿里云镜像仓库)

推送镜像到Docker Hub镜像仓库 1、访问Docker Hub&#xff1a;https://hub.docker.com/&#xff0c;注册并登陆Docker。 2、使用docker pull hello-world命令拉取hello-workld镜像。 [rootVM-0-6-centos ~]# docker pull hello-world Using default tag: latest latest: Pul…

微服务架构 VS 单体架构

在软件行业&#xff0c;微服务架构是一种重要的发展趋势。这一趋势&#xff0c;不仅仅是对企业内的IT信息系统建设&#xff0c;甚至在企业向数字化转型方面&#xff0c;都有着深远的影响。微服务架构与传统的单体软件架构代表着IT产业处理软件开发方式的一个根本性转变&#xf…

【C++11】异常

&#x1f308;1.C语言传统处理错误的方式 在讲解C的异常机制之前我们先来复习一下传统的处理错误的方式。 传统的错误处理机制&#xff1a; 1.终止程序、如assert , 缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。2.返回错误码、缺陷&…

Apache POI导入导出excel文件实战

文章目录前言技术栈1、引入依赖2、导入代码实现3、导出代码实现3.1、准备导出文件模板3.2、导出代码实现4、代码实现解释5、常见问题前言 这两天公司项目业务提出需求&#xff0c;要求在前端上传excel文件然后解析展示&#xff0c;因此写篇文章记录一下实现。 技术栈 spring…

抖音小程序实践三:接口开发指南

通过官方文档可以更系统的学习到所有的接口&#xff0c;我这边罗列一下我自己用到测试过的接口供大家参考。 前端-小程序对接官方文档&#xff1a;https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info服务端-小…

个人黄金准备与须知

投资黄金可以为自己的资产保值&#xff0c;也可以福泽后人&#xff0c;因此十分符合国人传统文化特点和理财智慧。可是现在市场中可以投资黄金的平台那么多&#xff0c;投资者必须先认真“调查研究”&#xff0c;才能“去芜存菁”&#xff0c;选到值得托付的好平台。 其实投资者…

为笔记本电脑绑定公网IP随时随地BT做种完整方案(frp加v2ray配合比特彗星点亮绿灯)

BT做种需要拥有固定的IP(IPV4)和端口&#xff0c;如果想在拥有固定IP的服务端做种&#xff0c;可以直接参考前一期https://www.v2fy.com/p/2022-12-25-bt-1671963832000/ &#xff0c;如果想使用笔记本随时随地做种&#xff0c;那就需要拥有固定IP的服务器进行流量转发。 本篇…

富特科技在创业板IPO过会:计划募资约9亿元,股东包括小米等

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;浙江富特科技股份有限公司&#xff08;下称“富特科技”&#xff09;获得创业板上市委会议审核通过。据贝多财经了解&#xff0c;富特科技于2022年6月16日在创业板递交招股书。 本次冲刺创业板上市&#xff0c;富特科…

【聆思CSK6 视觉AI开发套件试用】头肩、手势识别体验与PWM舵机控制

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;酷电玩家 环境搭建 官方文档详细环境搭建教程&#xff1a;环境搭建 1、下载Git进行安装。 2、安装lisa zep工具&#xff0c;并初始化 CSK6…

洛谷千题详解 | P1026 [NOIP2001 提高组] 统计单词个数【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; C源码2&#xff1a; ----------------------------------------------------------------------------…

vector模板的简易实现

这篇文章&#xff0c;我们模拟一下STL里面的vector的实现。但是会简化一些内容&#xff0c;让大家能够更好的理解。模拟实现的目的不是为了更好的造轮子&#xff0c;而是为了更好的理解这些容器。 文章目录1. 成员变量2. push_back函数3. reserve函数4. pop_back函数和下标运算…

QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

QT 多线程中使用QCanBusDevice进行PCAN通讯时&#xff0c;无法正常发出数据 前言 我一开始的代码逻辑是&#xff0c;PCAN开启、关闭、发送、接收这些功能整合在一个工具类中&#xff0c;这个工具类的对象是在主线程创建的&#xff0c;然后我有一个要循环定时发送的功能是独立…

与企企通强强联手!哈尔斯二期数字化采购项目正式启动

近日&#xff0c;浙江哈尔斯真空器皿股份有限公司&#xff08;以下简称“哈尔斯”&#xff09;联合企企通举办二期数字化采购项目启动会&#xff0c;旨在助力哈尔斯实现采购数字化全面升级&#xff0c;提升自主品牌竞争力。会上&#xff0c;双方就该项目的建设方案、项目资源、…

铝合金表面处理废水除铝工艺

铝型材表面处理用水量大&#xff0c;产生废水多&#xff0c;废水中有害物质持续排放。如不加以处理必将污染环境。同时伴随着我国对排污量的征税&#xff0c;也会增加企业的成本和负担。因此&#xff0c;从企业的社会责任和效益两方面考虑&#xff0c;进行废水处理是必须和必要…

解决VsCode启动Vue项目报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题描述 最近居家办公&#xff0c;网速不太稳定&#xff0c;开会的时候网络也是断断续续的&#xff0c;今天需要拉下前端项目运行起来 在我执行npm i下载包的时候&#xff0c;我看到网络超时的错误警告就感觉不太秒。知道大概率要启动失败了 果不其然执行npm run serve的时…

窃取信息的新恶意软件通过假冒的破解网站感染使用者

©网络研究院 一种名为“RisePro”的新型信息窃取恶意软件正在通过由 PrivateLoader 按安装付费 (PPI) 恶意软件分发服务运营的虚假破解站点进行分发。 RisePro 旨在帮助攻击者从受感染的设备中窃取受害者的信用卡、密码和加密钱包。 本周Flashpoint 和 Sekoia的分析师发…

前端框架 Nuxt3 集成 Pinia

目录 一、Nuxt3集成Pinia 二、Pinia的使用 state的使用 1、基本使用及动态渲染 2、state的重置 3、批量更改state数据 getters的使用 1、getters的基本使用 2、getters传参 actions的使用 1、actions的基本使用 一、Nuxt3集成Pinia 参考官方文档&#xff1a;简介 |…

【JavaSE】常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期&#xff0c;以及各状态切换使用到的方法等 状态&#xff0c;方法 2.同步代码块中涉及到同步监视器和共享数据&#xff0c;谈谈你对同步监视器和共享数据的理解&#xff0c;以及注意点。 synchronized(同步监视器){//操…

消息队列RabbitMQ学习笔记(五)高级特性

1. 发布确认高级 在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投…

ccc-sklearn-11-线性回归(1)

1.线性回归概述 回归需求在现实中非常多&#xff0c;自然也有了各种回归算法。最著名的就是线性回归和逻辑回归&#xff0c;衍生出了岭回归、Lasso、弹性网&#xff0c;以及分类算法改进后的回归&#xff0c;如回归树、随机森林回归、支持向量回归等&#xff0c;一切基于特征预…