Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态。其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现。如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的引用变量所指向具体类型和通过该引用变量发出的方法调用在编译的时候并不确定,而是程序运行期间才确定,就是说一个引用变量到底指向哪一个类的实例对象,该引用变量发出的方法调用哪一个类的中的方法,必须在程序运行期间才能确定。

Java的多态浅谈

概述

Java的四大基本特性:抽象,封装,继承和多态。其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现。如果非要用专业术语来描述什么是多态的话

多态是指程序中定义的引用变量所指向具体类型和通过该引用变量发出的方法调用在编译的时候并不确定,而是程序运行期间才确定,就是说一个引用变量到底指向哪一个类的实例对象,该引用变量发出的方法调用哪一个类的中的方法,必须在程序运行期间才能确定。

记得大学时老师讲多态举的一个例子:上课铃响了,同学们都回各自教室上课,这就是多态。这就完了?如果是刚接触编程的同学来说,估计都懵逼了,我们那时就是这种状态。接下来我们用代码实现下老师说的意思。

多态实例

//上课铃响了

public class Ring

{

%

}

1班的同学听到铃声回去上语文课

public class ClassRoom1 extends Ring

{

public void ringSound() { System.out.println("classRoom1的同学听到铃声上语文了!!!"); }

}

2班的同学听到铃声回去上英语课

public class ClassRoom2 extends Ring

{

public void ringSound() { System.out.println("classRoom2的同学听到铃声上英语了!!!"); }

}

Main类

public class Main

{

public static void main(String[] args) { Ring ring = new ClassRoom1(); Ring ring1 = new ClassRoom2(); ring.ringSound(); ring1.ringSound(); }

}

输出

classRoom1的同学听到铃声上语文了!!!

classRoom2的同学听到铃声上英语了!!!

这就是一个简单的的多态例子,我们从中不难发现,多态存在的几个关键点,

有继承关系(extends)

子类重写父类方法(ringSound)

父类引用指向子类对象 Ring ring = new ClassRoom1()

现在我们改下例子,看出现什么情况

public class Ring

{

public static void ringSound() { System.out.println("我是铃声!!!"); }

}

这时发现ClassRoom1 和 ClassRoom2 都报错了,那我们也给他们都加上static

public class ClassRoom1 extends Ring

{

public static void ringSound() { System.out.println("classRoom1的同学听到铃声上语文了!!!"); }

}

ClassRoom2类

public class ClassRoom2 extends Ring

{

public static void ringSound() { System.out.println("classRoom2的同学听到铃声上英语了!!!"); }

}

预编译没报错了,那么输出应该是刚才的结果,main函数跑起来,输出

我是铃声!!!

我是铃声!!!

可以发现,结果并不是我们所想的那样。我们可以得出一个结论:在Java中static修饰的函数不能被子类重写。

其实Java中,父类含有一个静态函数,而且在他的子类也同样有一个返回类型,函数名,参数列表都相同的静态函数,子类实际上只是将父类中的该同名函数进行隐藏,而非重写,他们两个是完全没有关系的函数,所以他们的行为并不具有多态性。

注意:就是被final修饰的父类函数是无法被重写和private修饰的父类函数无法被继承。这是Java的规定,就不在举例说明

多态的作用

说了这么多,多态有什么作用

解耦,各种

多态分类

为了确定执行多态函数的哪一个,所以有两种情况:编译时多态,运行时多态

函数重载都是编译时多态,根据实际参数的

函数重写表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。

public class Ring

{

public void ringSound() { System.out.println("我是铃声!!!"); }

}

Main类

public class Main

