目录
面试题一:重载和重写的区别?
- 重载 (Overload): 在一个类中,同名的方法如果有不同的参数列表(比如参数类型不同、参数个数不同)则视为重载。
- 重写 (Override): 从字面上看,重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类的方法,但有时子类并不想原封不动的继承父类中的某个方法。所以在方法名,参数列表,返回类型都相同(子类中方法的返回值可以是父类中方法返回值的子类)的情况下, 对方法体进行修改,这就是重写。但要注意子类方法的访问修饰权限不能小于父类的。
重载:发生在同一个类中,若多个方法之间方法名相同、参数列表不同,则它们构成重载的关系。 重载方法的返回值以及「访问修饰符无关」,即重载的方法不能根据返回类型进行区分。
重写:子类返回值要小于等于父类方法,抛出的异常要小于等于父类方法,「访问修饰符则要大于等于」父类方法。还有,若父类方法的访问修饰符为private,则子类不能对其重写。
追问一:Java 中是否可以重写一个 private 或者 static 方法?
不可以。
Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。 静态方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,因而不能重写。
Java 中也不可以覆盖 private 的方法,因为 private 修饰的变量和方法只能在当前类中使用, 如果是其他的类继承当前类是不能访问到 private 变量或方法的,当然也不能覆盖。
静态方法补充:静态的方法可以被继承,但是不能重写。如果父类和子类中存在同样名称和参数的静态方法,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪⼀个方法是看是哪个对象的引用;这种父子类方法也不在存在多态的性质。
追问二:构造器是否可以被重写?
在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 Override(重写),但是可以 Overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。
每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须一开始调用父类的构造函数。
面试题二:List<? extends T> 和 List <? super T> 之间有什么区别 ?
这两个 List 的声明都是限定通配符的例子,List< ? extends T > 可以接受任何继承自 T 的类型的 List,而List < ? super T > 可以接受任何 T 的父类构成的 List。
List<? extends T>表示类型的上界为T,即参数化的类型可能是T也可能是T的子类。<? extends T>被设计用来读数据的泛型,只能读取类型为T的元素。
List<? super T>表示类型的下界为T,即参数化的类型可能是T也可能是T的父类型。<? super T>被设计用来写数据的泛型,只能写入T或T的子类型,不能用来读。
例如: List< ? extends Number > 可以接受「 List <Integer >」 或 「List <Float >」。
即:< ? extends T >表示包括 T 在内的任何 T 的子类;< ? super T >表示包括 T 在内的任何 T 的父类。
面试题三:== 和 equals 的区别?
- ==:对比的是栈中得值,如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
- equals 方法:用来比较两个对象的内容是否相等。
追问:String 中equals方法分析
上述代码可以看出,String 类中被复写的 equals() 方法其实是比较两个字符串的内容。
注意:equals 方法不能用于比较基本数据类型的变量。如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址(很多类重写了 equals ⽅法,比如 String、Integer 等把它变成了值比较,所以⼀般情况下 equals 比较的是值是否相等)。