知识(一)
1.重载和重写的区别?
(1)重载发生在一个类中
规则:方法名相同;方法的参数列表不同(包括:参数类型不同,参数个数不同或者两者都不相同);方法的返回值类型不影响重载。可以抛出不同的异常,可以有不同的修饰符。
(2)重写发生在子类和父类之间
规则:参数列表和返回值类型都必须完全与被重写的方法一致;构造方法不能被重写,声明为final的方法,声明为static的方法都不能被重写;访问权限不能比父类中被重写的方法的访问权限更低;重写的方法不能抛出比被重写方法声明更广泛的编译时异常。
总之,方法的重载和重写都是实现多态的方式,重载实现的是编译时的多态性,重写实现的是运行时的多态性。
2.抽象类和接口的异同?
(1)相同的:
abstract class和interface都不能被实例化,即不能使用new关键字来实例化对象
一个类如果继承了某个抽象类或者实现了某个接口,都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
(2)不同的:
抽象类----抽象类可以定义成员变量,可以包含构造方法,静态方法;抽象方法的修饰符只能为public或protected,默认为public;抽象方法没有方法体,不执行具体代码;一个类只能继承(extends)一个抽象类
接口----接口中没有构造方法;接口中包含的方法都是抽象方法,字段只能包含静态常量,所有方法默认是public abstract 所有成员变量一定是public static final 修饰,可不写;接口中不能有静态方法;一个类可以实现(implements)多个接口。
Java中只支持单继承,一个类只能继承一个父类,但可以实现多个接口,以达到多继承的效果。
3.静态变量和实例变量
静态变量:是被static修饰的变量,也称为类变量,不属于类的任何一个对象,一个类不论创建多少个对象,静态变量在内存中有且只有一个拷贝;静态变量可以实现让多个对象共享内存。
实例变量:必须依存于某一个实例,需要先创建对象然后通过对象才能访问到它。
插个知识!
区别:
equals():不能用于比较基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。其实,它是用来比较方法两个对象的内容是否相等
双等号== :是一个运算符,如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
4.Java中实现多态的机制是什么?
是父类或接口定义的引用变量,可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期间动态绑定,就是 引用变量所指向的具体实例对象的方法。
5.Java中的异常
5.1异常分类
顶层类 Throwable 派生出两个重要的子类, Error 和 Exception,其中 Error 指的是 Java 运行时内部错误和资源耗尽错误,应用程序本身无法克服和恢复的一种严重问题。Exception 是我们程序员所使用的异常类的父类。其中 Exception 有一个子类称为 RuntimeException(称为运行时异常,或非受查异常) , 这里面又派生出很多我们常见的异常类NullPointerException , IndexOutOfBoundsException 等.
Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为 非受查异常, 所有的其他异常称为 受查异常.
如果一段代码可能抛出 受查异常, 那么必须显式进行处理。处理方法有两种:一是当前方法知道如何处理该异常,则用try… catch块来处理;二是不知道如何处理,则在该方法定义时throws声明抛出该异常,交给它的上层调用者处理。
异常处理流程
程序先执行 try 中的代码
如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
如果找到匹配的异常类型, 就会执行 catch 中的代码
如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
如果上层调用者也没有处理的了异常, 就继续向上传递.
一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止
自定义异常
通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常
6.throw和throws的区别?
(1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
(2) throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。 throws表示出现异常的一种可能性,并不一定会发生这种异常。
7.String、StringBuilder、StringBuffer的区别?
Java提供了两种类型的字符串:String、StringBuilder/StringBuffer,它们都可以储存和操作字符串。区别是:
(1)String是只读字符串,字符串常量,即String引用的字符串内容不能被改变;若修改,等于重新生成新的字符串对象;线程安全的
(2)StringBuilder/StringBuffer表示的字符串对象可以直接进行修改
(3)StringBuilder/StringBuffer区别在于:StringBuffer属于线程安全操作,它的所有方法都被synchronized修饰,StringBuilder在单线程环境下使用,不安全,但效率比StringBuffer要高。
在String中使用“+”来进行字符串拼接,实际上在底层被优化为StringBuilder的append方法。