要让一个类使用排序服务必须要让它实现compareTo方法,因为要向sort方法提供对象的比较方式。但为什么不能在类中直接提供一个compareTo方法,而必须实现Comparable接口呢?
答:主要原因在于Java程序设计语言是一种强类型(strongly typed)语言。在调用方法的时候,编译器将会检查这个方法是否存在。在sort方法中可能存在下面这样的语句:
if (a[i].compareTo(a[j]) > 0)
{
……
}
为此,编译器必须确认a[i[一定有compareTo方法。如果a是一个Comparable对象的数组,就可以确保拥有compareTo方法,因为每一个实现Comparable接口的类都必须提供这个方法的定义。
问题2:
错误:Implicit super constructor xx() is undefined for default constructor. Must define an explicit constructor
答:
因为父类已经定义了一个有参数的构造函数,且没有默认的无参构造函数。当子类继承父类时,必须在自己的构造函数显式调用父类的构造函数,才能确保子类在初始化前父类会被实例化。如果父类中有无参的构造函数,子类就不会强制要求自己构造函数,编译器会默认调用父类的构造函数。比如:
class Person {
protected String name;
protected int age;
//你已经定义了自动的构造函数,此时编译器不会为你创建默认的构造函数
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public void print() {
System.out.println("Name:"+name+"/nAge:"+age);
}
}
/*由于父类的构造函数是有参的,所以编译不会为你自动调用默认的构造函数,此时,子类在自己的构造函数中必须显式的调用父类的构造函数 */
class Student extends Person {
public Student(String name,int age)
{ //子类构造函数
//super(); 不行,因为你的父类没有无参的构造函数
super(name,age);
//显示调用父类的构造函数,而且必须是第一行调用
}
}
class Test {
public static void main(String args[]){
}
}
问题3:
Java里什么时候用throws
答:
throws只会出现在方法的头部,意在抛出方法中的异常给调用者,自己不出来程序中出来的异常。抛出自定义的异常用throws new Exception(){};最后这个异常不处理还是要throws到调用者那。另外,如果想将异常在方法中处理掉,就用try{} catch(){}。
问题4:
Java 的克隆对象时抛出 CloneNotSupportedException异常?
答:
Object声明的protected clone 虽然可以阻止实现clone() 的子类,在子类外部直接调用clone(),但对静态方法却没有办法,因为静态方法可以直接访问protected的方法,而这样就有可能会出现对对象使用clone(),而实际对象不支持clone(),所以就会抛出这个异常。
问题5:
问题1:Java中break return continue 区别
答:
1、return 语句的作用
(1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行
(2) return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致,可以使用强制类型转换来是数据类型一致
(3) return 当方法说明中用void声明返回类型为空时,应使用这种格式,不返回任何值。
2、break语句的作用
(1) 只能在循环体内和switch语句体内使用break语句。
(2) 当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体。
(3) 当break出现在循环体中,但并不在switch语句体内时,则在执行break后,跳出本层循环体。
(4) 在循环结构中,应用break语句使流程跳出本层循环体,从而提前结束本层循环
3、continue语句作用
(1) continue语句continue语句的一般形式为:continue;
(2) 其作用是结束本次循环,即跳过本次循环体中余下尚未执行的语句,接着再一次进行循环的条件判定。
(3) 注意:执行continue语句并没有使整个循环终止。在while和do-while循环中,continue语句使得流程直接跳到循环控制条件的测试部分 ,然后决定循环是否继续进行。
(4) 在for 循环中,遇到continue后,跳过循环体中余下的语句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试