老黑讲Java之面向对象的重写
1、父类的引用只能访问父类的成员
在继承关系中,在编译期父类的引用只能访问父类的成员,不能访问子类的扩展部分,否则编译错误。代码如下:
public class Father {
int age;
public void go() {}
public static void main(String[] args) {
Father obj = new Son();
obj.age = 56;
obj.go();
obj.weight = 162;//编译错误
obj.run();//编译错误
}
}
class Son extends Father{
int weight;
public void run() {}
}
分析:当父类的引用指向子类的对象时,在编译期父类的引用只能访问父类的成员,否则编译错误。

2、方法的重新
1.子类继承父类,子类中可以重写父类的方法,言外之意方法名和参数列表与父类的方法完全相同,但具体实现不同;
2.当父类的引用访问子类重写的方法时,编译期不会报错,而运行期则只访问子类重新后的方法。示例代码如下:
public class Father {
int age;
public void say() {
System.out.println("我是父类");
}
public static void main(String[] args) {
Father obj = new Son();
obj.say();
}
}
class Son extends Father{
public void say() {
System.out.println("我是子类");
}
}
运行结果:我是子类
分析:当父类引用指向子类对象,父类引用访问子类重写后的方法时,编译期没有错误,在运行期父类引用只访问子类对象中的方法。

3、使用super关键字扩展父类的方法
子类重写父类的方法时,可以使用super关键字访问父类的方法。示例代码如下:
public class Father {
int age;
public void say() {
System.out.println("我能说话");
}
public static void main(String[] args) {
Father obj = new Son();
obj.say();
}
}
class Son extends Father{
public void say() {
super.say();
System.out.println("我能唱歌");
}
}
运行结果:
我能说话
我能唱歌
分析:通过super关键字可以访问父类自有的方法。

4、重写与重载的区别(划重点)
在程序员找工作时,“重写与重载的区别”是许多面试官最喜欢问的问题,不管新手还是老鸟掌握这个知识点对理解继承尤其重要。
重写与重载是完全不同的语法,就像java与javascript关系一样,名字略微相同,但是完全两回事,区别如下:
1.重载是对于一个类而言的,在一个类中定义多个方法名相同参数类表不同的方法。编译期,通过参数列表的个数和类型决定绑定哪个方法;
2.重写是对于多个类而言的,在子类中定义与父类相同的方法。运行期,JVM根据对象的类型调用方法,比如对象的类型是父类只能调用父类方法,对象是子类类型只能调用子类重写后的方法。示例代码如下:
public class Father {
int age;
public void say() {
System.out.println("Father类的say方法");
}
public static void main(String[] args) {
Father obj = new Son();
Other other = new Other();
other.sing(obj);
}
}
class Son extends Father{
public void say() {
System.out.println("Son类的say方法");
}
}
class Other{
public void sing(Father father) {
System.out.println("Other类引用Father类型参数");
father.say();
}
public void sing(Son son) {
System.out.println("Other类引用Son类型参数");
son.say();
}
}
运行结果是:
Other类引用Father类型参数
Son类的say方法
分析:Other类中实现方法重载,Father与Son类实现方法重写,不难发现other.sing(obj)根据方法参数类型调用方法,father.say()调用子类重写后的方法。

5、编译期绑定和运行期绑定的概念
1.重载遵循编译期绑定,编译期是根据方法的参数变量类型和个数访绑定哪个方法;
2.重写遵循运行期绑定,运行期是根据对象类型访问重写的方法。