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

问题的起因:今天在敲代码的时候用到了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

时间: 2024-11-08 10:31:11

知识点划重点-向上转型问题的相关文章

重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)

多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获. 什么是多态 简单的理解多态 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力.比如说,有一杯水,我不知道它是温的.冰的还是烫的,但是我一摸我就知道了.我摸水杯这个动作,对于不同温度的水,就会得到不同的结果.这就是多态. 那么,java中是怎么体现多态呢?我们来直接看代码: public class Water { pu

【转】面向对象之多态(向上转型与向下转型)

转:https://blog.csdn.net/qq_31655965/article/details/54746235. 多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获. 什么是多态 简单的理解多态 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力.比如说,有一杯水,我不知道它是温的.冰的还是烫的,但是我一摸我就知道了.我摸水杯这个动作,对于不同温度的水,就会得到不

《中级通信工程师 专业实务部分第一章 划重点啦!》

每周一定期推送[专业实务]部分中级通信工程师备考干货关注我们!一起上岸!今天我们主要对第一章? 无线通信基础?划划重点 无线通信概述利用空间作为信道,以电磁波的形式传播信息的通信方式. 电磁波- 变化的电场产生磁场,变化的磁场产生 电场- 电场.磁场和传播方向相互垂直(横波)- 极化方向- 振幅(强度,是能量密度,正比于振幅 的平方)与距离和功率的关系无线频谱划分-?总的无线频谱范围:?3KHz~300GHz移动通信(2G/3G/4G网络):?300~3000MHz,分米波,UHF?5G网络:s

Java向上转型和向下转型(附具体样例)

                                            Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { public void eat() { System.out.println("父类的 eating..."); } } class Bird extends Animal { @Override publ

接口回调和向上转型

抄别人的,但为了自己掌握更加的踏实,所以复制到这里,拜谢原创!http://blog.csdn.net/u014025369/article/details/24707525 接口回调是指:可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法.实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调.看下面示例.interface People {     void people

向上转型和向下转型

对象的多态性: 向上转型:子类对象变为父类对象 向下转型:父类对象变为子类对象 class A{ public void print(){ System.out.println("A"); } } class B extends A{ public void print(){ System.out.println("B"); } } class C extends A{ public void print(){ System.out.println("C&

java向上转型和向下转型

一直不太明白这个概念,于是在网上搜索了一下文章转载自:http://www.cnblogs.com/fickleness/p/3149011.html 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 向下转型:父类引用的对象转换为子类类型称为向下转型. 前者

Java转型(向上转型和向下转型)

在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念"人".再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类).我们现实中也经常这样说:麻雀是鸟.这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类.这也符合Java提倡的面向抽象编程思想.来看下面的代码: package a.

J2SE快速进阶——向上转型及其内存分析

还记得刚通过C#学习面向对象时,接触了对象转型,最近学习Java,又遇到了.这里再用Java分析一下对象的转型,并适当利用内存分析来加深理解. 向上转型 我们都知道,狗是动物中的一种,那么如果现在有一个Dog类和Animal类,那么他们的关系就是Dog类继承Animal类. 我们经常说,狗是动物,实际上"狗是动物"这句话就是向上转型的一个例子,即把狗(子类)当做动物(父类)来看待.用一句话来总结,向上转型就是父类的引用指向子类的实例. 实例说明&&内存分析 下面就用一个