程序流程控制

移位运算符

移位运算符面向的运算对象是二进制的位,可单独用它们处理整数类型。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用“零扩展”:无论正负,都在高位插入0。若对char, byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只用右侧的5个低位才会用到。这样可防止我们在一个int数里移动一个不切实际的位数。若对一个long值进行移位,最后得到的结果也是long型。此时只会用到右侧6个低位,防止移动超过long值现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题,若对byte和short值进行又移位运算,得到的可能不是正确的结果。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

移位可与等号(<<=或>>=或>>>=)组合使用。此时,运算符左边的值会移动由右边的值指定的位数,再将得到的结果赋值回左边的值。

public class Test {
public static void main(String[] args) {
int i = 8;
i >>= 2;
System.out.println(i);
i <<= 1;
System.out.println(i);
i <<= 1;
System.out.println(i);
i >>>= 1;
System.out.println(i);
i >>>= 1;
System.out.println(i);
}
}
// output
/*
2 4 8 4 2
*/

三元运算符

布尔表达式 ? 值0 : 值1

public class Test {
public static void main(String[] args) {
int i = 10;
System.out.println(i < 10 ? 5 : 11);
System.out.println(i == 10 ? i / 2 : 0);
}
}
// output
/*
11 5
*/

表达式运算符优先级

一元运算符 > 算术(移位)运算符 > 关系运算符 > 逻辑(按位)运算符 > 条件运算符 > 赋值

  • 一元运算符:++、--
  • 算术(移位)运算符:*、/、%、+、-、<<、>>
  • 关系运算符:>、<、>=、<=、==、!=
  • 逻辑(按位)运算符:&&、||、&、|、^
  • 条件(三元):A>B?X:Y
  • 赋值:= (以及复合赋值,如*=)

Java中goto标签的使用

尽管goto的滥用会导致程序的不可读,但是在一些情况下,goto是组织控制流程的最佳手段,因此很多的语言中仍然或多或少地保留了其一些用法,对Java来说,唯一用到标签的地方就是在循环语句之前。

public class Test {
public static void main(String[] args) {
int i = 0;
outer:
for (;true;){
inner:
for (;i < 10;i++){
System.out.println("i = " + i);
if (i == 2){
System.out.println("continue");
continue ;
}
if (i == 3){
System.out.println("break");
i++;
break ;
}
if (i == 7){
System.out.println("continue outer");
i++;
continue outer;
}
if (i == 8){
System.out.println("break outer");
break outer;
}
for (int k = 0; k < 5;k++){
if (k ==3) {
System.out.println("continue inner");
continue inner;
}
}
}
} }
}
// output
/*
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
*/

需要注意的是当你使用switch...case语句时,遇到满足的一个case之后,如果之后没有break,将会继续执行接下来的语句而不会管符不符合之后条件,直到遇到break语句或者程序片段执行完毕。一般应该在switch...case语句之中,最后放置一个default条件,以执行没有备选条件下的任务。

public class Test {
public static void main(String[] args) {
int i = 5;
switch (i){
case 3:
System.out.println("case3: " + i);
case 5:
System.out.println("case5: " + i);
case 7:
System.out.println("case7: " + i);
default:
System.out.println("default: " + i);
}
}
}
// output
/*
case5: 5
case7: 5
default: 5
*/
public class Test {
public static void main(String[] args) {
int i = 5;
switch (i){
case 3:
System.out.println("case3: " + i); break;
case 5:
System.out.println("case5: " + i); break;
case 7:
System.out.println("case7: " + i); break;
default:
System.out.println("default: " + i); break;
}
}
}
// output
/*
case5: 5
*/

需要注意的是switch要求的选择因子必须是int或char的整数值。而假如将一个字符串或者浮点数作为选择因子使用,那么它们在switch语句中是不会工作的。

Math.random()会产生0-1之间的值,其范围为[0, 1)。

当我们使用构造器的时候,如果我们自己并没有在类中进行任何定义,则系统会替我们创建一个默认的无参构造器,而当我们定义了任何一个构造器时,无论有没有参数,系统都不会再继续帮我们进行创建无参构造器。

注:尽管我们可以在非静态方法中访问静态方法和静态变量,但是反过来却是不行的。因为静态数据的构造要优先于非静态方法。

