一、学习内容摘要
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');
}
}
}声明部分和迭代部分可以是输出语句也可以是函数调用