学习Java的人都很熟悉多态。
多态即事物的多种状态,比如人,分男人女人,也可以分学生老师等。
多态的实现:
- 继承(类 / 实现接口)
- 重写
- 向上转型
所谓向上转型即由子到父。父类引用指向子类对象。Person p = new Student();
那么Person类和Student类有自己的变量和方法,如果子类有重写的方法,或子类没有父类的方法,或父类的方法私有,在编译和运行时都会出现什么情况呢?
以下面代码为例:
public class Main{
public static void main(String[] args) {
Person p = new Student();
p.age = 14;
//p.stuNumber=1;编译不通过
p.eat();
//p.study();编译不通过
p.talk();
//p.test();//编译不通过
p.test2();
}
}
class Student extends Person{
int age;
String name;
int stuNumber;//子类有的属性,父类没有
int gender;//0-男
public void eat(){
System.out.println("学生也要吃饭");
}
private void study(){
System.out.println("学生要学习");
}
public static void talk(){
System.out.println("学生也要讲话");
}
}
class Person{
int age;
String name;
int gender;//0-男
public void eat(){
System.out.println("人要吃饭");
}
public static void talk(){
System.out.println("人要讲话");
}
private void test(){
System.out.println("私有方法不能被重写");
}
public void test2(){
System.out.println("我只有父类有哦!");
}
}
运行之后的结果:
可以总结规律:
- 对于成员变量:编译看左边,运行看左边
也就是如果父类中没有子类的变量,编译不通过;子类中也有父类的变量,运行父类的。 - 对于成员方法:编译看左边,运行看右边
父类中没有子类的方法,编译不通过;子类重写了父类的成员方法,运行子类的。 - 对于静态方法:编译看左边,运行看左边
子类重写了父类的静态方法,但还是运行父类的。
再来个例子思考一下:
import java.util.*;
public class Main0520 {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
//成员方法编译看左运行看右
}
}
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("我");
}
}
class B extends A{
public void show2(){
System.out.println("爱");
}
}
class C extends B{
public void show(){
super.show();
}
public void show2(){
System.out.println("你");
}
}
结果是什么呢?
点个赞再往下拉吧~
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·