Java中使用垃圾收集器回收由不再使用的对象占据的内存。但是垃圾收集器只知道释放那些由new分配的内存,所以不知道如何释放对象的“特殊”内存。为解决这一问题,Java提供了一个名为finalize()的方法,可为我们的类定义它。在理想情况下,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),不过只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作。

垃圾收集只跟内存有关,也就是说垃圾收集器存在的唯一原因就是为了回收程序不再使用的内存。

finalize()最有用的地方之一就是观察垃圾收集的过程。

在一个类里,初始化顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间,那些变量仍会在调用任何方法之前得到初始化(甚至在构建器调用之前)。

Thinking in Java学习杂记(5-6)

Java编程思想学习杂记(1-4章)的更多相关文章

  1. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  2. Java编程思想学习(五)----第5章:初始化与清理

    随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...

  3. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  4. [Java编程思想-学习笔记]第2章 一切都是对象

    2.1  创建新的数据类型:类 通过第一章掌握了面向对象的理论后,我们知道每个对象必定属于一个类型,那么Java如何创建新的数据类型?如下程序所示: class Circle { // 属性 // 方 ...

  5. [Java编程思想-学习笔记]第4章 控制执行流程

    4.1  return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: char test(int score) { if ...

  6. Java编程思想学习(四)----第四章:控制执行流程

    在Java中,涉及的关键字包括if-else.while.do-while.for.return.break 以及选择语句switch.然而,Java并不支持goto语句(该语句引起许多反对意见,但它 ...

  7. Java编程思想学习(三)----第三章:操作符

    3.2使用Java操作符 操作符接受一个或多个参数,并生成一个新值. 操作符作用于操作数,生成一个新值.有些操作符可以改变操作数自身的值.几乎所以的操作符都只能操作“基本类型”.例外的操作符有“=”, ...

  8. Java编程思想学习(八) 内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...

  9. java编程思想--学习心得

    学习Java编程思想,需要了解语言特性,对于各种名词,能够借助项目代码,解释其含义,不借助搜索工具,明白其在什么样场景下使用,会带来什么样的问题,能否避免这类问题. 学习的过程,与软件开发相同,一样是 ...

随机推荐

  1. ip修改成域名

    将ip修改成域名,这样的话可以使程序变得更加健壮,别人不能直接看见你的ip地址. 后来总结下分享给大家.首先找到hosts文件的位置,这个文件是系统dns默认查找的文件. windows 系统:C:\ ...

  2. shell 函数(特定的函数和脚本内传参)

    和其他脚本语言一样,bash同样支持函数.我们可创建特定的函数,也可以创建能够接受参数的函数.需要的时候直接调用就可以了. 1.定义函数 function fname() { statements; ...

  3. web博客

    欢迎大家来戳一戳

  4. ORB-SLAM2 运行 —— ROS + Android 手机摄像头

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12404730.html 本文要点: ROS 配置安装 解决 sud ...

  5. 微信小程序支付到第三方商户账号

    使用场景:合作商家使用本公司小程序开店,要求支付金额直接到合作商家的公司微信账户; 使用要求:合作商家需提供微信支付关联,商户号,商户API密钥,API证书(该证书只用作退款功能,不开发退款可以不用) ...

  6. JMeter-接口测试之数据驱动

    前言 之前我们的用例数据都是配置在Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢?我们可以将 ...

  7. 7-7 jmu_python_是否是数 (10 分)

    本题要求从键盘输入一个字符串,判断该串是否属于整数.浮点数或者复数的表示 输入格式: 输入一个字符串 输出格式: 输出yes或no 输入样例: -299 输出样例: yes a = input() t ...

  8. 使用HBuilder开发移动APP:ajax调用接口数据

    既然要做APP,与接口交互式少不了的,除非只是想做一个纯静态的APP.所以html5+的环境准备好后,我最先开始研究的就是如何与接口交互. 使用HBuilder新建示例教程后,里面会有一个ajax(网 ...

  9. 十分钟复习CSS盒模型与BFC

    css盒模型与BFC 本文为收集整理总结网上资源 旨在系统复习css盒模型与bfc 节省复习时间 阅读10分钟 什么是盒模型 每一个文档中,每个元素都被表示为一个矩形的盒子,它都会具有内容区.padd ...

  10. jQuery插件select2跨域设置xhrFields参数

    ajax跨越时默认不带cookie,如果需要带cookie调用,需要设置参数 xhrFields: { withCredentials: true },如: $.ajax({url : "h ...