Java-数据类型与变量

news2024/9/29 19:52:06

一、字面常量

在我们使用Java进行数据的打印时,经常会用到这个语句:

 System.out.println("Hello world!");

而当这个语句运行时,不论如何都会输出"Hello world!",所以"Hello world!"就是字面常量

字面常量是指在代码中直接给出的,并且运行期间固定不变的量即为常量。

📌 Java支持以下几种字面常量:

📕 整数常量:整数常量可以是十进制、八进制或十六进制表示。例如:10、012、0xA。

📕 浮点数常量:浮点数常量可以是普通的十进制数表示,也可以使用科学计数法表示。例如:3.14、2.0E8。

📕 字符常量:字符常量是用单引号括起来的单个字符或转义序列。例如:'A'、'\n'。

📕 字符串常量:字符串常量是用双引号括起来的一串字符。例如:"Hello, World!"。

📕 布尔常量:布尔常量只有两个值,即true和false。

📕 null常量:null常量表示一个空引用。

(注意:Java中的布尔常量并非像C语言一样,分为"0"和"非0",而是仅仅使用true和false代表~)

📚 代码演示

public class Main {
    public static void main(String[] args) {
        System.out.println(10);
        System.out.println(3.14);
        System.out.println('X');
        System.out.println("Hello world!");
        System.out.println(false);
        }
    }

运行代码:

📌 (上述代码中我们使用的是"println",其实除了它还有"printf""print")

📕 println:用于输出字符串或变量的值,并且自动换行;

例如:System.out.println("Hello World");

📕 printf:C语言中的输出函数,在Java中也有相应的使用方式;

例如:System.out.printf("Hello %s", "World");

📕 print:用于输出字符串或变量的值,但不会自动换行。

例如:System.out.print("Hello World");

二、数据类型

Java中数据类型主要分为两类:基本数据类型引用数据类型

由图我们可以知道,基本数据类型有"四类八种",四类分别指"整型,浮点型,字符型,布尔类型",八种分别指:

相较于C语言的数据类型,大部分都是没有变化的,除了布尔型的变化,我们还能发现:字符型char的大小从C语言中的1个字节,到java中就变成了2个字节。

而由此我们又能够引出字节的定义

字节是计算机存储容量的基本单位,它表示存储的数据量。一个字节由8个二进制位(bit)组成。

📚 常见的字节单位包括:

1字节(B)= 8位(bit)

1千字节(KB)= 1024字节

1兆字节(MB)= 1024千字节

1千兆字节(GB)= 1024兆字节

1兆兆字节(TB)= 1024千兆字节

三、变量

① 变量的定义

在上面我们提到了"常量",也就是"不会变化的量"。而对应的,有"不变"就有"变",所以有些能够发生改变的量,如:财产,身高,成绩等,就被称作"变量"。

② 语法格式

定义变量的语法格式为:

数据类型   变量名 = 初始值;

📚 代码演示

public class Main {
    public static void main(String[] args) {
        int a = 18;
        double b = 3.14;
        char c = 'a';
        boolean d = true;
        System.out.println("变化前:");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        a = 999;
        b = 6.28;
        c = 'A';
        d = false;
        System.out.println("变化后:");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        }
    }

运行代码:

③ 整形变量

1. 整形变量
public class Main {
    public static void main(String[] args) {
        int a = 18;
        System.out.println(a);
//(或者) int a;
//       a = 18;  
//       System.out.println(a);
        }
    }

在Java中创建变量时必须进行初始化,如果定义后并未初始化,那么我们使用该变量时便会报错

📌 需要注意的是:

📕 int不论在何种系统下都是4个字节

📕 再给变量设置初始值时,值不能超过int的表示范围,否则会导致溢出(会类似上图一样报错)。

📕 int的包装类型为Integer。

这里引出两个话题:int的表示范围为多大?int的包装类型Integer有什么作用?

📚那么我们使用代码来查看一下

public class Main {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
        }
    }

运行代码:

由此我们便能观测出int型的表示范围,而其中MAX_VALUE和MIN_VALUE分别代表int型的最大与最小值。

而引出这两种边界值的就是int的包装类型Integer

那么可能有的人就要问了:Integer和int有什么很大的区别吗?那这里我们将Integer替换成int又会发生什么呢:

我们可以看到,将Integer换成int后,代码就报错了,也就是说这个功能只有Integer能够实现~

也就是说:可以把Integer当作int的"plus"版本,它能够实现的功能更加丰富。(同时int具有的功能它也具有,比如初始化:)

