方法的重载与重写
- 二者的定义细节: 略
- 从编译和运行的角度看:
重载,是指允许存在多个同名方法,而这些方法的参数不同。 编译器根据方法不同的参数表, 对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。 它们的调用地址在编译期就绑定了。 Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。
所以: 对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定” ;而对于多态,只有等到方法调用的那一刻, 解释运行器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定” 。
引用一句Bruce Eckel的话: “不要犯傻,如果它不是晚绑定, 它就不是多态。”
多态是运行时行为还是编译时行为
答:运行时行为
package stu.zdkk.java2;import java.util.Random;//面试题:多态是编译时行为还是运行时行为?//证明如下:class Animal {protected void eat() {System.out.println("animal eat food");}}class Cat extends Animal {protected void eat() {System.out.println("cat eat fish");}}class Dog extends Animal {public void eat() {System.out.println("Dog eat bone");}}class Sheep extends Animal {public void eat() {System.out.println("Sheep eat grass");}}public class InterviewTest {public static Animal getInstance(int key) {switch (key) {case 0:return new Cat ();case 1:return new Dog ();default:return new Sheep ();}}public static void main(String[] args) {int key = new Random().nextInt(3);System.out.println(key);Animal animal = getInstance(key);animal.eat();}}


package stu.zdkk.java2;//考查多态的笔试题目:public class InterviewTest1 {public static void main(String[] args) {Base base = new Sub();base.add(1, 2, 3);// Sub s = (Sub)base;// s.add(1,2,3);}}class Base {public void add(int a, int... arr) {System.out.println("base");}}class Sub extends Base {public void add(int a, int[] arr) {System.out.println("sub_1");}// public void add(int a, int b, int c) {// System.out.println("sub_2");// }}

这显然能说明多态是运行时行为,因为在编译时编译器并不认为Sub重写了Base的add方法,但是在运行时打印了Sub的add方法输出语句,说明在运行时Sub的add方法构成了对Base类add方法的重写,因此才打印”sub_1”
==和equals的区别
- == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型
就是比较内存地址 - equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也
是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中
用的比较多,久而久之,形成了equals是比较值的错误观点。 - 具体要看自定义类里有没有重写Object的equals方法来判断。
- 通常情况下,重写equals方法,会比较类中的相应属性是否都相等
