变量以及运算符
变量
一、变量
-
概念:计算机中一块内存空间,是数据的基本存储单元。
-
变量的组成:
1. 变量名:用于获取变量中存储的数据,是变量的标识符(注意语法规范)。 2. 数据类型:用于约束变量所存储的数据种类。 3. 数据:变量中存储的值。
Java是一门强类型的语言,每种数据都有与之对应的数据类型 。
2.使用变量
-
声明定义(创建变量)
语法:数据类型 变量名;
-
为变量赋值
语法:变量名 = 值; // 程序运行时将值赋值给左侧的变量,执行流程:先右后左。
*注意:没有赋值的变量不能使用,值必须与数据类型一致,否则编译错误。
如下:// 数据类型:int 整数类型 // 声明定义一个int类型的变量 int a; // 为a变量赋值 a = 150;
-
声明同时赋值
语法:数据类型 变量名 = 值;
如下:
// 声明定义一个int类型的变量,赋值为10 int a = 10;
-
声明多个变量并赋值
语法:数据类型 变量名1,变量名2,变量名3.....; 声明定义多个变量,数据类型相同
如下:
int a,b,c;// 一次性定义三个int类型的变量分别是a、b、c
声明时为变量赋值
语法:数据类型 变量名1 = 值1,变量名2 = 值2...;
如下:
int a = 10, b = 20, c = 100;
3.数据类型
1.基本数据类型
2.引用 数据类型
字符串:String
作用:存储多个字符
字面值:" "
如下:
String str = “ABCDEFG”;
String str2 = “HelloWorld”;
所占字节空间:变量的大小,原则上相同类型的变量所占字节空间越大能存储的数据越多。
数值范围:变量存储的数据的合法范围(上下限)
字面值:变量中存储的值有什么样的规范
补充:
1. 所有小数类型(float/double)都支持科学计数法的字面值
2. 科学计数法表示数字 3.5E2 等于3.5 * 10^2
3. 所有小数类型运算时只能存储近似值,最接近结果的值而不是精确的值(将来有类替代小数进行运算)
4. JDK10后支持var类型的变量,可以自动根据数据种类自动调整数据类型,var可以存储任何类型的数据
5. JDK13后支持文本域可以使用""" """ 标识字符区域,可以保留原有区域结构
String str = """
ABC
BCD
ABD
""";
6. Java中所有的整数默认为int类型,小数默认为double类型
7. 整数字面值:
8进制:首位为0
16进制:首位为0x
2进制: 首位为0b
1.7后支持_分隔符,例:1_000_000
-
转义字符
作用:取消或赋予一个字符特殊的能力
转义字符:\
常见转义字符组合转义字符 作用 \" 普通双引号(不再属于字符串字面值) \’ 普通单引号(不再属于字符的字面值) \t 跳格 \n 换行
4.类型转换
- 自动类型转换:由JVM自动将某种类型的数据转换为另一种类型。
前提条件:
1. 两种类型必须兼容
byte-short-int-long-float-double-char 相互兼容
2. 目标类型>源类型
byte<short/char<int<long<float<double
byte a = 100;
//目标类型 源类型
int b = a;
如下:int 转换为 float
int a = 100;
float f = a; // 两种类型兼容,且目标类型>源类型 赋值成功。
2.强制类型转换:当两种类型兼容,目标类型<源类型时避免编译器的干预倒置的编译错误,由程序员自己保证数据的大小,承担转换失败的风险。
语法:
目标类型 变量名 =(目标类型)源类型;
如下:
int a = 100;
// byte vs int 两种类型兼容,目标类型<源类型
byte b = (byte)a; // 将int类型的变量a强制转换为byte类型,存储到byte变量中
强制类型转换的结果
- 数据长度合适,数据转换完整。
- 数据长度不合适,数据截断,结果不正确。
- 小数转换为整数,只保留整数部分。
- 整数转换为字符,长度合适,数据完整。
备注:只有变量的值来源于另外一个变量且两个变量类型不一致时才会出现以上情况。
注意:boolean与任何类型均不兼容。
演示的代码如下:
package com.txw;
public class TestConversion{
public static void main(String[]args){
//int a = 10;
// 变量b的值与变量a的值一致,由变量a负责给变量b赋值
// int b = a;
// byte a = 100; // byte -128~127
// long lo = 10000L;
// String str="婷姐";
// int b = a; // byte类型的数据转换为int
// float f = lo; // long---->float
int a = 12345;
// byte vs int 两种类型兼容,目标类型<源类型
byte b = (byte)a; // 将int类型的变量a强制转换为byte类型,存储到byte变量中
System.out.println( a );
System.out.println( b );
float f = 1.25F;
// float vs int 两种类型相互兼容,目标类型<原类型
int c = (int)f;
System.out.println( f );
System.out.println( c );
int d = 65;
// int vs char 两种类型相互兼容,目标类型<源类型
char ch = (char)d;
System.out.println( d );
System.out.println( ch );
}
}
如图所示:
5.表达式
- 概念:使用运算符链接的两个变量或值,最终可以得到一个结果。
如下:
当运算过程中参与运算变量类型不一致时结果类型偏向较大的类型。int a = 10; int b = 20; // 表达式 a+b 结果:30
自动类型提升
如下:int与double
int a = 10;
double b = 20.5;
System.out.println( a+b ); // 结果:30.5 (double类型)
如下:byte与long
byte a = 10;
long b = 2000L;
System.out.println( a+b ); // 结果:2010 (long类型)
如下:byte与byte(特殊)
byte b1 = 10;
byte b2 = 120;
System.out.println( b1+b2 ); // 结果:130(int类型)
如下:任何类型与String(特殊)
int a = 10;
String str = "Hello";
System.out.println( a + str ); // 结果:10Hello(String 类型)
提升规则:
byte/short/char<int<long<float<double<String
byte/short/char之间运算时结果均为int。
其余数据类型运算时结果偏向较大数据类型。
6.运算符
-
算数运算符
int a = 10; int b = 2; String str = "Hello"
运算符 作用 例 结果 + 加法运算/字符串拼接 a+b
a+str12
10Hello- 减法运算 a-b 8 * 乘法运算 a*b 20 / 除法运算 a/b 5 % 取余(模运算) a%b 0 -
赋值运算符
int a = 10; int b = 2;
运算符 作用 例 结果 表达式结果 = 右侧数值赋给左侧的变量 a = 20 a的值为20 20 += 用变量本身与另一个变量相加求和之后再赋值 a+=b 等同于
a = a+ba的值为12 12 -= 用变量本身与另一个变量相减之后再赋值 a-=b等同于
a = a-ba的值为8 8 *= 用变量本身与另一个变量相乘之后再赋值 a*=b等同于
a = a*ba的值为20 20 /= 用变量本身与另一个变量相除之后再赋值 a/=b等同于
a = a/ba的值为5 5 %= 用变量本身与另一个变量取余之后再赋值 a%=b等同于
a = a%ba的值为0 0 ++ 变量本身+1 ++a 等同于 a + 1
a++ 等效于 a + 1a的值为11
a的值为1111
10– 变量本身-1 –a等同于a - 1
a–等效于a - 1a的值为9
a的值为99
10面试题:
int a = 5;int b = 2;a+=(a++)+(++a)-(b--)+(++b); //a=a+(a++)+(++a)-(b--)+(++b); // 表达式结果: 变量的变化 a =5 b = 2//a = 5+5+(++a)-(b--)+(++b); (a++)结果为5 a变量6 // a = 5+5+7-(b--)+(++b); (++a)结果为7 a变量7//a = 5+5+7-2+(++b); (b--)结果为2 b变量1//a = 5+5+7-2+2; (++b)结果为2 b变量2//17每一步都要记录表达式的结果与表达式对变量的影响再进行下一步运算
-
关系运算符
作用:判断两个变量之间的关系,结果均为boolean类型int a = 10;int b = 20;
运算符 作用 例 结果 > 大于 a > b false < 小于 a < b true == 等于 a == b false != 不等于 a != b true >= 大于或等于 a >= b false <= 小于或等于 a <= b true -
逻辑运算符
作用:用于多条件联合判断,结果均为布尔类型int a = 10;int b = 20;int c = 2;
运算符 作用 例 结果 || 逻辑或,表示或者
两个条件(表达式)有一个为true时结果为truea<b || a>c
a>b || a==ctrue
false&& 逻辑与,表示并且
两个条件必须同时为true结果为truea<b && a>c
a>b && a>ctrue
false! 逻辑非,取表达式结果相反的值(颠倒是非) !(a>b) true ||、&&为短路运算符:当第一个表达式执行后就能决定整体结果时,不在执行后续表达式|、&为非短路运算符:无论之前的表达式结果能不能决定整体结果,所有表达式必须执行一次
-
三目运算符
作用:根据条件的结果返回不同的结果
语法:布尔表达式?结果1:结果2;布尔表达式为true 返回结果1布尔表达式为false 返回结果2
布尔表达式即结果为boolean类型的表达式。
如下:int a = 10;int b = 20;System.out.println( a>b?"Hello":"World" ); // 由于a>b为false,返回结果2所以打印World System.out.println( a<b? a+10:b+10 ); // 由于a<b为true,返回结果1所以打印a+10后的结果 20
如下:
// 商品价格 double price = 80D; // 设计程序完成需求:超市打折满100-20 // 根据活动规则计算应付款 // 如果 商品价格>=100 应支付 原价-20 否则 按照原价支付 double realPrice = price>=100?price-20:price; System.out.println("应支付"+ realPrice );
-
位运算符
运算符 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位非 |
<< | 向左位移 |
>> | 向右位移 |
>>> | 无符号向右位移 |
7.习题
- 简述 Java 中的数据类型分类及内存。
答:数据类型分类 为基本数据类型和引用数据类型。基本数据类型又分为:整数、浮点数、字符、布尔。整数有:byte为1字节数、short为2字节数、int为4字节数、long为8字节数。浮点数有float为4字节数、double为8字节数。字符只有char为2字节数。布尔只有boolean为1字节数。引用数据类型为数组、接口、对象等。 - 下列变量定义不正确的是(B)
A. int a; B. float f=12.3; C. short s=128; D. char c=65;
原因:小数类型的变量默认值为double类型,如需为float类型变量赋值,需要在后面加上F/f。 - 下面关于自动类型转换描述正确的是©
A. char 类型数据可以自动转换为任意基本的数据类型
B. char 类型数据只能转换为 int 类型的数据
C. char 类型数据不能直接转换为 boolean 类型数据
D. char 类型不能进行自动类型转换
原因:char类型不能转换成boolean类型,char类型可以直接转换成int、long、float、double。 - 执行下面程序后,哪一个结论是正确的(D)
int a,b,c; a=1; b=3; c=(a+b>3 ? ++a : b++);
A. a 的值为 2,b 的值为 3,c 的值为 1
B. a 的值为 2,b 的值为 4,c 的值为 2
C. a 的值为 2,b 的值为 4,c 的值为 1
D. a 的值为 2,b 的值为 3,c 的值为 2 - 表达式 (int)6.5/7.5*3 的结果数据类型为double类型 原因:(int)的优先级高于。
- 设有定义 int a = 12; 则执行 a*=12;语句后,a 的值为______144___________。
- 写出以下打印语句输出的结果: (1) System.out.println(6+5); 打印输出的结果是_____11_____。
(2) 写出 System.out.println(“6”+5); 打印输出的结果是___65______
(3) System.out.println(6+5+”B”); 打印输出的结果____11B____。 - 设 a,b,x,y,z 均为 int 类型变量,并已经赋值,下列表达式的结果属于非逻辑值的是( D)
A. x>y && b<a B. -z > x-y
C. y == (++x) D. y=x*x - 一家商场在举行打折促销,所有商品都进行 8 折优惠。一位程序员把这个逻辑写成:
short price = …; // 先计算出原价
short realPrice = price * 8 / 10; // 再计算出打折之后的价格
请问上述代码逻辑及设计是否正确?
I. 如果正确,假设 price 为 100,那计算之后的 realPrice 值为多少?
II. 如果不正确,说明原因并写出改正的方案。
答:不正确,解析:表达式 short realPrice=price8/10; 中 price为short类型应该将short类型的价格改成double类型
double realPrice = price8/10;
解析:price是short类型而整数类型的默认类型为int类型的,8为默认的int类型,计算之后会进行自动类型提升,结果为int类型,却用short类型的realPrice接受,会报出可能损失精度的错误。最好将其改为double类型的realPrice接受,这样也不损失小数部分。 - 仔细分析以下程序,说出程序的最终打印的结果 。
public class Test {
public static void main(String[] args) {
int a = 5;
int b = (a ++) + (--a ) + (++a );
System.out.println(a);
System.out.println(b);
}
}
答:a=6 b=16
a++ :先赋值再加1 (a++) = 5; a = 6;
–a :先-1再赋值 a-1=5; (–a) = 5
++a :先加1再赋值 a+1=6; (++a) = 6;
5+5+6=16。
11.仔细分析以下程序,说出程序的及最终打印的结果。
public class Test {
public static void main(String[] args) {
int a = 3, b = 7 , c=1, result;
result = (a < b ) ? a : b;
result = (result < c) ? result : c;
System.out.println(result);
}
}
答:result=1
12. 编程:定义一个 int 类型的变量 n,同时对 n 赋值一个三位的数据,分别获取 n 的个位、十 位、百位上的数值,并分别打印输出。
答:代码如下:
public class Test {
public static void main(String[] args) {
int n = 666;
int a = n / 100; // 获取百位数
int b = n / 10 % 10; // 获取十位数
int c = n % 10; // 获取个位数
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
13.编程:定义一个 int 类型的变量 a,请用表达式判断 a 是否为偶数,将结果打印输出。
答:代码如下:
public class Test {
public static void main(String[] args) {
int a = 120;
String str = (a % 2 == 0) ? "是偶数" : "不是偶数";
System.out.println(str);
}
}
第二种代码如下:
import java.util.Scanner;
public class Test{
public static void main(String[]args){
// 1. 创建Scanner对象
Scanner sc = new Scanner(System.in);
// 店长推荐:加入提示语句
System.out.println("请输入一个整数,按Enter键确定:");
// 2. 根据需要的数据选择相应的接收方法
int a = sc.nextInt();
// 判断a是否为偶数,偶数:都能被2整除,除2余数为0
System.out.println( a%2==0 );
}
}
14.编程:定义两个 int 类型的变量 m 和 n,请用表达式判断 n 是否为 m 的因子,将结果存储 在对应类型的变量中,并将结果打印输出。
答:代码如下:
public class Test {
public static void main(String[] args) {
int m = 12, n = 5;
boolean b = m % n == 0;
System.out.println(b);
}
}
15.编程:定义类型 int 类型的变量 a 和 b,用代码实现将 a 和 b 变量中数据互换,将交换后的 内容打印输出。
答:代码如下:
public class Test {
public static void main(String[] args) {
int a = 100;
int b = 200;
int t = a;
a = b;
b = t;
System.out.println(a);
System.out.println(b);
System.out.println(t);
}
}
第二种代码如下:
public class Test{
public static void main(String[]args){
/*
编程:定义类型 int 类型的变量 a 和 b,用代码实现将 a 和 b 变量中数据互换,将交换后的
内容打印输
*/
int a = 123;
int b = 456;
// a存b的值
// b存a的值
int c = a; // 定义中间变量 将a的值暂存到c变量中,避免被覆盖后找不到
a = b; // 将b的值赋给a,覆盖掉a原有的值 a = 456 b = 456
b = c; // 将c的值赋给b,覆盖掉b原有的值 a = 456 b = 123
System.out.println( a +"\t" + b );
}
}
总结如图所示:
相关文章
- 解答私信@呵,搞笑、、、 //C 定义一个结构体变量(包括年、月、日),输入年份和第几天,反过来计算该日在本年中是几月几号。注意闰年的问题。
- 08、共享变量(Broadcast Variable和Accumulator)
- Yaf 在Bootstrap中注册变量,然后在其他地方进行使用!
- 类变量、实参、形参、方法参数、代码块参数
- Python的变量以及类型
- js之变量介绍
- Velocity学习(四)之判断是否为空以及为什么要使用{}来明确标识变量
- 在vuecli3怎么设置全局公用的样式变量?
- 浏览器原理 06 # 变量提升:JavaScript代码是按顺序执行的吗?
- shell编程 | 变量的赋值及shell脚本参数
- Makefile第二讲:打印出内容和使用变量