public class Main {
    public static void main(String[] args) {
        int a = 10;
        Integer b = 10;
        System.out.println(a);
        System.out.println(b);
        }
    }

运行代码:

2. 长整型变量
public class Main {
    public static void main(String[] args) {
        int a = 10;
        long b = 10;
        long c = 10L;
        long d = 10l;
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        }
    }

📌 需要注意的几个点:

📕 long长整型变量不论在哪个系统下都占8个字节

📕 long长整型变量的初始值后面最好加个L或者l(一般写L,因为小写的l和1不好区分)。

📕 long长整型变量的表示范围非常大,有(-2^63 ~ 2^63 - 1)。

📕 long的包装类型为Long

📚 那么我们尝试使用"Long"来表示一下长整型变量的表示范围

public class Main {
    public static void main(String[] args) {
        System.out.println(Long.MAX_VALUE);
        System.out.println(Long.MIN_VALUE);
        }
    }

运行代码:

个十百千万十万百万千万亿十亿百亿千亿万亿十万亿百万亿千万亿万万亿......数不清楚...

(这个数据范围远超 int 的表示范围,足够绝大部分工程场景使用)

3. 短整型变量
public class Main {
    public static void main(String[] args) {
        short a = 10;
        System.out.println(a);
        System.out.println(Short.MAX_VALUE);
        System.out.println(Short.MIN_VALUE);
        }
    }

(short的包装类型为Short,所以这里直接使用啦)

📌 注意事项:

📕 short在任何系统下都占2个字节

📕 使用不要超过范围。

📕 short包装类型为Short

4. 字节型变量
public class Main {
    public static void main(String[] args) {
        byte a = 10;
        System.out.println(a);
        System.out.println(Byte.MAX_VALUE);
        System.out.println(Byte.MIN_VALUE);
        }
    }

📌 注意事项:

📕 byte在任何系统下都占1个字节

📕 byte的范围很小,只有(-128 ~ 127)。

📕 byte的包装类型为Byte

④ 浮点型变量

1. 双精度浮点型
public class Main {
    public static void main(String[] args) {
        double a = 12.5;
        System.out.println(a);
        System.out.println(Double.MAX_VALUE);
        System.out.println(Double.MIN_VALUE);
        }
    }

(double的包装类型为Double)

在我们之前的学习中,我们知道C语言中使用整数除以整数,得到的只能是整数。(比如:5 / 2 = 2)

而此时我们不再使用C语言,而是使用Java,此时整数除以整数还会只能得到整数嘛?让我们尝试一下:

public class Main {
    public static void main(String[] args) {
        int a = 5;
        int b = 2;
        System.out.println(a/b);
        }
    }

不出所料,得到的还是2,那么再让我们将int型转换为double型:

public class Main {
    public static void main(String[] args) {
        double a = 5.0;
        double b = 2.0;
        System.out.println(a/b);
        }
    }

此时我们便能得到想要得到的2.5啦。

📚 接下来我们再看一段代码:

public class Main {
    public static void main(String[] args) {
        double a = 1.1;
        System.out.println(a * a);
        if(a * a == 1.21)
            System.out.println("YES");
        if(a * a != 1.21)
            System.out.println("NO");
        }
    }

我们可以看到,答案并不是1.21,这是因为浮点数与整数在内存中的存储方式不同

📌 注意事项:

📕 double在任何系统下都占8个字节

📕 浮点数与整数在内存中的存储方式不同,不能单纯使用2^n的形式来计算。

📕 double的包装类型为Double

📕 double类型的内存分布和C语言一样,使用有限空间表示可能无限的小数,必然会存在一定的精度误差,因此浮点数是近似值,并不是准确值

2. 单精度浮点型
public class Main {
    public static void main(String[] args) {
        float a = 10.1f;
        System.out.println(a);
        }
    }

注意:初始化float类型的变量时,需要在数据后加一个'f',或'F'。否则会被默认为double类型,而float类型无法接收double型变量,从而会导致报错。

📌 注意事项:

📕 float类型占4个字节

📕 由于数据精度范围小,故一般很少使用float。

⑤ 字符型变量

首先我们在上面了解到,Java中的char类型与C语言中并不相同,Java中的char占两个字节。

📚 相应的,既然空间变大了,肯定也有它的优秀之处

public class Main {
    public static void main(String[] args) {
        char a = 'a';
        char b = 'B';
        char c = '哈';
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        }
    }

