linkin大话面向对象--多态
java引用变量有2个类型,一个是编译时类型,一个是运行时类型:
编译时类型:声明的类型,把它看做是什么东西
运行时类型:真正的类型,实际上指的是什么东西
如果编译时类型和运行时类型不同,就出现多态。相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。
注意这个定义里面的关键字:方法。和方法不同,对象的属性不具备多态性。
编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给变量的对象决定。记住下面一句话就好:编译决定类型,运行绑定对象
- 当一个引用类型的变量若声明为父类的类型,但实际上引用的是子类的对象(多态情况):
此时该变量不能再访问子类中自己特有的字段和方法;
若子类覆写了父类的方法,那么此时通过变量访问到的方法,实际上是子类的方法;
- 实现多态的机制:
父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
- 多态的作用:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。只修改方法的实现,不必修改方法的声明。多态的使用,一般都会出现三方,第一方是父类,第二方是子类,第三方是调用多态的方法。
继承是多态产生的前提条件:
编译时多态:方法重载
运行时多态:方法覆写 注意:静态方法不能被覆写!
- 引用变量类型转换
向上转型(子类→父类):(自动完成) 父类名称 父类对象 = 子类实例 ;
向下转型(父类→子类):(强制完成) 子类名称 子类对象 = (子类名称)父类实例 对象名 instanceof 类;
判断指定的变量名此时引用的真正类型是不是当前给出的类或子类;注意: 对象的类型和 类必须有继承关系。
在进行强制类型转换之前,先用instanceof运算符判断是否可以成功转换,从而避免出现ClassCastException异常,这样可以使程序更加健壮。
关于多态,代码如下:
/**
*
* @version 1L
* @author LinkinPark
* @since 2014-10-28
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^多态的含义:编译决定类型,运行绑定对象,只是单纯的讲方法,和属性木有关系的
*/
public class SubClass extends BaseClass{
public String name = "LinkinPark"; @Override
public void test(){
System.out.println("当你的才华撑不起你的野心的时候,就该默默的学习了,,,");
}
public void test2(){
System.out.println("面向对象,春暖花开,,,");
} public static void main(String[] args) {
//以下2行运行时类型和编译时类型一致,不会发生多态
SubClass subClass = new SubClass();
BaseClass baseClass = new BaseClass();
//下面运行时类型和编译时类型不一致,发生多态
BaseClass linkin = new SubClass();
//多态是针对方法来说的,属性不具备多态性,所以编译时是什么类型,就调用那个类型的属性值
System.out.println(linkin.name);
//子类的方法覆盖父类方法,调用子类方法
linkin.test();
//子类中不存在这个方法,那么只能调用父类的了
linkin.test1();
//尽管运行时类型是子类,但是编译的时候仍然不能调用子类的方法,除非向下强转
//linkin.test2();
//养成良好的习惯,在强制类型转换时候都要instanceof下判断下类型
if(linkin instanceof SubClass){
((SubClass)linkin).test2();
}
}
} class BaseClass{
public String name = "Binger";
public void test(){
System.out.println("你以为你以为的真是就是你以为的么???");
}
public void test1(){
System.out.println("梦想终究还是要有的,万一实现了呢,,,");
}
}
linkin大话面向对象--多态的更多相关文章
- linkin大话面向对象--类和对象
我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...
- linkin大话面向对象--闭包和回调
先来理解2个概念:闭包和回调 什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...
- linkin大话面向对象--初始化块
java使用构造器来对单个对象进行初始化操作,使用构造器先完成整个java对象的状态初始化,然后将java对象返回给程序,从而让整个java对象的信息更加完整.与构造器作用非常类似的是初始化块,它也可 ...
- linkin大话面向对象--继承
[修饰符] class SubClass extends SuperClass 按照这种关系,我们把SuperClass类称为父类或基类,把SubClass称为子类或派生类或拓展类.extend ...
- linkin大话面向对象--GC和jar包
GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...
- linkin大话面向对象--内部类
内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...
- linkin大话面向对象--枚举
枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...
- linkin大话面向对象--抽象类
abstract [非private访问修饰符] 返回值类型 方法名称(参数列表); 当编写一个类时,我们往往会为该类定义一些方法,这些方法时用来描述该类的行为方式,那么这些方法都有具体的方法体. 但 ...
- linkin大话面向对象--包装类
Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢? 基本数据类型 包装类 byte Byte short Short int Int ...
随机推荐
- python py2与py3的编码问题
一:什么是编码 将明文转换为计算机可以识别的编码文本称为"编码".反之从计算机可识别的编码文本转回为明文为"解码". 那么什么是明文呢,首先我们从一段信息说起, ...
- 【转载】SSD 下的 MySQL IO 优化
一 目录 一 目录 二 背景 三 SSD 特性 四 基于 SSD 的数据库优化 五 A 项目 MySQL 主从关系图 六 程序切换之前调优 6.1 修改系统 IO 调度算法 6.2 修改 innodb ...
- 从蓝光到4K,腾讯视频高码率下载背后的技术
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 腾讯技术工程官方号 发布在云+社区 蓝光和4k视频正逐渐普及,4K视频峰值码率超10Mbit/s.架构平台部TVideo平台从资源,链路.缓 ...
- React Native 网络层分析
文:志俊(沪江Web前端) 本文原创,转载请注明作者及出处 在使用React Native开发中,我们熟练的采用JavaScript的方式发送请求的方式发送一个请求到服务端,但是处理这个请求的过程其实 ...
- TagHelper+Layui封装组件之Radio单选框
TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...
- 开发问题(一)在windows和linux端口占用问题
前言 今天在MyEclipse中使用tomcat发现tomcat端口8080竟然被占用了,所以就找了一下解决办法共参考! 在网络程序的调试过程中,经常发生一些出乎意料的事情,比如创建一个TCP服务失败 ...
- CTF---隐写术入门第三题 打不开的文件
打不开的文件分值:10 来源: 实验吧 难度:中 参与人数:2718人 Get Flag:1222人 答题人数:1276人 解题通过率:96% 咦!这个文件怎么打不开? 解题链接: http://ct ...
- Java异常抛出及try,catch应用实例
class lanpingException extends Exception { lanpingException(String msg) { super(msg); } } class maoy ...
- isupper()函数
isupper()函数可以用来判断字符c是否为大写英文字母! 原型:extern int isupper(int c); 头文件:ctype.h 功能:判断字符c是否为大写英文字母 说明:当参数c为大 ...
- hihoCoder 1039:字符消除(字符串处理)
#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...