纠错

一,描述抽象类和接口的区别。

答:1.对一个类而言,只能继承一个抽象类,但可以实现多个接口。

  2.抽象类可以定义类变量,实例变量,类方法,实例方法和抽象方法;接口定义的变量都是用public static final 修饰的,定义的方法都是用public abstract修饰的,而且不能提供代码实现,但在Java8开始,接口也可以通过定义default方法,给方法提供实现。

  3.抽象类使用在继承过程中,体现派生类和基类是 is a 的关系,所以把所有派生类共有的接口都定义在抽象类里面;而类实现一个接口,体现的是has a 的关系,所以把派生类中特有的功能方法放在接口中定义。

二,解释多态。

答:基类的引用,引用不同的派生类对象,调用基类和派生类的同名覆盖方法,基类引用引用哪个派生类对象就调用哪个派生类对象的方法,这就是多态使用的基本场景。

       多态的好处就是在处理一系列的派生类时,可以使用统一的基类引用来接受不同的派生类对象,来调用派生类重写的方法,否则需要对每一个派生类都提供入口。

       多态的实现是依赖函数的动态绑定实现的。在运行阶段,通过访问引用变量所引用的对象,然后根据对象地址中的方法表地址,找到该类型的方法表,然后取方法的地址进行方法调用。

三,描述Comparable接口和Comparator接口的区别。

答:1.实现Comparable接口要重写compareTo()方法,实现Comparator接口要实现compare()方法。

  2.一般自定义的对象,要实现比较功能,需要implement实现Comparable接口,重写compareTo()方法;如果要自定义对象的多种比较方式,需要提供自定义的实现Comparator接口的匿名对象。

 四,final ,finally ,finalize的区别???

答:final一般用来修饰类,方法,变量。

  被final修饰的类叫密封类,不能被派生类继承,所以一般用在基类中。

  被final修饰的方法,不能被派生类重写

  被修饰的变量,一般被叫做常量,只能对其赋一次值,后面不能被修改。应用(保证 量的固定值)

 finally :一般被用在异常处理中,放在try  catch 语句块后,不管程序有没有发生异常,finally语句中的代码都会被执行到,所以一般将释放资源的代码都放到finally语句块中。

 finalize:

(JVM的GC是以固定周期的进行对象回收的,比如GC的周期时间到了,它会找那些没有被引用的对象,判断是无效对象,回收他们的堆内存,但如果对象重写了finalize方法,那么GC在当前回收周期会调用对象的finalize方法,然后在下一个GC周期再回收对象堆内存。)

五,String类型在底层运行的方式

 String类型字符串在进行字符拼接时,在底层其实是用StringBuilder进行的。

分析:

 1.String  str="hello";   这是定义了一个String类型的字符串,并对其进行赋值。

 

 2. str=str+"wor";  执行这句代码时,发现要进行字符串连接。于是new了一个StringBuilder类型的对象,并调用默认构造函数对其赋初值,接着调用StringBuilder类的append()方法两次,将自身和要拼接的字符串依次添加进,实现行字符串拼接。然后调用StringBuilder的toString()方法将字符从StringBuilder类型转化成String类型,(其底层是新new了一个String类型的对象,将要转换的参数传给他),最后赋给左边的str。(程序先执行等号右边,在执行等号左边)

  所以在进行连接和赋值的过程中要new两个对象。

 3.str=str+"ld";同上。

 六,String, StringBulider, StringBuffer  ,的区别???

答:1.String 是一个不可变类,而StringBuilder是一个可变类。

        2.在循环中使用String,其效率很低,每次进行字符串连接时都要生成新的String对象。此时应使用StringBuilder,用append方法进行字符串连接,再用toString()方法将其转为String类型的字符串。

        3.StringBuffer相当于是线程安全的StringBuilder,专门用于多线程环境中。

       

原文地址:https://www.cnblogs.com/ljl150/p/11745136.html