java中的上转型解释(多态的另一种)
我们先来看个例子:
public class Polymorphism extends BaseClass{
public String book="轻量级j2ee教程";
public void sub()
{
System.out.println("子类的普通方法");
}
public void test()
{
System.out.println("子类覆盖父类的方法!");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BaseClass base=new BaseClass();
System.out.println(base.book);
base.test();
base.base();
Polymorphism subclass=new Polymorphism();
System.out.println(subclass.book);
subclass.test();
subclass.sub();
//test是上转型对象
BaseClass test=new Polymorphism();
//通过引用类型访问变量,只会访问到编译时类型定义的变量,而不会访问执行时定义的变量
System.out.println(test.book);
/**
* test对象的引用类型是BaseClass 但是执行类型是Polymorphism
* 编译阶段只能调用其编译类型所具备的方法,但是运行时则执行它运行时类型所具有的方法
*/
test.base(); //子类没有对应的方法(实际上子类已经继承了父类的base方法),直接调用父类的base方法
test.test(); //子类有覆盖父类的test方法,执行时,直接调用子类的test方法
}
}
class BaseClass
{
public int book=6;
public void base()
{
System.out.println("父类的普通方法");
}
public void test()
{
System.out.println("父类被覆盖的方法!");
}
}
执行结果:
6
父类被覆盖的方法!
父类的普通方法
轻量级j2ee教程
子类覆盖父类的方法!
子类的普通方法
6
父类的普通方法
子类覆盖父类的方法!
从上面的例子可以看出:
对于上转型对象test这个引用类型而言:存在两种类型情况(1,编译时类型 2,运行时类型)
诚然:在编译时,test是BaseClass类型,但是在运行时test是Polymorphism 类型。
对于这种上转型变量而言:在编译的过程中,他只会调用BaseClass中的方法,但是运行时,他会调用Polymorphism 中的方法(包括从父类继承的方法)!
这种上转型,也是多态中的一种!
啥叫多态??
相同类型的变量,调用同意方法时呈现出不同的行为特征,这就会多态(最经常接触的就是:统一方法名,对应不同的参数个数或者参数类型)
java中的上转型解释(多态的另一种)的更多相关文章
- java中的上转型对象
1. 定义 如果B类是A类的子类或间接子类,当用B类创建对象b并将这个对象b的引用赋给A类对象a时,如: A a;a = new B();ORA a;B b = new B();a = b; 通俗的说 ...
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- Java中FTPClient上传中文目录、中文文件名乱码问题解决方法【好用】
转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录 ...
- java中的自动转型的学习理解
java当中的继承是和c++中的继承类似,只是java中的继承时的父类只能有一位. 我们今天在这里讲的是关于java中的自动转型的理解:顾名思义,自动转型值得就是使用时自动的将自身的类型进行转化. 自 ...
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- 【Java基本功】一文了解Java中继承、封装、多态的细节
本节主要介绍Java面向对象三大特性:继承 封装 多态,以及其中的原理. 本文会结合虚拟机对引用和对象的不同处理来介绍三大特性的原理. 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来 ...
- Java中 接口是如何实现多态的特性的
Java中多态是个很难理解的概念,但同时又是非常重要的概念,Java三大特性(封装.继承.多态)之一,我们从字面上理解,就是一种类型的多种状态,一下通过卖小汽车的例子再次说明什么是多态,其中利用到了接 ...
- Java中的final具体解释以及用途实战
浅析Java中的finalkeyword 谈到finalkeyword,想必非常多人都不陌生.在使用匿名内部类的时候可能会经经常使用到finalkeyword. 另外.Java中的String类就是一 ...
- java中封装,继承,多态,接口学习总结
### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...
随机推荐
- combiner中使用状态模式
mapreduce中的combine过程 hadoop的map过程执行完成后,每一个map都可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,减少在map和reduce ...
- MySql——查询题目练习
本次查询我们基于这几张表查询 ***********查询练习********** 1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,cl ...
- linux加程序是否当掉检测脚本
cd $(dirname $) source ~/.bash_profile SYSTEM_TIME=`date '+%Y-%m-%d %T'` count=`ps -ef |grep "p ...
- C++中的运算符重载练习题
1.RMB类 要求: 定义一个RMB类 Money,包含元.角.分三个数据成员,友元函数重载运算符‘+’(加) 和 ‘-’(减),实现货币的加减运算 例如: 请输入元.角 分: ...
- 使用C#书写SQLite数据库增删改查语句(以及插入byte[]时遇到的问题总结)
在没有使用SQLite这种轻量级的数据库之前,只使用过Sqlserver2008进行数据的增删改查,公司使用的是大型的ORACLE数据库,还没有真正的会使用它.那时候觉得数据库很庞大,然而遇到SQLi ...
- Linux 入门知识一(附上如何解决Ubuntu的root密码问题)
.centos有拥有七个控制台,其中第一到第六个是字符界面,第七个是图形界面 切换的快捷键是ctrl+shift+fn(n为自然数) 输入tty的话,可以检查当前处于哪个控制台 如何在cent ...
- C++中float类型的存储
C++中float用32位来表示,f = (-1)^S * T * 2^E,S是符号位,T是尾数,E是指数 首先我们把f表示成科学计数法的形式,然后再写出其在内存中的表示,在这里T写成1.XXX的形式 ...
- .NET高级工程师逻辑面试题
1.面试题 有5座连续相邻的房子,并且每个房子有同的颜色:蓝色,绿色,红色,白色和黄色 每间房子的主人有不同的国籍:英国.印尼.德国.美国和荷兰 每个人喝不同的饮料:葡萄汁.咖啡.牛奶.茶和水 每个人 ...
- Gouraud Shading
[Gouraud Shading] Gouraud Shading (高洛德着色/高氏着色) 这种着色的效果要好得多,也是在游戏中使用最广泛的一种着色方式.它可对3D模型各顶点的颜色进行平滑.融合处理 ...
- Java核心技术-接口、lambda表达式与内部类
本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...