(在C语言中,char型变量是无法做到存储中文汉字的因为C语言中一个汉字的存储空间等于两个字符Java中的char大小为两个字节,也就说明它拥有存储汉字的能力~)

📚 同时,使用char关键字声明也能够存储整数,其意代表的是ASCII码对应的字符:

public class Main {
    public static void main(String[] args) {
        char a = 65;
        char b = 97;
        System.out.println(a);
        System.out.println(b);
        }
    }

📌 注意事项:

📕 Java中使用 ' ' + 单个字母 的形式表示字符字面值。

📕 Java中char型变量可以存储整数,存储的是ASCII码值对应的字符

📕 Java中char型变量可以存储中文汉字

⑥ 布尔型变量

布尔类型所代表的只有两个:真(true) 或 假(false)

public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        if(a)
            System.out.println(a);
        if(b)
            System.out.println(b);
        }
    }

📚 布尔型变量的用法有很多:

📕 使用布尔型变量来控制循环的执行:

boolean a = false;
while (!a) {
    // 执行一些操作
    // 如果满足某个条件,将a设置为true,结束循环
    if (某个条件) {
        a = true;
    }
}
 

📕 判断语句中的条件表达式:

boolean a = false;
int age = 18;
if (age >= 18) {
    a = true;
}
 

📕 布尔型变量还可以与逻辑运算符一起使用,形成更复杂的条件表达式:

boolean A = (number % 2 == 0);
boolean B = (number > 0);
boolean C = A && B; // 偶数且正数
boolean D = A || B; // 偶数或正数
boolean E = !A; // 非偶数
 

📌 注意事项:

📕 boolean 类型变量只有两种取值true表示真,false表示假

📕 Java中的 boolean 类型和 int 不能相互转换不存在 1 表示 true,0表示 false 这样的用法

📕 boolean 的包装类型为 Boolean。

四、字符串类型

我们知道,在C语言中是没有明确的字符串类型变量的,有的只是字符型char*指针变量存储字符串位置,和char型数组以存储多个字符的形式存储。

而在Java中就多了一个用于定义字符串类型:String

📚 对于字符串的操作,有很多种类型:

📕 字符串与数字输出:(使用 ' + ' 进行衔接)

public class Main {
    public static void main(String[] args) {
        String str = "Hello, world!";
        int length = str.length();
        System.out.println(str);
        System.out.println("Length: " + length);
        }
    }

(将一个字符串拼接上其他数据类型的数据,得到的结果就是一个字符串。)

比如:我们知道 a = 10,b = 20。此时我们想用字符串的形式打印:a + b = 30:

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("a + b = "+a+b);
        }
    }

这样是正确的吗?让我们看一下结果

欸?结果好像并不如我们所料想那般顺利,这是为何呢

(因为,当println检测到 " " 时,便会开始将从这之后的数据直接变成字符串类型,而我们本用来运算"a + b = 30""a + b"就会被直接分别检测成"10" + "20"从而直接打印1020,而并非30)

解决方案:

方法一:(先计算数据,再引入字符串)

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a+b+" = a + b");
        }
    }

方法二:(使用括号,提高运算数据的优先级)

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("a + b = "+(a + b));
        }
    }

📕 将 int 转换成 String:

方法一:(valueOf)

public class Main {
    public static void main(String[] args) {
        int num = 12345;
        String str = String.valueOf(num);
        System.out.println(str);
        }
    }

方法二:( + " " )

public class Main {
    public static void main(String[] args) {
        int num = 12345;
        String str = num + "";
        System.out.println(str);
        }
    }

运行代码:

📕 将 String 转换成 int

public class Main {
    public static void main(String[] args) {
        String str = "12345";
        int num = Integer.parseInt(str);
        System.out.println(num);
        }
    }

(我们能看到,再次使用到了 Integer "包装类型",再一次证明了"包装类型"为原型的"plus"版本)

五、类型转换与提升

在之前学习C语言时,即便编写代码时有些错误的操作,也仍然能够进行数据的打印,但是Java相较于C语言会更加的严格,Java作为一个强类型编程语言,在不同类型之间进行赋值时,会有较为严格的校验。

Java中的类型转换可以分为两种:隐式类型转换显式类型转换

① 隐式类型转换(自动)

隐式类型转换是指将一个小范围的数据类型转换为一个大范围的数据类型,Java编译器会自动进行类型转换(所以也被称作自动类型转换),不需要用户明确指定。例如,将一个byte类型的变量赋值给int类型的变量。

byte -> short -> int -> long -> float -> double

📚 代码演示:

