【java的多态性】


java的多态性是面向对象的三大特性之一.(封装,继承,多态),多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码, 让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

java多态分为:

1.方法的重载与重写。

重载:同类中返回值和函数名相同,而参数列表不同的两个方法。

重写:是子类的方法覆盖父类的方法,要求方法名和参数都相同

2.对象的多态性

在这里我们主要介绍对象的多态性

我自己的理解是小转大自动转换,大转小需要强制转换。父类大于子类。

(1)父类引用指向子类实例

  1. public class Mystring {
  2. public static void main(String[] args) {
  3. //父类大,子类小,小转大自动转换,只能调用父类也有的方法
  4. person temp=new student();//父类的引用指向子类对象
  5. temp.say();
  6. person temp1=new teacher();
  7. temp1.say();
  8. }
  9. }
  10. //抽象类
  11. abstract class person
  12. {
  13. public String name;
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public abstract void say();//抽象方法
  21. }
  22. //学生类
  23. class student extends person//继承person类
  24. {
  25. //实现抽象方法
  26. public void say()
  27. {
  28. System.out.println("我是学生。。。。");
  29. }
  30. }
  31. //老师类
  32. class teacher extends person//继承person类
  33. {
  34. public void say()
  35. {
  36. System.out.println("我是老师。。。。");
  37. }
  38. //扩展方法
  39. public void sayHello()
  40. {
  41. System.out.println("Hello,我是老师。。。。");
  42. }
  43. }

复制代码

 
(2)子类对象指向父类引用

  1. public class Mystring {

  2. public static void main(String[] args) {
  3. //父类大,子类小,自动转换,只能调用父类也有的方法
  4. person temp=new student();//父类的引用指向子类对象
  5. temp.say();
  6. person temp1=new teacher();
  7. temp1.say();
  8. //------------调用teacher的扩展方法sayHello()
  9. //父类person没有sayHello方法,不能直接temp1.sayHello()
  10. //子类小于父类,需要强制转换
  11. teacher temp3=(teacher)temp1;
  12. temp3.sayHello();
  13. }
  14. }
  15. //省略类的定义

复制代码

执行结果: 

我觉得记住小转大自动转换,大转小需要强制转换。父类大于子类就很好理解

既然父类可以自动转化为子类,那我们可以利用这特性解决一个经常遇到问题

  1. public class Mystring {
  2. public static void main(String[] args) {
  3. student temp=new student();
  4. say(temp);
  5. teacher temp1=new teacher();
  6. say(temp1);
  7. }
  8. public static void say(student temp)
  9. {
  10. temp.say();
  11. }
  12. public static void say(teacher temp1)
  13. {
  14. temp1.say();
  15. }
  16. //省略类的定义
  17. }

复制代码

我们发现say()由于需要的参数不同,所以重载了两份。这样写,要是类很多,那不要重载很多份。这里我们使用对象的多态就能很好的解决。把代码改为:

  1. public class Mystring {

  2. public static void main(String[] args) {
  3. person temp=new student();
  4. say(temp);
  5. person temp1=new teacher();
  6. say(temp1);
  7. }
  8. public static void say(person temp)
  9. {
  10. temp.say();
  11. }
  12. //省略类的定义
  13. }

复制代码

当然这样写的话,调用的方法只能是父类也有的方法,这里能性是因为父类也有say()方法。为了解决这一问题,我们引入关键字instanceof。

instanceof的基本语法为:对象 instanceof 类型-----------返回boolean值

用来判断一个对象是否属于某和类的实例,是就返回true,否则返回false

下面我们在say()方法里调用teacher的扩展方法sayHello()。student和person类都没用该方法,上面代码肯定报错。这是我们可以将代码改为:

  1. public class Mystring {
  2. public static void main(String[] args) {
  3. person temp=new student();
  4. say(temp);
  5. person temp1=new teacher();
  6. say(temp1);
  7. }
  8. public static void say(person temp)
  9. {
  10. //如果是teacher对象就强制转换为teacher(大转小)
  11. if(temp instanceof teacher)
  12. {
  13. teacher ok=(teacher)temp;
  14. ok.sayHello();
  15. }
  16. }
  17. //省略类的定义
  18. }

