方法的重载、重写和动态链接构成了java的多态性。

1.方法的重载

同一个类中多个同名但形参有所差异的方法,在调用时会根据参数的不同做出选择。

2.方法的重写

子类中重新定义了父类的方法,有关方法重写的规则请参考文章:Java中方法重写的注意事项

3.动态链接

动态链接出现在父类引用指向子类对象的场景。

因为子类中有一个隐藏的引用super指向父类实例,当出现父类引用指向子类对象时,子类对象就会将其隐藏的父类实例返回给该父类引用。因此,父类引用还是指向了父类实例,而不是像表面看到的那样指向了子类对象。

下面通过代码来看父类、子类的内存分配情况:

假设现在有一个父类Father,它里面的变量需要占用1M内存。有一个它的子类Son,它里面的变量需占用0.5M内存。当创建子类对象时会率先创建父类对象,并将其隐藏的引用super指向父类对象。

Father f = new Father();//系统将分配1M内存。

Son s = new Son();//系统将分配1.5M内存。

Father f1 =s;//父类引用指向子类对象,这时f1会指向子类对象中的1M内存

由于f1仅指向了子类对象中的父类实例,所以f1只能调用父类的方法,而不能调用子类的方法。但是,若子类重写了父类的方法,那么该父类引用将会调用子类的方法,而不在是父类的方法,这就是java中的动态链接。

3.1.动态链接带来的价值

JAVA里没有多继承,一个类只能有一个父类。而继承的表现就是多态,一个父类可以有多个子类,而在子类里可以重写父类的方法,每个子类里重写的代码不一样,自然表现形式也就不一样。当同一父类引用指向不同的子类实例,调用同一方法却具有不同的表现形式,这就是多态。相同的消息(也就是调用相同的方法)会有不同的结果。

举例说明:

//父类

public class Father{

//父类有一个打孩子方法

public void hitChild(){

}

}

//子类1

public class Son1 extends Father{

//重写父类打孩子方法

public void hitChild(){

System.out.println("为什么打我?我做错什么了!");

}

}

//子类2

public class Son2 extends Father{

//重写父类打孩子方法

public void hitChild(){

System.out.println("我知道错了,别打了!");

}

}

//子类3

public class Son3 extends Father{

//重写父类打孩子方法

public void hitChild(){

System.out.println("我跑,你打不着!");

}

}

//测试类

public class Test{

public static void main(String args[]){

Father father;

father = new Son1();

father.hitChild();

father = new Son2();

father.hitChild();

father = new Son3();

father.hitChild();

}

}

3.2.动态链接的总结

1、使用父类引用指向子类对象是动态链接的应用场景

2、该引用只能调用父类中定义的方法和变量 ,如果子类中重写了父类中的方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)。

3、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中重写父类中的变量,那么在编译时会报错。

4、父类引用指向子类实例时,方法调用采用“编译看左边,运行看右边”规则来判断。

本博文参考了:java多态性,父类引用指向子类对象

【Java_基础】java中的多态性的更多相关文章

  1. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  2. 计算机基础--Java中int char byte的关系

    计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...

  3. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  5. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

  6. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  7. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  8. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  9. [Java基础] Java中List.remove报错UnsupportedOperationException

    Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误.原来该List是一个AbstractList,不支 ...

随机推荐

  1. 常用HTTP协议响应码(转载)

    转载于: https://blog.csdn.net/github_36032947/article/details/78343734 HTTP响应码,也称http状态码(HTTP Status Co ...

  2. [题解]数学期望_luogu_P1850_换教室

    数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了, 开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关( ...

  3. Codeforces Round #532(Div. 2) C.NN and the Optical IIIusion

    链接:https://codeforces.com/contest/1100/problem/C 题意: 一个圆球外面由其他圆球包裹,两两相连. 给出n,r. n为外面圆球数量,r为内部圆球半径. 求 ...

  4. 玲珑杯”ACM比赛 Round #4 1054 - String cut 暴力。学到了扫描的另一种思想

    http://www.ifrog.cc/acm/problem/1054 问删除一个字符后的最小循环节是多少. 比赛的时候想不出,不知道怎么暴力. 赛后看了别人代码才晓得.唉,还以为自己字符串还不错, ...

  5. Spark Mllib里如何将数据集按比例随机地分成trainData、testData和validationData数据集(图文详解)

    不多说,直接上干货! 具体详情见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第11章 电影推荐引擎

  6. 一次dbcp和Hikaricp连接池比较联想到的线程池

    最近在测试连接池dbcp和Hikaricp速度时,为了弄清楚Hikaricp速度优势的原因,阅读了二者的源码,源码不是很难,类也没有多少,联想到很多知识,现在来总结一下.

  7. 顾问Advisor Aspectj注解

    顾问Advisor  通知 advice PointcutAdvisor  一个接口  是顾问的一种. . 任意单个字符 + 重复1到多次 * 重复0到多次 NameMetchMethodPointc ...

  8. sql server 日期 查询技巧

    CONVERT(varchar(100), SendTime, 23) –-sql里的字段SendTime参数 selectdateName(weekday,getDate());--返回当前星期 s ...

  9. java.lang.ClassCastException android.widget.RelativeLayout LayoutParams 异常

    1.在xml布局文件如下所示: <RelativeLayout android:layout_width="match_parent" android:layout_heig ...

  10. matlab均方根误差

    Matlab均方根误差的计算 http://blog.sina.com.cn/s/blog_6210f654010308kv.html