知识点划重点-向上转型问题

问题的起因:今天在敲代码的时候用到了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中没有定义该方法。);如果有,再去调用子类的同名方法。

 

好记性不如烂笔头,本渣总结到此了,有问题欢迎指正、

posted @ 2018-09-07 11:46  朝朝暮暮dx  阅读(174)  评论(0编辑  收藏  举报