复制代码

父类大转小自动转换,让我想起了所有类的父类Object类,它当然是最大的啦。所有我们代码当然还可以改为:

  1. public class Mystring {

  2. public static void main(String[] args) {
  3. person temp=new student();
  4. say(temp);
  5. person temp1=new teacher();
  6. say(temp1);
  7. }
  8. //使用Object类
  9. public static void say(Object temp)
  10. {
  11. //如果是teacher对象就强制转换为teacher(大转小)
  12. if(temp instanceof teacher)
  13. {
  14. teacher ok=(teacher)temp;
  15. ok.sayHello();
  16. }
  17. }
  18. //省略类的定义
  19. }
  20. //抽象类

复制代码

这篇博客是对我学习java多态的一个总结,也拿出来和大家分享,有什么错误还望指正。

时间: 2024-12-14 18:40:48

【java的多态性】的相关文章

Java:多态性

Java的多态性:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. java的多态性要满足三个条件: 1.继承关系 2.在子类重写父类的方法 3.父类引用指向子类的对象,即animal p = new dog() 在多态中非静态成员函数的特点: 在编译时期:参阅引用形变量所属的类中是否有要调用的方法.如果有,编译通过:否则,编译不通过 在运行时期:参阅对象所属的类中是否有要调用的方法.如果有,运行成功:否则,运行失败. 总结:编译时

Java虚拟机 - 多态性实现机制

[深入Java虚拟机]之五:多态性实现机制--静态分派与动态分派 方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析.这在前面的"Java内存区域与内存溢出"一文中有提到. 静态解

java的多态性(二)

2013-10-16 19:44 9364人阅读 评论(25) 收藏 举报  分类: [JAVA开发]-----Java提高篇(36)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是为了重用父类代码.两个类若存在IS-A的关系就可以使用继承.,同时继承也为实现多态做了铺

深入理解JAVA的多态性[转]

昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整理出来供大家参考,不一定完全正确,欢迎大家批评指正. (一)相关类 class A ...{         public String show(D obj)...{                return ("A and D");         }          public String show(A obj)...{                return ("A and A&qu

Java中多态性的实现

class A ...{ public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A...{ public String show(B obj)...{ return ("B and B"); } public String show(A obj)...{ re

[Java基础] 多态性

1.Java 引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定.如果编译时类型和运行时类型不一致,就会出现所谓的多态性: 2.引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,这就是方法多态性的体现. 3.多态性是针对方法的,对象的属性不具备多态性.通过引用变量访问对象实例属性时,系统总是试图访问编译时类型所定义的属性,而不是运行时类型所定义的属性. 示例代码:

Java 语言多态性

https://www.ibm.com/developerworks/cn/java/java-language-polymorphism/index.html 定义多态性 多态性是面向对象编程中的一个概念,表示"不同形态",实际上意味着,根据实现方法的对象,相同方法名称具有不同的行为. 在 Java 编程语言的语境中,多态性意味着(通过一种方法)以不同方式为不同对象实现相同的行为契约.在 Java 中,通常有 3 种方式实现此目的: 接口 抽象方法 方法重写 通过接口实现多态性 实质

java面向对象- 多态性的体现和使用

多态体现: 方法的重载和重写 对象的多态性 2.对象的多态性: 向上转型:程序会自动完成 父类 父类对象 = 子类实例 向下转型:强制类型转换 子类 子类对象 = (子类)父类实例 class A{ public void tell01(){ System.out.println("A--tell01"); } public void tell02(){ System.out.println("A--tell02"); } } class B extends A{

java笔记多态性

今天听一个同学讲了java动态绑定的一个很好地例子,我深受启发,特此记录.java动态绑定是在运行时才会具体绑定,而不是在编译的时候进行相关操作,这为代码的灵活性提供了极大便利,也使得维护边的较为简便. 对于动态绑定我的理解是,在定义一个方法 的时候,需要某些参数,比如一个类对象,但是在运行的时候这个对象才回确定,比如打CS时候的各种枪,这个时候,为这个方法重载不同的对象参数会变得极为繁琐,所以我们可以造一个枪的父类,把父类的对象传到这个参数中,在运行时,再决定是哪种具体的枪. class Gu