public class Main {
    public static void main(String[] args) {
        int a = 10;
        long b = 20L;
        b = a;
        a = b;
        }
    }

当使用 b 来接收 a 时不会报错因为 b(long) 相较于 a(int) 属于一个大范围的数据类型,能够完整无误的接收数据,故不报错但当使用 a(int) 来接收 b(long) 时,就可能出现无法完整接受数据的情况(数据丢失)

同样的:(使用 float 接收 double 报错)

(想要存储的数据超过该变量的范围:)

② 显式类型转换(强制)

 显式类型转换是指将一个大范围的数据类型转换为一个小范围的数据类型需要用户明确指定在进行强制类型转换时,需要使用括号将目标类型括起来并在变量前面加上强制转换的类型。例如,将一个int类型的变量赋值给byte类型的变量。

📚 代码演示:

public class Main {
    public static void main(String[] args) {
        int a = 10;
        long b = 2147483648L;
        a = (int)b;
        System.out.println(a);
        }
    }

使用强制类型转换后,确实不报错了,但当我们运行时:

可以看到原来的"2147483648"变成了负数,这是因为将该数字存入int型时,其实是存不下的,最左边原本用来表达正负的二进制位,强制存储变成了1,从而变成了负数

所以使用强制类型转换时,需要注意的是:要保证该类型能够存得下该数据。

📌 类型转换的注意事项:

📕 不同数字类型得变量之间赋值,表示范围更小的类型隐式转换范围较大的类型

📕 如果需要把范围大的类型赋值给范围小的,需要强制类型转换,但是可能精度丢失。

📕 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查

📕 不相干的类型不能互相转换

③ 类型提升

类型提升是指在表达式中,不同数据类型的操作数进行运算时,会自动将较小的数据类型提升为较大的数据类型,以保证计算的精度。

(类型提升顺序:byte、short、int、long、float、double由低向高转换。)

📚 代码演示:(int 与 long 之间的运算)

我们可以看到,使用int来接收a + b就会报错,而long就不会报错,这就是因为当 a + b 进行时,会将 int型 的a 转换成 long型,所以int型接收就会报错。

同样的:(float 与 double 之间的运算)

特别:byte 与 byte的运算:

public class Main {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        byte c = a + b;
        int d = a + b;
        }
    }

这段代码中,大家或许会觉得,int那行会报错吧?其实相反,byte c = a + b 会报错:

(需要注意的是,由于byte在进行运算时会被提升为int,所以在用byte类型接收运算结果时需要进行强制类型转换。另外,由于byte是有符号类型,所以在进行运算时可能会出现溢出的情况,需要注意处理。)

📌 类型提升注意事项:

📕 不同类型数据混合运算,范围小的自动提升为范围大的。

📕 对于 short,byte 这类小于4字节的类型,会提升成4字节的 int 再运算。

那么关于Java中数据类型与变量的相关知识就为大家分享到这里啦,本人能力有限,如果有疏忽的地方,或者哪里讲的不够正确,还请各位在评论区多多指出,我也会吸取教训,多多学习的!那么我们下一期再见啦~

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

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

相关文章

哪款宠物空气净化器能有效去除浮毛?希喂、352实测分享

你是否曾经站在家电卖场里,面对琳琅满目的宠物空气净化器产品而感到无所适从?或者在浏览网上商城时,被海量的参数和功能描述搞得头晕眼花?别担心,你不是一个人。在这个科技飞速发展的时代,选择一台既能满足…

Grafana指标汉化

1、Grafana解压 目录 conf 2、找到:defaults.ini 3、打开defaults.ini ,搜索:en-US 4.重新运行 :grafana-server.exe

开放词汇全景分割

开放词汇全景分割是一种先进的计算机视觉任务,它旨在将图像中的每个像素分割并分类到预先定义或未定义的类别中。这与传统的图像分割不同,后者通常仅限于识别有限的、预先定义的对象类别。开放词汇全景分割的目标是识别和处理图像中的任何可能的对象&…

基于Hadoop的微博舆情监测分析系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

大模型,互联网玩家们的「角斗场」

文/孟永辉 布局大模型,似乎正在成为每一个互联网玩家必然都要去做的事情。无论是以BAT为代表的综合性的大型平台来讲,还是以WPS、携程为代表的专业性的平台们而言,几乎都是如此。一时间,大模型,成为了一个全新的风口。…

9.5K Star,开源在线网盘

Hi,骚年,我是大 G,公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 随着云存储的广泛应用,越来越多的人和企业需要一个简单、…

