Java基础面试题-5

18、switch语句能否作用在byte、long、string上?

在 switch(expr 1) 中,expr1 只能是⼀个整数表达式或者枚举常量。byte、short、char 都可以隐式转换为 int,所以这些类型以及这些类型的包装类型也都是可以的。⽽ long 和 String 类型都不符合 switch 的语法规定,并且不能被隐式的转换为 int 类型,所以,它们不能作⽤于 switch 语句中。不过,需要注意的是在 JDK1.7 版本之后 switch 就可以作⽤在 String 上了。

switch case 语句有如下规则:

  • switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。

实例:

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

19、Object的常用方法有哪些?

clone方法:用于创建并返回当前对象的一份拷贝;

getClass方法:用于返回当前运行时对象的Class;

toString方法:返回对象的字符串表示形式;

finalize方法:实例被垃圾回收器回收时触发的方法;

equals方法:用于比较两个对象的内存地址是否相等,一般需要重写;

hashCode方法:用于返回对象的哈希值;

notify方法:唤醒一个在此对象监视器上等待的线程。如果有多个线程在等待只会唤醒一个。

notifyAll方法:作用跟notify()一样,只不过会唤醒在此对象监视器上等待的所有线程,而不是一个。

wait方法:让当前对象等待;

。。。

20、final、finally、finalize的区别?

final:用于声明属性、方法和类,分别表示属性不可更改、方法不可重写、被其修饰的类不可被继承;

Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。

  • final类不能被继承,没有子类,final类中的方法默认是final的。
  • final方法不能被子类的方法覆盖,但可以被继承。
  • final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
  • final不能用于修饰构造方法。

注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
1、final类

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。

2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。使用final方法的原因有二:
把方法锁定,防止任何继承类修改它的意义和实现。
高效,编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

finally:异常处理语句结构的一部分,表示总是执行;

finalize:Object类的一个方法,在垃圾回收时会调用被回收对象的finalize;

21、==和equals的区别?

==:如果比较的对象是基本数据类型,则判断比较的数值是否相等;如果比较的是引用数据类型,则判断比较的是对象的地址值是否相等;

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",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。

上一篇:编程模式之访问者


下一篇:通俗易懂玩QT:Qpaint绘制开关按钮