@TOC
一、什么是变量 ?
:snowflake: 【个人解释】① 用英文单词(或英文单词加数字)表示 一个值(如:数字、中文、小数、字母)
:snowflake: 【个人解释】② 如果这个值永远都不会变化,则这个英文单词是常量
:snowflake: 【个人解释】② 如果这个值会变化(不是一层不变的),则这个英文单词是变量
变量相当于内存中一个数据存储空间的表示,可把变量看做是一个房间的门牌号,通过门牌号可以找到房间,而通过变量名可以访问变量的值。
变量是程序的基本组成单位(下面图片中,红色箭头指向的或红色框框中的都是变量)
二、变量的声明与赋值
- 变量的声明(指定变量类型和变量名):想象拿出一个盒子 :package:,指定盒子的名字和盒子存放什么类型的东西
- 变量的赋值:在变量中存放指定类型的数据(想象把东西放入盒子 :package:)
// 声明一个变量 action(中文意思:行动、动作)
// String 限定给 action 赋的值必须是 String(字符串)类型
// 被【双引号】包裹的内容就是字符串
String action; // 先声明后赋值
action = "点赞"; // 给变量 action 赋值为“点赞”
action = "评论"; // 给变量 action 赋值为“评论”
action = "收藏"; // 给变量 action 赋值为“收藏”
action = "转发"; // 给变量 action 赋值为“转发”
- 数据类型(变量可以存放的数据的类型)后面会详谈
变量三要素:① 数据类型 + ② 变量名 = ③ 值
// 下面代码的变量三要素
// 1. 数据类型:int
// 2. 变量:likeNum
// 3. 值:50
int likeNum = 50; // 声明后立即赋值
小练习:用变量描述一篇 CSDN 文章(自己思考:一篇 CSDN 文章都有什么? 然后用变量表示出来)
① 文章名:articleName
② 文章内容:articleContent
③ 文章类型:articleType
④ 文章作者:articeWriter
⑤ 文章作者的粉丝量:articleWriteFansNum
⑥ 文章的点赞量:articleLikeNum
⑦ 文章的评论量:articleCommentNum
⑧ 文章的浏览量:visitorVolume:smile: 请大家不要误会我在拉关注哈,这只是一个小练习,不要想歪了 :smile:
:snowman: 变量名一定要见名知意,最好是英文单词(不知道就百度一下),千万不能是中文拼音首字母缩写(如:点赞量 :arrow_right: dzl :x:)
public class DescriptionCSDNArticle {
public static void main(String[] args) {
String articleName = "五分钟精通 Python 教程";
String articleContent = "洗洗睡吧, 想啥呢?";
String articleType = "做梦系列";
String articleWriter = "Java 初学者, 请多多关照";
int articleWriterFansNum = 2;
int articleLikeNum = 100; // 如果可以达到我会好开心 (但应该不能吧)
int articleCommentNum = 50;
int visitorVolume = 999;
// \n: 换行(上篇文章的内容)
System.out.println("\n-------- 用变量描述一篇 CSDN 的文章 --------\n");
System.out.println("articleName = " + articleName);
System.out.println("articleContent = " + articleContent);
System.out.println("articleType = " + articleType);
System.out.println("articleWriter = " + articleWriter);
System.out.println("articleWriterFansNum = " + articleWriterFansNum);
System.out.println("articleLikeNum = " + articleLikeNum);
System.out.println("articleCommentNum = " + articleCommentNum);
System.out.println("visitorVolume = " + visitorVolume);
}
}
代执行结果:
三、使用变量的注意事项
:heavy_check_mark: 变量表示内存中的一个存储区域(不同的变量有不同的类型,不同类型的变量占用不同大小的内存空间)
如:
int(整数类型):占用4字节
double(小数类型):占用8字节
字节(byte):计算机中用于计量存储容量的一种计量单位【后面详说】
数据类型有两种:基本数据类型(byte、short、int、long、float、double、boolean、char)和引用类型【后面详说】
:heavy_check_mark: 变量必须先声明并赋值后才可使用
:x: 未声明变量就想使用
:x: 声明变量,未赋值就想使用
:heavy_check_mark: 变量在同一作用域内不能重名
程序中使用到了【+】号,第四节详谈。
:heavy_check_mark: 某一变量(如 int age)的值可在同一类型(如 int)范围内不断变化
:heavy_check_mark: 变量三要素:数据类型 + 变量名 = 值
四、Java 程序中加号【+】的使用
:large_blue_circle: 当加号【+】的左右两边连接的是数值类型,是加法运行
:large_blue_circle: 当加号【+】左右两边有一边或两边为字符串,是字符串拼接操作
public static void main(String[] args) {
int pen = 200;
int ruler = 300;
// 加号【+】的左右两边都是数值类型 --- 加法运算
int total = pen + ruler;
// 加号【+】左右两边有一边或两边为字符串 --- 字符串拼接操作
// 钢笔和尺子一共 500 元
System.out.println("钢笔和尺子一共" + total + "元"); // 加号【+】两边都是字符串
// 500元?被坑了吧
System.out.println(total + "元?被坑了吧"); // 加号【+】有一边是字符串
}
思考:有一整数类型的变量【int weight = 100】如何把它转换为字符串类型?
public class Integer2String {
public static void main(String[] args) {
int weight = 100;
String weightString = weight + "";
// 100(数字类型)
System.out.println(weight);
// 100(字符串类型)
System.out.println(weightString);
// 输出结果:1024(进行了加法计算)
System.out.println(weight + 924);
// 输出结果:100924(只进行了拼接操作)
System.out.println(weightString + 924);
}
}
上面的代码:
:leaves: 变量 weight 是数值类型的,值是 100
:leaves: weightString 是变量 weight 拼接一个字符串的结果(引号包裹的内容是字符串,只是这里引号啥也没有包裹而已,专业说法是 空串)
:leaves: 单独打印 weight 和 weightString 的结果都是 100,但两个100的类型不同
:leaves: 打印【weight + 924】的结果是1024,更加说明 weight 是数值类型(只有加号两边是数值才会执行加法操作)
:leaves: 打印【weightString + 924】的结果是100924,说明 weightString 是字符串类型(924 肯定是数值类型,数值类型和字符串拼接才会得到 100924 的结果)
:leaves: 【1024】在计算机里面是一个特殊的数字(请看下节)
五、关于 1024
(1) 《念奴娇 · 程序员怀古 》
:rabbit: 来看一首有趣、搞笑的自嘲词
《念奴娇·程序员怀古 》
大京东去,淘宝进,格子衫牛仔裤。
成都西安,北上广,南山区杭州西。
地铁穿空,公交进站,车门一堆挤。
江山如画,一时多少豪杰。
遥想老夫当年,小班初上了,意气风发。
生龙活虎,电脑前,撸码没日没夜。
早出晚归,活好钱不多,秃顶华发。
人生如梦,一尊还酹江月。
上面这首诗来自网站 https://1024.com/,一个非常有的网站
下面是我个人对这首诗的评析:
:four_leaf_clover:《念奴娇·程序员怀古 》【该诗题目言简意赅,没有废话,一读题目就知道该诗讲述的主要角色是 "程序员",让各位程序猿一看题目就有想读下去的冲动,写作手法高超:+1:。"念奴娇"是词牌名,"程序员怀古"则化用了苏轼的"赤壁怀古",这一化用简直精妙,B 格立刻提升。能化用苏轼的词的题目可见作者对诗词的掌握能力之高深,简直是被编程耽误的文学家啊!】
:four_leaf_clover:大京东去,淘宝进,格子衫牛仔裤。【这句词非常押韵,使人读起来朗朗上口,词的内容也直指各位程序员的内心,真是字字珠玑,语不惊人死不休。不仅让人读起来有美感,也描述了作者的从业经历。作者从自己的家乡不远万里到北京,进入阿里巴巴当程序员,从此格子衬衫和牛仔裤成为了他的工作服,格子衬衫和牛仔裤成为了他的战袍。格子衬衫和牛仔裤也正是描述了各位程序员的现状,用文字把一个程序员的现状描述得如此栩栩如生,真是“用文字画画的高手”。】
:four_leaf_clover:成都西安,北上广,南山区杭州西。【作者的工作经历并非平平淡淡,而是经历了多次转折(跳槽)。西安、成都、北京、上海、广东等作者都跳槽过,可见作者经历丰富,有较多的社会阅历。这里鼓励我们,要学会跳槽,要坚持不懈,无论生活多么困难,我们都要努力走下去。】
:four_leaf_clover:地铁穿空,公交进站,车门一堆挤。【讲述完自己的工作经历后,作者描绘了自己上班途中的场景。作者上班的时候,可以看到"地铁穿空"的景象,地铁迅速疾驰而过,形容时间飞快,像地铁行驶一样。不仅能够看到地铁穿空的宏伟景象,还可以看到一大堆奋斗者一起为了一个地铁位置而努力,大家都如此努力,大家都为了生活而拼搏,你有什么理由不努力。更加激起了读者的奋斗欲望,教导读者:即时地铁穿空(时间流逝飞快),也要珍惜时间,为了生活而和一大堆人竞争。:blush:】
:four_leaf_clover:江山如画,一时多少豪杰。【借用苏轼的《念奴娇 赤壁怀古》描绘当时上班、上班途中的场景如画一般让人怀念,不禁感叹,“那个时候多豪杰啊!”:blush:】
:four_leaf_clover:遥想老夫当年,小班初上了,意气风发。【借古讽今,作者把当年小班时候的意气风发和如今的“多少豪杰”进行对比。更加体现时间流逝,不知不觉小班都毕业了。现在要在北上广挤地铁了,要格子衬衫牛仔裤了。:blush:】
:four_leaf_clover:生龙活虎,电脑前,撸码没日没夜。【作者描述自己面对代码的时候总是生龙活虎,只要坐在电脑前撸代码,总能废寝忘食、总是没日没夜的写代码,真【生龙活虎:smirk:】:blush:】
:four_leaf_clover:早出晚归,活好钱不多,秃顶华发。【作者每天的工作状态:早上出门,晚上回家,非常充实,没有浪费一点点时间,这也是要激励我们这些后辈珍惜时间、过充实的生活。虽然钱不多,但活非常好,总能学到超越金钱的东西。:blush:】
:four_leaf_clover:人生如梦,一尊还酹江月。【最后一句,不知道咋编了。:blush:】
## (2) 程序员节
教师有教师节、护士有护士节、月亮有中秋节、屈原有端午节、妇女有女神节、程序员也有程序员节。至于放不放假嘛,不一定。放假一天,加班3天。
程序员:今天是程序员节?那就熬到2点吧,多睡一个小时,给自己放放假。
(3) 2的10次方和存储容量换算单位
- 计算机上的 doc 文档、ppt 文件的大小是多少?是1G、1M、还是1T?这里的 G、M 和 T 是计算计算机存储容量的单位。类似长度单位的 m、mm、cm
- 计算机上的文件的大小的计算机单位的换算如下:
1K = 1024 byte
1M = 1024 K
1G = 1024 M
1T = 1024 G
由于 2的10次方等于1024,也可以写作:
1K = 2^10 byte
1M = 2^10 K
1G = 2^10 M
1T = 2^10 G
关于 1024 还有啥有趣的地方也可以分享到评论区哈, 感谢!
:pray:
六、数据类型
前面说到:
:fire: 变量的三要素: 数据类型 + 变量名 = 值
:fire: 不同类型的变量可在指定数据类型的范围内不断变化(那数据类型有那些?更多的细节呢?下面来看 ......)
(1) 介绍数据类型
:leaves: 每一种数据都定义了明确的数据类型(整数数据的数据类型是 int、小数数据的数据类型是 float 和 double、文字数据的数据类型是 String ...)
:leaves: 针对每种数据类型在内存中分配了不同大小的内存空间(字节)【就像瘦子和胖子占的体积都是不一样的嘛】
:leaves: 每种数据类型规定了变量可以存放什么类型的数据和占用的字节大小
:leaves: Java 是强类型的编程语言,对变量的类型要求非常严格。有些编程语言是没有这么强的类型要求的(如 JavaScript)
:leaves: Java 的数据类型如下所示:
(2) 整数类型
用于存放整数数据(如 520、1314、9527、9420、240、1314、-7 等)
:maple_leaf: 有四种:byte、short、int、long
byte number1 = 10; // 占1字节
short number2 = 10; // 占2字节
int number3 = 10; // 占4字节
long number4 = 10; // 占8字节
public class IntegerType {
public static void main(String[] args) {
// Java 的整型常量默认是 int 类型, 声明 long 类型需在常量后面加【l】或【L(推荐)】
int num1 = -5; // -5 默认是 int 类型
long num2 = -5L; // -5L 是 long 类型
System.out.println(num1);
System.out.println(num2);
}
}
(3) 浮点类型
用于表示一个小数(如 3.14、6.9、-7.8)
- 浮点数在机器中的存放形式:浮点数 = 符号位 + 指数位 + 尾数位
- 尾数部分可能丢失精度(浮点数都是近似值)
public class FloatDoubleType {
public static void main(String[] args) {
double pi1 = 3.14159;
// Java 字符型常量默认是 double 类型
// 若想声明 float 类型的变量, 在常量末尾必须加 F 或 f
float pi2 = 3.141592F;
double pi3 = 3.14F;
// pi1 ≈ 3.14159
System.out.println("pi1 ≈ " + pi1);
// pi2 ≈ 3.141592
System.out.println("pi2 ≈ " + pi2);
// pi3 ≈ 3.140000104904175
System.out.println("pi3 ≈ " + pi3);
double num1 = .532;
double num2 = 0.532;
// num1 = 0.532
System.out.println("num1 = " + num1);
// num2 = 0.532
System.out.println("num2 = " + num2);
// 科学计数法类型
// 512.0
System.out.println(5.12E2); // 5.12 * 10^2
// 0.0512
System.out.println(5.12E-2); // 5.12 * 10^-2
}
}
(4) 字符类型
:sparkles: char 表示字符类型,用于存放单个字符(用单引号包裹)
:sparkles: char 占2个字节(可以存放汉字)
:sparkles: 单个字符用 char 类型,多个字符的话使用 String(后面详细说)
public class CharType {
public static void main(String[] args) {
char star = '❤';
char word = '庆';
char japanese = 'の';
char letter = 'X';
char digit = '9';
char a = 97;
System.out.println("star = " + star);
System.out.println("word = " + word);
System.out.println("japanese = " + japanese);
System.out.println("letter = " + letter);
System.out.println("digit = " + digit);
System.out.println("a = " + a);
/*
输出结果:
star = ❤
word = 庆
japanese = の
letter = X
digit = 9
a = a
*/
}
}
:sparkles: 在 Java 中,char 的本质是一个整数,输出的是 unicode 码对应的字符(可直接给 char 变量赋值一个整数,输出的时候会按照对应的 unicode 字符输出)
:sparkles: char 类型的变量是可以进行运算的(char 类型的变量本质是整数)
(5) 布尔类型
boolean 类型只有两种取值:true 或 false(占1个字节)
boolean 类型用于判断一个表达式的值是真还是假
布尔类型一般是做逻辑运算(用在流程控制语句中)
流程控制语句有:
- if 条件控制语句
- while 循环控制语句
- do-while 循环控制语句
- for 循环控制语句
(6) 自动类型转换(数值型基本数据类型)
:maple_leaf: Java 的基本数据类型的变量进行赋值操作的时候,精度小的数据类型会自动转换为精度大的数据类型
:maple_leaf: 数据类型精度排行
byte :arrow_right: short :arrow_right: int :arrow_right: long :arrow_right: float :arrow_right: double
char :arrow_right: int :arrow_right: long :arrow_right: float :arrow_right: double
:sparkles: ① 有多种类型的数据混合运算的时候, 编译器首先自动将等号右边的混合数据类型(如 int 和 float)转换为精度最大的那种数据类型(int), 然后才进行自动类型转换
上图的代码中:
① 变量 i 是 int 类型,
② 数字 1.2 是 double类型(浮点数常量默认是 double 类型,若想使用 float 类型需要在浮点数常量后面加【f】或【F】)
③ 当多种类型的数据进行混合运算的时候,编译器会将它们先转换为精度最大的那种数据类型,然后才进行自动类型转换
④ int 类型的精度低于 double 类型的精度,所以等号右边可看做是 double 类型
⑤ double 类型的数据赋值给 float 常量自然就会报错
如何解决上图的错误?
(1)用 double 类型的变量接收
public class Main {
public static void main(String[] args) {
int i = 10;
// float f = i + 1.2; // ERROR
double d = i + 1.2; // OK
}
}
(2)强制类型转换(后面还会详说)
public class Main {
public static void main(String[] args) {
int i = 10;
// float f = i + 1.2; // ERROR
double d = i + 1.2; // OK
// 强制类型转换
float f1 = i + (float) 1.2; // OK
float f2 = (float) (i + 1.2); // OK
System.out.println("d = " + d);
System.out.println("f1 = " + f1);
System.out.println("f2 = " + f2);
/*
输出结果:
d = 11.2
f1 = 11.2
f2 = 11.2
*/
}
}
上面的代码中:用强制类型转换运算符 () 将高精度的 double 类型强制类型转换为了低精度数据类型 float
:sparkles: ② 精度小的的数据类型会自动转换为精度大的数据类型(弱者服从强者);精度大的数据类型不能自动转换为精度小的数据类型(会报错)
:sparkles: ③ byte、short 和 char 之间不会相互自动类型转换
byte、short、char 之间进行计算首先会被转换为 int 类型
boolean 不会参与自动类型转换
自动类型提升原则:表达式结果的类型自动提升为操作数中的最大精度的类型
(7) 强制类型转换
:sweat_drops: 强制类型转换:把精度大的数据的类型强制转换为精度小的类型
:sweat_drops: 使用需加上强制类型转换符 ()
:sweat_drops: 可能造成精度降低或溢出
public class Test {
public static void main(String[] args) {
int i1 = (int) 6.6;
int i2 = (int) 1.9;
int i3 = (int) 2.5;
System.out.println(i1); // 6 精度丢失
System.out.println(i2); // 1 精度丢失
System.out.println(i3); // 2 精度丢失
int i_ = 100;
byte b = (byte) i_;
System.out.println(b); // 100
}
}
:sparkles: ① 当精度低的数据需要转换为精度高的数据的时候需要进行强制类型转换
:sparkles: ② 强制类型转换符只对它附近的操作数进行强制类型转换(就近原则)
public class Test {
public static void main(String[] args) {
double d = 2.2;
// 下面代码的【(float)】不会对变量 d 进行强制类型转换, d 仍旧是 double 类型
// float f0 = (float) 1.1 + d;
float f1 = (float) 1.1 + (float) d; // 两次丢失精度
float f2 = (float) (1.1 + d); // 一次丢失精度
System.out.println("f1 = " + f1); // f1 = 3.3000002
System.out.println("f2 = " + f2); // f2 = 3.3
}
}
浮点数永远是近似值
:sparkles: ③ char 类型可以保存 int 类型的常量值
不能保存 int 类型的变量值(若想?强制类型转换)
public class Test {
public static void main(String[] args) {
int b = 98;
System.out.println("b = " + (char) b); // b = b
/*
下面代码的等号右边会先被编译器识别为一个 int 类型
int 类型无法赋值给精度比它低的 char 类型
*/
// char c2 = b + 1; // ERROR
char c3 = 98 + 1; // OK
System.out.println("c3 = " + c3); // c3 = c
}
}
(8) Exercise
public class Test {
public static void main(String[] args) {
short s = 12;
// s = s - 9; // ERR: 9 是 int 类型
s = (short) (s - 9);
System.out.println("s = " + s); // s = 3
}
}
public class Test {
public static void main(String[] args) {
byte b = 11;
short s = 11;
// 等号右边的表达式先进行运算
// 运算后的值是 22 (int 类型)
// 需强制为 short
// short b1= b + s; // ERROR
short b2 = (short) (b + s);
System.out.println("b2 = " + b2); // b2 = 22
}
}
七、基本数据类型和 String 类型的转换
String:字符串(在 Java 中,被双引号包裹的内容就是字符串) String 在后期会非常非常详细地进一步说明
基本数据类型 byte、short、int、long、float、double、char、boolean 转换为字符串类型和字符串类型转换为基本数据类型在开发中非常常见。在此,先基本学习一下,后期能够有更深的体会。
(1) 基本数据类型转 String
直接拼接空串
public class Test {
public static void main(String[] args) {
byte b = 1;
short s = 2;
int i = 3;
long l = 666L; // 必须加【L】, 否则 666 是 int 类型
float f = 3.14F; // 必须加【F】, 否则 3.14 是 double 类型
double d = 3.14159;
char c = '龙';
boolean bool = true;
System.out.println(b + ""); // 1
System.out.println(s + ""); // 2
System.out.println(i + ""); // 3
System.out.println(l + ""); // 666
System.out.println(f + ""); // 3.14
System.out.println(d + ""); // 3.14159
System.out.println(c + ""); // 龙
System.out.println(bool + ""); // true
}
}
(2) String 转基本类型
使用基本类型的包装类型下面简单说明一下【基本类型的包装类型】,后期会详细说明
基本类型的缺点:
:musical_note: 无法表达空值(不存在的值)
:musical_note: 使用过程不够面向对象
:musical_note: 常用于面向过程编程中
这里不用看了
基本数据类型的包装类型可认为是基本数据类型的高级版本:rose:,使用方法和基本数据类型一模一样。
写法上除了 int 和 char 之外,都是基本类型写法的首字母大写。
基本类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
String 转基本类型的方法(代码):
public class Test {
public static void main(String[] args) {
String bStr = "1";
String sStr = "2";
String iStr = "3";
String lStr = "5";
String fStr = "3.14";
String dStr = "3.14159";
String boolStr = "true";
// 字符串转基本数据类型
byte b = Byte.parseByte(bStr);
short s = Short.parseShort(sStr);
int i = Integer.parseInt(iStr);
long l = Long.parseLong(lStr);
float f = Float.parseFloat(fStr);
double d = Double.parseDouble(dStr);
boolean bool = Boolean.parseBoolean(boolStr);
}
}
❀ 在将 String 类型转成基本数据类型时,需保证字符串能够转换为对应的基本类型。如可将【123】转成一 个整数,但不能把【ILoveYou】转成一个整数。
❀ 如果无法转换会出现类型转换异常(异常后期会详细说)