android SELinux权限适配

抓log方法, setenforce 0, 如果不先将selinux设置为permission mode,会导致一个问题。 程序运行的时候遇到权限策略限制(假设 sepolicy 1),程序运行失败。添加权限(sepolicy 1),然后…

Java Web —— 第十天(SpringBoot原理)

SpringBoot框架之所以使用起来更简单更快捷,是因为SpringBoot框架底层提供了两个非常重要的 功能:一个是起步依赖,一个是自动配置。 通过SpringBoot所提供的起步依赖,就可以大大的简化pom文件当中依赖的配置,从而解决…

Python 知识宝库 —— 数据可视化:matplotlib 与 seaborn 的使用技巧

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 博主简介 博主致力于嵌入式、Python、人工智能、C/C领域和各种前沿技术的优质博客分享,用最优质的内容带来最舒适的…

SpringBoot日常:链路追踪skyworking的接入

前言 开发中遇到这样的一个常见,服务之间调用需要链路追踪,并且日志报错时能够及时预警,最重要的一点是不要写太多的侵入式代码,那么我们来捋捋常用的链路追踪组件,有Google的Dapper,阿里的鹰眼&#xff0…

Excel提取数据

Excel提取数据 在使用Excel的过程中,我需要将带有评语的评分的文本内容提取出评分,如下所示 其中分数与文本之间用空格分隔,只有分数的评语会自动靠右对齐,我需要做的就是将B列的评语从中提取出分数放到C列中,以下为实…

卡牌小程序搭建:多样化在线拆卡体验

潮玩市场已经成为备受消费者瞩目的行业,新兴的潮流玩具不断出现,其中卡牌更是备受广大消费者关注,不管是哪个年龄层的消费者,对卡牌都非常情有独钟。在科技的不断发展下,卡牌的玩法与互联网相结合,打造出了…

如何高效删除 MySQL 日志表中的历史数据?实战指南

在处理高并发的物联网平台或者其他日志密集型应用时,数据库中的日志表往往会迅速增长,数据量庞大到数百GB甚至更高,严重影响数据库性能。如何有效管理这些庞大的日志数据,特别是在不影响在线业务的情况下,成为了一项技…

IPD变革中,数据治理是关键

IPD变革中,数据治理是关键 2024-09-29 14:41汉捷咨询 华为轮值董事长徐直军先生在回顾IPD变革时,提到:“华为IPD变革前期,对数据的关注不够,没有系统梳理产品的信息架构和数据标准,也没有对业务流中的数据…

C++的隐式构造函数、隐式转换和explicit关键字

1、隐式的意思是不用告诉它该怎么做&#xff0c;有点类似于自动化的意思 #include <iostream> #include <string>class Entity { private:std::string m_Name;int m_Age; public:Entity(const std::string& name) :m_Name(name),m_Age(-1){}Entity(int age):…

安全、稳定、SLA高达99.9%:Azure OpenAI数据分离与隔离优势

近期有不少客户&#xff0c;由于其开发的系统软件是面向海外以及政企的&#xff0c;又想通过微软Azure OpenAI服务将大模型接入其业务作为优势&#xff0c;因此非常重视服务的安全性和稳定性。 下面将重点介绍微软Azure OpenAI 服务的数据、隐私和安全内容。 稳定&#xff1a;S…

使用kubectl快速查看各个节点的CPU和内存占用量

本文章视频教程地址&#xff1a;https://www.bilibili.com/video/BV1TdxkedE1K 前言 笔者之前写过一篇文章关于在Kubernetes上安装 Prometheus 和 Grafana 监控去查看Kubernetes各个节点的资源占用率&#xff0c;文章地址&#xff1a;https://blog.csdn.net/m0_51510236/arti…

springcloud 面试题

什么是微服务&#xff1f; 本文导图&#xff1a;SpringCloud 梳理-ProcessOn 分布式架构CAP理论 CAP定理是分布式系统中最基础的原则&#xff0c;所以理解和掌握了CAP对系统架构的设计至关重要。分布式架构下所有系统不可能同时满足以下三点&#xff1a;Consisteny&#xff08…

Unity android 接USBCamera

目录 一、前提 1. unity打包android后&#xff0c;链接USB摄像头&#xff0c;需要USB权限。 二、流程 1.Unity导出android工程&#xff0c;Player配置如图&#xff1a; 2.导出android工程 3.在android工程中找到AndroidManifest.xml加入usb权限相关 <?xml version&quo…

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…