问题的起因:今天在敲代码的时候用到了linkedlist,众所周知,linkedlist实现了list接口,于是我就这样声明了一个变量:List<Integer> linklist=new LinkedList<>();
然后在代码中我需要获取list的第一个值,我清清楚楚明明白白记得linkedlist中有一个getFirst方法,于是乎我信誓旦旦的写下linklist.getFirst();
当当当当、、编译器猝不及防的就给了我一个红叉叉,说找不到这个方法,我,恩?WTF? 恩?我开始陷入自我怀疑,难道linkedlist里边没有这个方法?点开源码、这个方法不是安安静静的躺在那里等着调用的嘛、为什么我用!不!了!?
好吧,冷静如我,当然要来分析原因了,凭着我扎实的基本功(唔、有基本功估计就不会犯这个错误了、、)我敏锐的感觉到,大概是类型转化的问题、
一路看下来发现之前竟然没有注意过这个问题,又有一种Java白学了的赶脚、好吧,亡羊补牢,为时不晚、看看这个问题吧,首先看一段代码,该代码摘自https://blog.csdn.net/gh2391292/article/details/74421308
1 class Fu { 2 public int num = 100; 3 4 public void show() { 5 System.out.println("show Fu"); 6 } 7 8 public static void function() { 9 System.out.println("function Fu"); 10 } 11 } 12 13 class Zi extends Fu { 14 public int num = 1000; 15 public int num2 = 200; 16 17 public void show() { 18 System.out.println("show Zi"); 19 } 20 21 public void method() { 22 System.out.println("method zi"); 23 } 24 25 public static void function() { 26 System.out.println("function Zi"); 27 } 28 } 29 30 public class DuoTaiDemo { 31 public static void main(String[] args) { 32 // 要有父类引用指向子类对象。 33 // 父 f = new 子(); 34 Fu f = new Zi(); 35 System.out.println(f.num); 36 // 找不到符号 37 // System.out.println(f.num2); 38 39 f.show(); 40 // 找不到符号 41 // f.method(); 42 f.function(); 43 } 44 }
猜一猜这段代码的结果是什么咩、对的,就是
100
show Zi
function Fu
说实话,一开始我对运行结果还是持有怀疑的,我本着实践出真知的目的运行了这段代码,呵呵,脸生疼,终于认清自己渣的不能再渣的本质、
解释一下吧,其实敲代码的时候就会发现,当写子类的show方法时,只打一个show,编辑器就会给出重写show方法的提示,也就是说show方法是重写父类的,由多态的性质可知是在运行时动态指定运行方法的。
但是在子类写静态方法function就不会提示是重写父类的方法。静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不在存在多态的性质。而上述代码段中调用function的是f,是一个Fu类的引用,所以调用的是Fu类的function方法。
综上所述:我们可以看到多态中的成员访问特点:
- 成员变量和静态方法
- 编译看左边,运行看左边
- 构造方法
- 子类的构造都会默认访问父类构造
- 成员方法
- 编译看左边,运行看右边
问题一:什么是多态?
多态就是同一个接口,使用不同的实例而执行不同操作
问题二:多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
问题三:多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
注意:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误(这就是为什么前边调用linkedlist的getFirst方法报错的原因,因为父接口list中没有定义该方法。);如果有,再去调用子类的同名方法。
好记性不如烂笔头,本渣总结到此了,有问题欢迎指正、
原文地址:https://www.cnblogs.com/April1995/p/9603679.html