JAVA的多态的优劣,向上转型,向下转型什么意思?
多态定义:同一个对象,在不同时刻表现出的不同形态,或者说是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接复制给父类引用变量时,相同引用类型的变量调用同一个方法,所呈现的多种不同行为特性。
定义说明:例如
//三个类,猫和狗类,都继承动物类。(一个类中定义的属性和功能被其他类继承)
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的多态的优劣,向上转型,向下转型什么意思?相关推荐
- Java从入门到放弃09---多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别
Java从入门到放弃09-多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别 01 多态 多态指的是 ...
- Java多态中的 向上转型/向下转型
Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法 ...
- Java 中的上转型和下转型
在我们的日常中,上转型和下转型都使用的比较少,所以当别人问起来什么是上转型,什么是下转型,自己往往一片模糊,或者不能将他们进行明显的区分. 在这里,我将以我个人理解来论述上下转型,希望对大家有帮助,如 ...
- Java接口,多态,向上转型,向下转型的意义
接口 官方解释: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现 ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 包含 ...
- JAVA中多态以及向上转型向下转型、重写的讲解
重写 重写(override):也称为覆盖.重写是子类对父类非静态.非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变. 重写的好处在于子 ...
- java:多态详解,以及对象的向上和向下转型
大家好,兔胆包天我又来啦,今天给大家分享的是多态,多态最主要的是父类引用指向子类对象,还是老办法,直接上代码,代码中注解的很详细哦. 这是第一个代码: //测试多态 public class Anim ...
- 类.接口.多态.向上转型.向下转型
一:综述 电脑利用USB接口实现键盘的输入.鼠标的移动 二:代码 USB.java package ClassAndObject;public interface USB {public abstra ...
- 【零基础学Java】—对象的向上和向下转型(二十七)
[零基础学Java]-对象的向上转型(二十七) 对象的向上转型,其实就是多态的写法 格式:父类名称 对象名=new 子类名称(): 含义:右侧创建一个子类对象,把它当做父类来看待使用 注意事项:向上转 ...
- 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)
IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...
最新文章
- Spark在不同集群中的运行架构
- 【SharePoint 2010】SharePoint 2010开发方面的课堂中整理有关问题
- python一般用来开发什么-python主要用来做什么?Python开发简单吗?
- 设计模式系列6:适配器模式(Adapter Pattern)
- js 月份加6个月_美国切削工具6月份订单较上月增加10.1
- mysql 默认page大小_Innodb优化之修改页大小
- Spring中DispacherServlet、WebApplicationContext、ServletContext的关系
- (王道408考研操作系统)第一章计算机系统概述-第一节1:操作系统基本概念以及目标和功能
- 方法 注释_在IDEA中配置类和方法的文档注释
- 【转】URL和URI的区别
- 使用jsp页面查看jvm使用情况
- python列表转化为数字信号_python 经典数字滤波实例 Python 数字信号处理程序实现分享解...
- Oracle Recursive Calls 说明
- H.264学习过程中遇到的英文缩写整理
- [Win]chrome 离线下载
- iframe 防止挂马的问题
- 集成百度做敏感词鉴定
- opencv保存视频文件很大
- 天天向上的力量---python持续的力量
- (20200208已解决)PyCharm中Tab键无效