Java多态之左右
学习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("你");
}
}
点个赞再往下拉吧~
· · ·
· · ·
· · ·
· · ·
· · ·