备考OCJP认证知识点总结(三)

一、学习内容摘要

1、String s=“sadfjsad”和String s=new String(“saldkfjas”)、String的实例变量s默认初始化和显式初始化s为new String()的区别
2、连字符和加法运算符
3、For循环和其增强循环
4、While循环和do-while循环
5、Switch-case循环,switch和case后变量的限制,switch中只能有case语句,case 中以break或return中断。
6、异常处理,常见异常类型,异常的声明与捕获。


二、知识点总结

关于String对象
new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;

   String str=”kvill”;
   String str=new String (“kvill”);的区别:
  常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
  看例1:
  String s0=”kvill”;
  String s1=”kvill”;
  String s2=”kv” + “ill”;
  System.out.println( s0==s1 ); true
  System.out.println( s0==s2 );true

  首先,我们要知道Java会确保一个字符串常量只有一个拷贝。
  因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。

  所以我们得出s0==s1==s2;

  用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。

  看例2:

  String s0=”kvill”;

  String s1=new String(”kvill”);

  String s2=”kv” + new String(“ill”);

  System.out.println( s0==s1 ); false

  System.out.println( s0==s2 ); false

 System.out.println( s1==s2 ); false

例2中s0还是常量池中”kvill”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的引用。

1、char类型实例变量默认初始化为‘\u0000’,输出为空字符,而String类型默认初始化为null。
2、如果任何一个操作数为String,则+运算符就会链接这两个操作数,注意连接和拆箱可同时进行。如果两个操作数都为数字,则+运算符是加法运算符。
3、Default不一定要位于所有case之后。如果没有break,则会继续向下执行,知道遇到case中的break或return或switch块结束为止。
4、For增强循环中,冒号左边一定是声明类型加上变量名,声明类型不能置于for外。
5、^运算符是当且仅当只有一个表达式是对的时返回ture
6、IllegalArgumentException是NumberFormatException的父类
7、Swich的表达式必须能求值成char、byte、short、int或者枚举。这意味着如果没有使用枚举,则只有能够被自动提升为int的变量才是可接受的。如果使用任何其他数值类型,包括long、float和double等,都不能编译。
8、Case常量必须与switch表达式结果可用的类型相同,但还有一个额外的便企鹅是重大的约束:case常量必须是编译时常量!因为case变元必须在编译时解析,这意味着只能使用常量或者被赋予字面值的final变量,如可以用final int b=1;而不能用final int b;b=1;。 在switch(byte)中使用case 128:也将无法编译。   在switch表达式中利用装箱的能力是合法的,如switch(new Integer(4))
9、基本for循环中,for关键字之后的圆括号内声明并初始化0个或1个或多个同类型的变量,且多个变量之间只能用逗号隔开,只能有一个类型声明。第三部分迭代表达式处可以不设置任何递增或递减内容,甚至可以放置该循环每次迭代时要执行的任意代码语句,如输出语句。

10、For增强循环可以遍历集合,但如果集合没有声明泛型,则for的声明部分类型应为Object
带标签的continue和break语句必须位于相同标签名称的循环内,否则无法编译。标签应紧邻循环之前放置。


异常
Try块中的语句不一定被执行,因此在catch块中引用try块中声明的变量将不能通过编译。
无论是否抛出异常,finally块代码总能在try块之后的某点执行,这意味着try-catch-finally中无论try和catch是否抛异常finally最后都会执行,但执行结果在catch执行结果之后如果(catch块执行的话)。即使在try-catch块内有return语句,finally块也能够在遇到return语句之后,并在return语句执行之前执行。这是关闭文件,释放网络套接字以及执行代码所需的任何清理操作的理想场所。
 Try块后如果不跟catch块就要跟finally块。  
所有非Runtime异常都被视为检验异常。每个方法必须通过提供trycatch块来处理所有检验异常(RuntimeException和Error除外),或者将每个未处理的检验异常列为一个抛出异常,否则不能编译。但可以仅声明异常,而方法内不抛出异常。 
最具体的异常处理程序必须总是放在更一般的异常处理程序上面,否则便以失败,被子类型异常声明捕获的异常将不会再往调用栈向下传播。
A a=new B(); B extends A 若A中方法process()抛了异常,而B中重写方法process()没有抛异常,则调用a.process()时需要抛出异常,否则无法编译。因为编译时看的是引用类型,而类A中方法抛出异常。 即使方法的确声明了Runtime异常,调用方法时也不负责处理或声明它,但它可以被catch块捕获。
try-catch块中用Exception捕获Error可编译但有异常
可以只为方法声明异常或只抛出异常,可通过编译
IllegalStateException :在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。

For循环补充:
public class hjj {
 public static boolean foo(char c){
  System.out.println(c);return true;}
 public static void main(String[] args){
  int i=0;
 for(foo('A');foo('B')&&(i<2);foo('C’){
   i++;
   foo('D');
  }
 }
}声明部分和迭代部分可以是输出语句也可以是函数调用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值