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 ...
随机推荐
- GBK,UNICODE,GB2312,UTF-8学习总结
转自http://www.cnblogs.com/pannengzhi/p/5678495.html UNICODE,GBK,UTF-8区别 前言 其实这是个老生常谈的问题了,相信大家在第一次遇到Un ...
- 跟我一起读postgresql源码(九)——Executor(查询执行模块之——Scan节点(上))
从前面介绍的可优化语句处理相关的背景知识.实现思想和执行流程,不难发现可优化语句执行的核心内容是对于各种计划节点的处理,由于使用了节点表示.递归调用.统一接口等设计,计划节点的功能相对独立.代码总体流 ...
- 读汤姆大叔《JavaScript变量对象》笔记
一段简单的JavaScript代码思考 先看一段简单的代码,打印结果是??为什么why?? 从上述打印结果不难看出,在打印基本变量num.函数表达式fn.函数声明fun时,就已经知道变量num.函数表 ...
- 大数据分析中Redis怎么做到220万ops
大数据时代,海量数据分析就像吃饭一样,成为了我们每天的工作.为了更好的为公司提供运营决策,各种抖机灵甚至异想天开的想法都会紧跟着接踵而来!业务多变,决定了必须每天修改系统,重新跑数据,这就要求极高的海 ...
- 【转】Nginx SSL_PROTOCOL_ERROR 问题
转自:https://maoxian.de/2017/12/1471.html 这两天在检查一台 Nginx 配置的时候,遇到了一个极端诡异的问题.一段很通用的配置,配在这个服务器上,就会 100% ...
- Machine Learning - week 4 - Non-linear Hypotheses
为什么计算机图像识别很难呢?因为我们看到的是汽车,而计算机看到的是表示颜色的 RGB 数值.计算机需要根据这些数值来判断. 如果图片是 50 * 50 像素,那么一共有 2500 个像素点.如果是 Q ...
- BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
2748: [HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2010 Solved: 1260[Submit][Statu ...
- 2017广东工业大学程序设竞赛B题占点游戏
Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...
- poj_2503(map映射)
题目链接poj2503 Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 38820 Accepted: ...
- 克鲁斯卡尔(Kruskal)算法求最小生成树
/* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...