Java学习之旅基础知识篇:数据类型及流程控制
作者:网络转载 发布时间:[ 2016/5/3 11:16:55 ] 推荐标签:测试开发技术 编程语言
箭头左边的类型可以自动转化为右边的类型。此外,当基本类型与字符串进行连接时,基本类型会自动转换为字符串。反之,将字符串转化为基本类型则调用xxx.pareseXxx方法(如Integer.parseInt("12"))。
public class AutoConversion {
public static void main(String[] args) {
int a = 6;
float f = a;
System.out.println(f);//6.0
byte b = 9;
//char c = b;//出错,byte不能自动转化为char
double d = b;
System.out.println(d);//9.0
//基本类型与字符串进行转化
String s = 5.3F + "";
System.out.println(s);//5.3
System.out.println(3 + 4 + "Hello!");//7Hello!
System.out.println("Hello!" + 3 + 4);//Hello!34
}
}
反之,如果想把箭头右边的类型转换为左边的类型,需要强制类型转换,这样做可能导致数据溢出或精度丢失。因此在进行强制类型转换时需格外小心。
public class ForceConversion {
public static void main(String[] args) {
int i = 234;
byte b = (byte)i;
System.out.println(b);//-22
double d = 3.56;
int n = (int)d;
System.out.println(n);//3
}
}
可能大家会问234咋转换为byte变成了-22了呢?我们都知道,byte的范围是-128~127,显示超出了表示的范围,234的二进制表示为00..0011101010,转换后截取后8位之后变成11101010,而第一位是符号位(这里是个负数),而负数在计算机中以补码形式存在,需要转换为原码(补码减1成反码再按位取反,符号位不变,因此:11101010-->11101001-->10010110)。
在进行表达式计算时,数据类型会发生自动提升:如所有byte、short和char将自动提升为int类型,表达式的数据类型将提升为高等级操作数的数据类型。对于整数相除时,即使不能除尽也要舍弃小数部分,对于字符串与数字或字符相加时,此时应该从左自右进行运算,以判断是否为字符串连接还是加法运算。
public class AutoPremotion {
public static void main(String[] args) {
short s = 5;
//s = s - 2;//出错,表达式被提升为int
byte b = 10;
char c = 'a';
double d = .12;
System.out.println(b + c + d);//表达式被提升为double
System.out.println(23 / 3);//7
System.out.println(b + c + "Hello!");//107Hello!
System.out.println("Hello!" + b + c);//Hello!10a
}
}
在讲解流程控制之前,我在这里补充一下平常容易出错的知识点。我们来看以下程序:
public class CompareString {
public static void main(String[] args) {
String a = new String("Miracle");
String b = new String("Miracle");
System.out.println(a == b);//false,因此a与b指向不同的实例(尽管内容一致)
String c = "Miracle";
String d = "Miracle";
System.out.println(c == d);//true,此处由于字符串缓存机制,比较的仅仅是两者的内容
}
}
另外,对于短路运算符(如||)与不短路运算符(如|)的区别: ||先计算左边的操作数,如果为true将不再继续计算,而|不管左边结果如何都会计算之后的操作数。
public class TestLogicOperator {
public static void main(String[] args) {
int a = 5;
int b = 10;
if(a > 4 || b++ > 10)
{
System.out.println("a=" + a + ",b=" + b);//a=5,b=10
}
if(a > 4 | b++ > 10)
{
System.out.println("a=" + a + ",b=" + b);//a=5,b=11
}
}
}
接下来,进入流程控制的讲解,任何编程语言(Java也不例外)的流程控制结构包含:顺序结构和分支结构(if、if...else、if...else if...else、switch)和循环结构(while、do...while、for、foreach)。这里不再举例说明,只是强调一点,对于分支结构if...else,尽量不要省略之后的花括号,即使只有一条语句也不能省略,其中对于非常简单的if...else结构,可以用三目运算符(if(a>b)?a:b)来替代。为了避免发生逻辑错误,应该遵守:总是优先把包含范围小的的条件放在前面处理。
public class TestIf {
public static void main(String[] args) {
int age = 45;
if(age > 20) {
System.out.println("Young");
} else if(age > 40) {
System.out.println("Middle");
} else if(age > 60) {
System.out.println("Old");
}
}
}
我们发现运行之后输出Young,明显与预期不符(应该输出Middle)。是因为刚才提到的范围问题导致(age > 20比age > 60范围大)。我们改写一下:
public class TestIf {
public static void main(String[] args) {
int age = 45;
if(age > 60) {
System.out.println("Old");
} else if(age > 40) {
System.out.println("Middle");
} else if(age > 20) {
System.out.println("Young");
}
}
}
刚才提到if之后的花括号不能省略,对于switch...case来说,case之后的花括号尽量省略,而break不要省略(否则将贯穿多个case执行),尽量加上default,此外对于switch(expression)的表达式只能为整数,不能为字符串(这点跟其他语言不一样)。
对于循环结构,也不要省略循环体中的花括号(即使只有一句),还可以组成多层嵌套循环。可以使用break结束本层循环,进入循环之后的代码,使用continue结束本次循环,进入下一次循环,也可以使用return直接返回。但是有时还有特殊情况,是从内层循环跳出到外层循环,需要使用Java标签(用:表示),不过通常此标签必须位于break所在循环的外层循环之前才起作用。以下程序将输出: i = 0,j = 0;i = 0,j = 1。
public class TestBreak {
public static void main(String[] args) {
outer:
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 2; j++) {
System.out.println("i = " + i + ",j = " + j);
if(j == 1) {
break outer;
}
}
}
}
}
此外,continue也可添加标签,表示立即结束continue所在循环,跳到标签所在位置进入下一次循环。如果将以上的break改成continue的话,将输出: i = 0, j = 0; i = 0, j = 1; i = 1, j = 0; i = 1, j = 1; i = 2, j = 0; i = 2, j = 1; i = 3, j = 0; i = 3, j = 1; i = 4, j = 0; i = 4, j = 1。后,return直接返回整个方法,而不管方法中嵌套有多少层循环。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南