{

public static void main(String[] args) { ClassRoom2 ring1 = new ClassRoom2();//编译时多态,执行Ring类的ringSound ring1.ringSound(); //编译时多态,执行ClassRoom2 类的ringSound Ring ring = new ClassRoom2(); ring.ringSound(); //运行时多态,是运行Ring的 ringSound 还是 ClassRoom2 类的ringSound 只有运行时在确定。 }

花木兰替父亲花弧从军。那么这时候花木兰是子类,花弧是父类。花弧有自己的成员属性年龄,姓名,性别。花木兰也有这些属性,但是很明显二者的属性完全不一样。花弧有自己的非静态成员方法‘骑马杀敌’,同样花木兰也遗传了父亲一样的方法‘骑马杀敌’。花弧还有一个静态方法‘自我介绍’,每个人都可以问花弧姓甚名谁。同时花木兰还有一个自己特有的非静态成员方法‘涂脂抹粉’。但是,现在花木兰替父从军,女扮男装。这时候相当于父类的引用(花弧这个名字)指向了子类对象(花木兰这个人),那么在其他类(其他的人)中访问子类对象(花木兰这个人)的成员属性(姓名,年龄,性别)时,其实看到的都是花木兰她父亲的名字(花弧)、年龄(60岁)、性别(男)。当访问子类对象(花木兰这个人)的非静态成员方法(骑马打仗)时,其实都是看到花木兰自己运用十八般武艺在骑马打仗。当访问花木兰的静态方法时(自我介绍),花木兰自己都是用她父亲的名字信息在向别人作自我介绍。并且这时候花木兰不能使用自己特有的成员方法‘涂脂抹粉’。 ———–多态中的向上造型

那么终于一将功成万骨枯,打仗旗开得胜了,花木兰告别了战争生活。有一天,遇到了自己心爱的男人,这时候爱情的力量将父类对象的引用(花弧这个名字)强制转换为子类对象本来的引用(花木兰这个名字),那么花木兰又从新成为了她自己,这时候她完全是她自己了。名字是花木兰,年龄是28,性别是女,打仗依然那样生猛女汉子,自我介绍则堂堂正正地告诉别人我叫花木兰。OMG!终于,终于可以使用自己特有的成员方法‘涂脂抹粉’了。从此,花木兰完全回到了替父从军前的那个花木兰了。并且和自己心爱的男人幸福的过完了一生。 ——多态中的向下

花弧

public class HuaHu

{

int age = 60; String name = "花弧"; String sex = "男"; public void horseKillEnemy() { System.out.println("骑马杀敌"); } public static void suggest() { System.out.println("我叫花弧"); }

}

花木兰

public class HuaMuLan extends HuaHu

{

String name = "花木兰"; int age = 28; String sex = "女"; public void horseKillEnemy() { System.out.println("花木兰骑马杀敌"); } public void Prettify() { System.out.println("花木兰涂脂抹粉"); }

}

替父从军

public class Main

{

public static void main(String[] args) { //替父从军 HuaHu huaHu = new HuaMuLan(); System.out.println("姓名:" + huaHu.name + ",年龄:" + huaHu.age + ",性别:" + huaHu.sex); //其他人 huaHu.horseKillEnemy(); huaHu.suggest(); //用她父亲的名字信息在向别人作自我介绍 //huaHu.Prettify() //无法使用 // 战争结束了 HuaMuLan huaMuLan = (HuaMuLan)huaHu; //花木兰变回自己 System.out.println("姓名:" + huaMuLan.name + ",年龄:" + huaMuLan.age + ",性别:" + huaMuLan.sex); //自己特有函数 huaMuLan.Prettify(); System.out.println("幸福的过完了一生"); }

}

输出

姓名:花弧,年龄:60,性别:男

花木兰骑马杀敌

我叫花弧

姓名:花木兰,年龄:28,性别:女

花木兰涂脂抹粉

幸福的过完了一生

最后看个经典的多态例子

A类

public class A

{

public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); }

}

B类

public class B extends A

{

public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); }

}

C类

public class C extends B

{

}

D类

public class D extends B

{

}

Main类

public class Main

{

public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); System.out.println("2--" + a1.show(c)); System.out.println("3--" + a1.show(d)); System.out.println("4--" + a2.show(b)); System.out.println("5--" + a2.show(c)); System.out.println("6--" + a2.show(d)); System.out.println("7--" + b.show(b)); System.out.println("8--" + b.show(c)); System.out.println("9--" + b.show(d)); }

}

输出

1–A and A

2–A and A

3–A and D

4–B and A

5–B and A

6–A and D

7–B and B

8–B and B

9–A and D

你做对了吗?

http://www.dengb.com/wzaq/1343699.www.dengb.comtruehttp://www.dengb.com/wzaq/1343699.htmlTechArticleJava的多态浅谈,Java多态浅谈 Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态。其中,抽象,封装,继承可以说多态的基础…

