在 switch(expr 1) 中,expr1 只能是⼀个整数表达式或者枚举常量。byte、short、char 都可以隐式转换为 int,所以这些类型以及这些类型的包装类型也都是可以的。⽽ long 和 String 类型都不符合 switch 的语法规定,并且不能被隐式的转换为 int 类型,所以,它们不能作⽤于 switch 语句中。不过,需要注意的是在 JDK1.7 版本之后 switch 就可以作⽤在 String 上了。
public class Test { public static void main(String args[]){ //char grade = args[0].charAt(0); char grade = 'C'; switch(grade) { case 'A' : System.out.println("优秀"); break; case 'B' : case 'C' : System.out.println("良好"); break; case 'D' : System.out.println("及格"); break; case 'F' : System.out.println("你需要再努力努力"); break; default : System.out.println("未知等级"); } System.out.println("你的等级是 " + grade); } }
编译以上程序,输出结果为:
良好 你的等级是 C
clone方法:用于创建并返回当前对象的一份拷贝;
getClass方法:用于返回当前运行时对象的Class;
toString方法:返回对象的字符串表示形式;
finalize方法:实例被垃圾回收器回收时触发的方法;
equals方法:用于比较两个对象的内存地址是否相等,一般需要重写;
hashCode方法:用于返回对象的哈希值;
notify方法:唤醒一个在此对象监视器上等待的线程。如果有多个线程在等待只会唤醒一个。
notifyAll方法:作用跟notify()一样,只不过会唤醒在此对象监视器上等待的所有线程,而不是一个。
wait方法:让当前对象等待;
。。。
final:用于声明属性、方法和类,分别表示属性不可更改、方法不可重写、被其修饰的类不可被继承;
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
1、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。使用final方法的原因有二:
①把方法锁定,防止任何继承类修改它的意义和实现。
②高效,编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
finally:异常处理语句结构的一部分,表示总是执行;
finalize:Object类的一个方法,在垃圾回收时会调用被回收对象的finalize;
==:如果比较的对象是基本数据类型,则判断比较的数值是否相等;如果比较的是引用数据类型,则判断比较的是对象的地址值是否相等;
equals方法:用来比较两个对象的内容是否相等。
注意:equals方法不能用于比较基本数据类型的变量。在没有重写equals()方法的类中,调用equals()方法其实和使用==的效果一样。(很多类重写了equals方法,比如String、Integer等把它变成了内容比较,所以一般情况下equals比较的是内容是否相等)
Object类equals()方法源码:
public boolean equals(Object obj) { return (this == obj); }
String类equals()方法源码(重写Object类equals()方法):
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
经典示例:
String str3 = "abc"; String str4 = "abc"; System.out.println(str3 == str4); // true
str3与str4相等的原因是用到了内存中的常量池,当运行到str3创建对象时,如果常量池中没有,就在常量池中创建一个对象"abc",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。