Java变量与数据类型
一、变量
1、变量的引出
例1:编写一个程序,计算半径为5的圆面积。
问题:
- 圆面积求法,Area = Π * r2 (Π取3.14)
- 程序写法
//文件名: CicleArea.java (下同)
public class CicleArea{
public static void main(String[] args){
System.out.println(3.14 * 5 * 5);
}
}
执行结果:
注释
观察代码发现运行没问题,但是代码不具有可读性,作为一名合格的程序员写代码必不可少的就是注释。
注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行。也就是说注释是不会参与运行的。
程序员圈有一个笑话
最讨厌在写代码的时候写注释, 最讨厌别人的代码里面不写注释
代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。
原则: 1、注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范。 2、注释内容准确简洁 内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。
注释条件:
1、基本注释(必须加) (a) 类(接口)的注释 (b) 构造函数的注释 (c) 方法的注释 (d) 全局变量的注释 (e) 字段/属性的注释 备注:简单的代码做简单注释,注释内容不大于10个字即可,另外,持久化对象或VO对象的getter、setter方法不需加注释。具体的注释格式请参考下面举例。
2、特殊必加注释(必须加) (a) 典型算法必须有注释。 (b) 在代码不明晰处必须有注释。 (c) 在代码修改处加上修改标识的注释。 (d) 在循环和逻辑分支组成的代码中加注释。 (e) 为他人提供的接口必须加详细注释。 备注:此类注释格式暂无举例。具体的注释格式自行定义,要求注释内容准确简洁。
注释格式: 1、单行(single-line)注释://……
2、块(block)注释:/*……*/
3、文档注释:/**……*/
4、javadoc 注释标签语法 @author 对类的说明标明开发该类模块的作者 @version 对类的说明标明该类模块的版本 @see 对类、属性、方法的说明参考转向,也就是相关主题 @param 对方法的说明对方法中某参数的说明 @return 对方法的说明对方法返回值的说明 @exception 对方法的说明对方法可能抛出的异常进行说明
注:以上对注释的解释来自 https:// zhidao.baidu.com/questi on/226829285.html
问题:
- 如果此时又需要求半径为10的圆面积呢?
答:我们需要将 5 改为10,对吧,还挺简单的,只需要改两下,是吧?? - 那么如果是一个底面半径为10,高为5的圆柱体的体积呢?(V = Π * r2 * h),代码如下:
// CylindricalVolume.java
//圆柱体体积类
public class CylindricalVolume{
public static void main(String[] args){
//打印圆柱体体积
System.out.println(3.14 * 10 * 10 * 5);
}
}
- 现在需要打印圆柱体体积、圆柱体的底面积??怎么做?要如下写吗?
// Cylindrical.java
//圆柱体类
public class Cylindrical{
public static void main(String[] args){
//打印圆柱体底面积
System.out.println(3.14 * 10 * 10);
//打印圆柱体体积
System.out.println(3.14 * 10 * 10 * 5);
}
}
显然这样是不行的,这时我们需要一个用一个东西来存储圆的面积。这就是变量。
2、变量的定义
结论:变量是内存中装载数据的小盒子,你只能用它来存数据和取数据。
变量定义的格式包括三个要素:数据类型
、 变量名
、 数据值
。 格式:
数据类型 变量名 = 数据值;
3、变量名与标识符
变量名:变量的名字。
标识符:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识符。
java中变量的命名需要满足标识符的规则与规范。
- 标识符的规则
- 变量名首字母必须为字母(a-z A-Z),下划线(_),或者美元符号($)开始;
- 变量名只能是字母(a-z A-Z),数字(0-9),下划线(_)的组合,并且之间不能包含空格,数字不能放在变量名首位;
- 变量名不能使用编程语言的关键字或保留字;
- 标识符是严格区分大小写的。
标识符的规范
- 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。如:HelloWorld
- 方法名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。如:stuNum
- 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
- 常量名规范:全部大写,单词之间用下划线(_)。如:MAX_SIZE
- 所有命名最后可以见名知意。如:用age 表示年龄
4、数据类型
数据类型分类
Java的数据类型分为两大类:
- 基本数据类型:包括
整数
、浮点数
、字符
、布尔
。 - 引用数据类型:包括
类
、数组
、接口
、Lambda
。
基本数据类型
四类八种基本数据类型:
注意事项:
1.字符串类型是引用数据类型,不是基本数据类型 2.Java中的默认类型:整数类型是int
、浮点类型是double
。 3.小数是一个无限趋近的数,并非精确值 4.数据范围不一定是字节越大范围越大
5、变量的分类
局部变量、成员变量、静态变量的区别:
6、使用变量
练习
定义所有基本数据类型的变量,代码如下:
public class Variable {
public static void main(String[] args){
// 定义字节型变量
byte b = 127;
System.out.println(b);
// 定义短整型变量
short s = 100;
System.out.println(s);
// 定义整型变量
int i = 123456;
System.out.println(i);
// 定义长整型变量
long l = 1234567890L;
System.out.println(l);
// 定义单精度浮点型变量
float f = 5.5F;
System.out.println(f);
// 定义双精度浮点型变量
double d = 10.5;
System.out.println(d);
// 定义布尔型变量
boolean bool = true;
System.out.println(bool);
// 定义字符型变量
char c = 'A';
System.out.println(c);
}
}
回到问题3(现在需要打印圆柱体体积、圆柱体的底面积??怎么做?),此时可以将代码编写如下:
// Cylindrical.java
//圆柱体类
public class Cylindrical{
public static void main(String[] args){
//圆柱体底面圆的半径
double radius = 10.0;
//圆柱体的高
double height = 5.0;
//圆柱体的底面积
double area = 3.14 * radius * radius;
//圆柱体的体积
double volume = area * height;
//打印圆柱体底面积
System.out.println(area);
//打印圆柱体体积
System.out.println(volume);
}
}
观察发现,比以前还多了几条语句,可能想说,这不是变复杂了吗??真的是这样吗?不是的,此时程序的扩展性极强,如果条件(半径、高)再发生改变,只需相应修改radius(半径)、height(高)的值即可。而不需要替换所有的数据,如果在替换所有数值时,漏改、写错都会得不到我们想要的结果。并且以后代码远远不会就这么几行解决,10处以内的修改还好,那么50处,100处呢?
此时还有一个问题:
- 如果此时要将圆周率设为
3.1415926
,怎么写?同样如果Π
要多次引用,每次都写这么长的值?
答:可以用变量pi
表示吗?感觉是可以,实际测试后发现也可以。但是变量有什么点?变量是在程序运行过程中,其值可以发生改变的量,那么如果pi
的值被改变,那么结果还有效吗?这时我们需要一个变量来存储pi
,又不希望它可以被改变,那就用常量。
二、常量
常量:是指在Java程序中固定不变的数据。
1、分类
字面值常量:
自定义常量: 被final修饰的变量为常量
再次修改后的代码:
// Cylindrical.java
//圆柱体类
public class Cylindrical{
public static void main(String[] args){
//圆周率PI
final double PI = 3.1415926;
//圆柱体底面圆的半径
double radius = 10.0;
//圆柱体的高
double height = 5.0;
//圆柱体的底面积
double area = 3.14 * radius * radius;
//圆柱体的体积
double volume = area * height;
//打印圆柱体底面积
System.out.println(area);
//打印圆柱体体积
System.out.println(volume);
}
}
2、练习
需求:输出各种类型的常量。
public class ConstantDemo {
public static void main(String[] args){
// 输出整数常量
System.out.println(1);
// 输出小数常量
System.out.println(0.1);
// 输出字符常量
System.out.println('A');
// 输出布尔常量
System.out.println(false);
// 输出字符串常量
System.out.println("Hello Java!!!");
}
}
三、数据类型转换
1、定义
boolean类型不参与类型转换
2、自动转换
一个byte
类型变量赋给一个int
类型变量, 结果会是什么数据类型?
byte b1=121;
//自动类型提升
int i1=b1;
运算结果,变量的类型将是int
类型,这就是出现了数据类型的自动类型转换现象。
自动转换:将取值范围小的类型
自动提升为取值范围大的类型
。
- 从小到大
- byte,short,char --> int long float double
- byte,short,char之间是平级的,不相互转换,直接转成int类型参与运算。
public static void main(String[] args) {
int i = 1;
byte b = 2;
// byte x = b + i; // 报错
//int类型和byte类型运算,结果是int类型
int j = b + i;
System.out.println(j);
}
3、强制转换
将i (120)
赋值到short
类型变量会发生什么?产生编译失败,肯定无法赋值。
public static void main(String[] args) {
int i = 120;
short s = i; // 报错
System.out.println(s);
}
这是为什么?120
在short
的取值范围内,为什么报错?因为数据类型,i
是一个整型变量(注意,变量是在程序运行过程中可以改变的,此时i = 120
,后面有没有可能是1000
或者10000
,这时i
的值远大于short
的取值范围)内存4个字节,而short
是短整型内存2个字节,可以理解为int
是4升的水壶,short
是2升的水壶,不能把大水壶中的水直接放进小水壶去。想要赋值成功,只有通过强制类型转换,将int
类型强制转换成short
类型才能赋值。
转换格式:
数据类型 变量名 = (数据类型)被转数据值;
public static void main(String[] args) {
int i = 120;
short s = (short)i;
System.out.println(s);
}
注意:强制转换可能会损失精度。如下:
public static void main(String[] args) {
double d=5.99;
int i=(int)d;
System.out.println(i);
}
观察结果发现,有精度的损失。但是它有一个取整的效果。
四、赋值问题
byte、short、char赋值注意事项:
只要在其范围内的常量就能成功赋值。赋值需要满足两个条件:
- 在其(byte、short、char)取值范围内
- 常量
继续研究将i (120)
赋值到short
类型变量会发生什么?产生编译失败,肯定无法赋值。
public static void main(String[] args) {
int i = 120;
short s = i; // 报错
System.out.println(s);
}
条件一:满足short的取值范围吗?满足
条件二:满足常量吗?不满足,赋值失败,报错。
将代码修改如下:
public static void main(String[] args) {
//int i = 120;
short s = 120;
System.out.println(s);
}
没有任何的问题,字面值常量可以,那么自定义常量可以吗?我们试一下。
编译运行,如图所示:
完全可以,这表示byte、short、char赋值:只要在其范围内的 常量 就能成功赋值。