—-想了解更多的网站安全相关处理怎么解决关注

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/wbfwq/wzaq/99074.html

解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!相关推荐

  1. java多态主要体现在哪方面,浅谈java多态的实现主要体现在哪些方面

    thinking in java3中的多态 People are often confused by other, non-object-oriented features of Java, like ...

  2. 解耦 多态性 java_java多态

    我们都知道面向对象有四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现.多态,是Java中非常重要的一个部分,所以今天来 ...

  3. java多态的理解(java多态的理解和使用 - 阿猫阿狗)

    谈谈你对Java中的多态的理解.(为什么要使用多态,有什么好处,一般用在什么场合) 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同 ...

  4. java的多态代码例子_java多态例子,java多态代码实例

    下面要给大家分享的是一个多态经典案例,一起来看看这个java多态简单例子吧./*多态的好处:提高了代码的维护性和扩展性: 弊端:父类不能使用子类的特有功能. 要用子类的特有功能,可以: A:创建子类对 ...

  5. c java多态_浅谈Java多态

    什么是Java中的多态?又是一个纸老虎的概念,老套路,把它具体化,细分化,先想三个问题(注意,这里不是简单的化整为零,而是要建立在学习一个新概念时的思考框架): 1.这个东西有什么用?用来干什么的?它 ...

  6. 浅谈java spring_浅谈Spring(一)

    Spring是当前比较流行的基于Java语言的MVC框架,所谓框架也就是它已经实现好了诸多东西,使java开发人员能把精力尽量放在业务逻辑上. Spring技术的特点是IOC, 即反向注入,主要应用的 ...

  7. 浅谈java中的多态

    浅谈java中的多态 学习了java一年的时间,这里对java的多态进行了一个总结,如有错误希望可以指出, 首先java的多态分为编译时的多态和运行时的多态,其中编译时的多态就是方法的重载(前期绑定) ...

  8. 小浩浅谈Java三特性(封装,继承,多态)

    1.封装,什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量 ...

  9. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

最新文章

  1. css6图层 解锁,OpenLayers 5至6:图层无法渲染
  2. shodan 渗透测试 漏洞挖掘 一些用法
  3. EasyUI 树菜单
  4. python文件读取数据-Python从文件中读取数据
  5. 深入理解java虚拟机---读书笔记
  6. c# 调matlab传字符串_C# Matlab 相互调用
  7. Android应用签名作用,安卓app签名功能
  8. 基于.NET的系统开发需要注意的问题总结
  9. 又发生频繁FGC,这次是谁的锅
  10. Php点击更换封面,JavaScript_js实现点击图片改变页面背景图的方法,本文实例讲述了js实现点击图 - phpStudy...
  11. 《Python Cookbook 3rd》笔记(1.6):字典中的键映射多个值
  12. 【重构之法】代码的坏味道
  13. Python精通-运算符与基本数据类型(二)
  14. 如何用孩子兄弟表示法存储树c语言,C语言,数据结构,树的孩子兄弟表示法,程序一切正常,但是有个问题不太懂了,园豆不多,帮帮忙,求助一下....
  15. php unexpected t_object_operator,php - PHP中的“Unexpected T_OBJECT_OPERATOR”错误
  16. AndroidDeveloper Weekly NO.4
  17. Java基础SE.03.Java面向对象
  18. Unity PlayerPrefs 游戏存档
  19. java 分解质因数
  20. #Geek Talk# AI and FinTech,投资阿里巴巴的 Benson Tam 也会跟大家一起 Talk

热门文章

  1. 数字逻辑和数字系统重要知识点(考试复习)
  2. 【JAVA】Socket通讯发送报文
  3. 深入浅出MFC-学习笔记 Day 2
  4. win8虚拟机_用vm ware安装虚拟机必备的工具神器
  5. 【CRISPR-Cas9神助攻】 Cas9稳定表达细胞系、CRISPR/Cas9敲除细胞系
  6. Unity之ASE实现边缘光效果
  7. 基于android的商城APP源码
  8. Socket测试工具(客户端、服务端)
  9. 怎么设置计算机的快捷键图标,Win7旗舰版如何更改桌面快捷方式和文件类型图标...
  10. 杨辉三角java实验目的,杨辉三角java