多态定义:同一个对象,在不同时刻表现出的不同形态,或者说是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接复制给父类引用变量时,相同引用类型的变量调用同一个方法,所呈现的多种不同行为特性。

定义说明:例如

//三个类,猫和狗类,都继承动物类。(一个类中定义的属性和功能被其他类继承)
public class Animail {public void eat(){System.out.println("动物吃东西");}
}public class Cat extends Animail{@Overridepublic void eat() {System.out.println("猫吃鱼");}
}public class Dog extends Animail{@Overridepublic void eat() {System.out.println("狗吃骨头");}
}//实例测试类public class AnimalDemo {public static void main(String[] args) {AnimalOperator ao=new AnimalOperator();//创建下面AnimalOperator类的对象Cat c=new Cat();ao.useAnimal(c);//(当把子类对象直接复制给父类引用变量时,相同引用类型的变量调用同一个方法)Dog dog=new Dog();ao.useAnimal(dog);//(当把子类对象直接复制给父类引用变量时,相同引用类型的变量调用同一个方法)}
}//操作类,提供接口
public class AnimalOperator {public void useAnimal(Animail a){a.eat();//(呈现的多种不同行为特性)
}

运行AnimalDemo输出:

猫吃鱼

狗吃骨头

多态的前提和体现

*有继承/实现关系

*有方法重写

*有父类引用指向子类对象

总结:

1.AnimalOperator类的方法,会传入不同的对象,有Cat,Dog,每次传入的都是继承Animail的子类,根据调用方法原则:编译看左边,运行看右边,得到不同输出结果。

2.这就是多态,一个类根据传入的不同子类,输出多个子类重写的方法结果。

3.如果没有多态,我们每次在测试类中写一个动物时,就要加一个接口在操作类中,所以这也是多态的优点之一。对于子类的公共方法,可以省去重复写很多接口

4.成员访问的方法:对于子类的非继承的方法,如果用同样的方法去调用,那么会报错

例如

public class Animal {public int age=40;public void eat(){System.out.println("动物吃东西");}
}public class Cat extends Animal {public int age=20;public int weight=10;@Overridepublic void eat() {System.out.println("猫吃鱼");}public void playGame(){System.out.println("猫捉迷藏");}
}public class AnimaiDemo {public static void main(String[] args) {Animal a=new Cat();System.out.println(a.age);System.out.println(a.weight);//会报错!!!!a.eat();a.playGame();//会报错!!!!!}
}

①.对于成员变量来说,共有的属性,输出父类的值。特有属性:不能通过编译。

原则:编译看左边,运行看左边(编译父类没有不通过,运行结果是父类的结果)

②.对于成员方法来说,共有的方法,输出子类的方法。特有方法:不能通过编译。

原则:编译看左边,运行看右边

多态中的转型

向上转型:从子到父,父类引用指向子类对象。

向下转型:从父到子,父类引用转为子类对象。

例如

//父类
public class Animail {public void eat(){System.out.println("动物吃东西");}
}//猫类继承父类
public class Cat extends Animail{@Overridepublic void eat() {System.out.println("猫吃鱼");}public void playGame(){System.out.println("猫捉迷藏");}
}//测试类
public class AnimalDemo {public static void main(String[] args) {Animal a=new Cat();//向上转型第一种情况,不能访问特有的方法。a.eat();//特有方法,如何访问?再创建一个猫的对象,如下,就可以访问。Cat c=new Cat();c.eat();c.playGame();//把上面两个合为一体,只创建一个对象,来实现特有方法的引用,就是向下转型。Cat c=(Cat)a;c.eat();c.playGame();}
}

多态转型的内存图解

1.首先执行main方法,然后开辟一个Animal a,然后再堆内存中执行new Cat();

2.把001赋值给Animal a的地址 

3.运行看左边,执行看右边的方法,执行结果:猫吃鱼

4.往下执行,结果如上图所示

5.当把a对象,强制把狗转换为猫对象时,就会报出,转换异常。不同实例不能转换。

堆内存和栈内存区别

1. 栈(stack)

  在Java中,栈(stack)是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本类型(如int、float等)的变量、指令代码、常量及对象句柄(也就是对象的引用地址)。

  栈内存实际上就是满足先进后出的性质的数学或数据结构,栈内存的操作方式类似于数据结构中的栈(仅在表尾进行插入或删除操作的线性表)。

  栈的优势在于,它的存取速度比较快,仅次于寄存器,栈中的数据还可以共享,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间。

  缺点表现在,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

2.堆(heap)

  堆(heap)是一个程序运行动态分配的内存区域,堆内存实际上指的就是优先队列的一种数据结构.

  在Java中,构建对象时所需要的内存从堆中分配。这些对象通过new指令“显式”建立,这种分配方式类似于数据结构中的链表。

  堆内存在使用完毕后,是由垃圾回收(Garbage Collection,GC)器“隐式”回收的。

  堆的优势是在于动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。

  缺点为,由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。

总结:

  1.Java开发时候尽量使用基础类型,少使用包装类型

  2.定义集合的时候尽量指定大小,减少扩容开销

  

JAVA的多态的优劣,向上转型,向下转型什么意思?相关推荐

  1. Java从入门到放弃09---多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别

    Java从入门到放弃09-多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别 01 多态 多态指的是 ...

  2. Java多态中的 向上转型/向下转型

     Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法 ...

  3. Java 中的上转型和下转型

    在我们的日常中,上转型和下转型都使用的比较少,所以当别人问起来什么是上转型,什么是下转型,自己往往一片模糊,或者不能将他们进行明显的区分. 在这里,我将以我个人理解来论述上下转型,希望对大家有帮助,如 ...

  4. Java接口,多态,向上转型,向下转型的意义

    接口 官方解释: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现 ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 包含 ...

  5. JAVA中多态以及向上转型向下转型、重写的讲解

    重写 重写(override):也称为覆盖.重写是子类对父类非静态.非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变. 重写的好处在于子 ...

  6. java:多态详解,以及对象的向上和向下转型

    大家好,兔胆包天我又来啦,今天给大家分享的是多态,多态最主要的是父类引用指向子类对象,还是老办法,直接上代码,代码中注解的很详细哦. 这是第一个代码: //测试多态 public class Anim ...

  7. 类.接口.多态.向上转型.向下转型

    一:综述 电脑利用USB接口实现键盘的输入.鼠标的移动 二:代码 USB.java package ClassAndObject;public interface USB {public abstra ...

  8. 【零基础学Java】—对象的向上和向下转型(二十七)

    [零基础学Java]-对象的向上转型(二十七) 对象的向上转型,其实就是多态的写法 格式:父类名称 对象名=new 子类名称(): 含义:右侧创建一个子类对象,把它当做父类来看待使用 注意事项:向上转 ...

  9. 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

    IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...

最新文章

  1. Spark在不同集群中的运行架构
  2. 【SharePoint 2010】SharePoint 2010开发方面的课堂中整理有关问题
  3. python一般用来开发什么-python主要用来做什么?Python开发简单吗?
  4. 设计模式系列6:适配器模式(Adapter Pattern)
  5. js 月份加6个月_美国切削工具6月份订单较上月增加10.1
  6. mysql 默认page大小_Innodb优化之修改页大小
  7. Spring中DispacherServlet、WebApplicationContext、ServletContext的关系
  8. (王道408考研操作系统)第一章计算机系统概述-第一节1:操作系统基本概念以及目标和功能
  9. 方法 注释_在IDEA中配置类和方法的文档注释
  10. 【转】URL和URI的区别
  11. 使用jsp页面查看jvm使用情况
  12. python列表转化为数字信号_python 经典数字滤波实例 Python 数字信号处理程序实现分享解...
  13. Oracle Recursive Calls 说明
  14. H.264学习过程中遇到的英文缩写整理
  15. [Win]chrome 离线下载
  16. iframe 防止挂马的问题
  17. 集成百度做敏感词鉴定
  18. opencv保存视频文件很大
  19. 天天向上的力量---python持续的力量
  20. (20200208已解决)PyCharm中Tab键无效

热门文章

  1. gis 空间分析 鸟类栖息地选取_GIS空间分析专题一:鸟儿栖息地查找
  2. [置顶] 手机通过socket控制电脑关机,重启,注销等功能
  3. 使用Webpack的代码分离实现Vue懒加载(译文)
  4. 同一页面实现多个Tab选项卡功能
  5. 绕过COM,一个巧妙的思路
  6. Linux中的rz和sz命令
  7. 原来,我们的时间这样被科技巨头们瓜分(转)
  8. 新网站SEO要做的事情有哪些
  9. browser.html – HTML 实现 Firefox UI
  10. 分布式监控系统ganglia配置文档