Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点
一、特点
1,成员变量。
编译和运行都参考等号的左边。
覆盖只发生在函数上,和变量没关系。
Fu f = new Zi();
System.out.println(f.num);//是父类,答案是3
2,成员函数(非静态)。
编译看左边,运行看右边。
因为成员函数存在覆盖特性。
Fu f = new Zi();//
f.show();
输出的是子类里面的show方法
3,静态函数。
编译和运行都看左边。
静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉及对象。
Fu f = new Zi();//
f.show();
这里最后输出的是父类的show里面的内容。
Zi z = new Zi();//
z.show();
输出的是子类里面的show
二、实例
/*
多态时,
成员的特点:
1,成员变量。
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。哦了。
作为了解。
覆盖只发生在函数上,和变量没关系。
Fu f = new Zi();
System.out.println(f.num);//是父类,答案是3
没根据f的值(子类对象的地址)去找,而是根据f的类型去找。
开发时不可能出现这样的情况,我父类有了,我子类就直接拿来用了,而且用的时候一般都已经向下转型了。 2,成员函数(非静态)。
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。 因为成员函数存在覆盖特性。
Fu f = new Zi();//
f.show();
输出的是子类里面的show方法
依赖的是对象,有对象才有成员函数,必须动态的绑定到指定的对象上,所以运行的时候是看子类,而编译的时候检查语 法错误,所以编译的时候检查父类,所以看父类。
编译检查语法错误,运行时根据引用指向的地址运行。 3,静态函数。
编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
简单说,编译和运行都看左边。 其实对于静态方法,是不需要对象的。直接用类名调用即可。
Fu f = new Zi();//
f.show();
这里最后输出的是父类的show里面的内容,因为静态成员不需要对象,直接是被类名指向,都指向存静态方法的方法区, 而那个里面存的就是父类的show。
Zi z = new Zi();//
z.show();
这里的zi是继承fu的,show方法是静态的
输出的是子类里面的show
其实可以理解为静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉及对象
父类对象引用,就是指向父类的静态函数
子类对象引用,就是指向子类的对象函数 */ class Fu
{
// int num = 3;
void show()
{
System.out.println("fu show");
} static void method()
{
System.out.println("fu static method");
}
} class Zi extends Fu
{
// int num = 4;
void show()
{
System.out.println("zi show");
} static void method()
{
System.out.println("zi static method");
}
} class DuoTaiDemo3
{
public static void main(String[] args)
{
Fu.method();
Zi.method();
//这个的实质是父类对象指向子类引用,就是有点像指针,f的值是子类对象的地址。
Fu f = new Zi();//
// f.method();//输出是父类的静态
// f.show();//编译的时候检查的是父类,运行的时候以子类为主,show被覆盖,运行的子类的show
//输出是子类的show,
// System.out.println(f.num);//是父类,答案是3 // Zi z = new Zi();
// System.out.println(z.num);//是子类,答案是4
}
}
三、内存储存分析
Fu f = new Zi();
Fu f 在栈中定义了一个引用,也就是指针。
new Zi() 在堆中定义了一个对象,只不过这个对象有父类的那一部分成员。
1、如果用子类引用指向这个对象,全部访问的是子类的。
2、如果用父类引用指向这个对象,全部访问的是这个对象里面父类的,只不过父类函数被覆盖,所以导致成员是父类,函数时子类的。
肯定是根据指针类型去访问要访问的东西。猫肯定要去吃猫粮,狗才去吃狗粮。
Java基础十二--多态是成员的特点的更多相关文章
- Java基础(十二)--clone()方法
Clone在Java中就是用来复制对象,通过分配一个和源对象相同大小的内存空间,然后创建一个新的对象,那么他和=的区别在哪? 通过=实现对象拷贝: @Data @NoArgsConstructor @ ...
- java基础(十二 )-----Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到 ...
- Java基础(十二)之包和权限访问
软件包 软件包解决了两个类名字一样的问题.软件包就是一个"文件夹". 包名的命名规范:1.要求所有字母都小写:2.包名一般情况下,是你的域名倒过来写.比如baidu.com,pac ...
- Python基础(十二) 类私有成员和保护成员
python中的protected和private python中用 _var :变量名前一个下划线来定义,此变量为保护成员protected,只有类及其子类可以访问.此变量不能通过from XXX ...
- java基础十二[集合与泛型](阅读Head First Java记录)
集合 List 知道索引顺序的集合,ArrayList.LinkedList.Vector三个子类实现了List接口 ArrayList ArrayList没有排序方法,可以用Collection ...
- “全栈2019”Java第九十二章:外部类与内部类成员覆盖详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java实习生常规技术面试题每日十题Java基础(二)
目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...
- Java基础十--接口
Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...
- Bootstrap <基础十二>下拉菜单(Dropdowns)
Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...
随机推荐
- C++矩阵库 Eigen 快速入门
最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...
- Python: 列表推导式--轻量级循环
定义: 列表推导式(list comprehension)是利用其他列表创建新列表的一种方法,其工作方式类似于for循环,对列表进行过滤变种操作 eg1: >>> [x*x for ...
- Java设计模式应用——过滤器模式
storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中. 实际上,中间告警结果可能 ...
- SpringMVC中controller返回图片(转)
本文转自:http://blog.csdn.net/u011637069/article/details/51112187 SpringMVC中controller通过返回ModelAndView然后 ...
- Js基础知识7-JavaScript所有内置对象属性和方法汇总
对象什么的,程序员可是有很多呢... JS三大对象 对象,是任何一个开发者都无法绕开和逃避的话题,她似乎有些深不可测,但如此伟大和巧妙的存在,一定值得你去摸索.发现.征服. 我们都知道,JavaScr ...
- 02: python3使用email和smtplib库发送邮件
1.1 发送qq邮箱 注:python代理登录qq邮箱发邮件,是需要更改自己qq邮箱设置的.在这里大家需要做两件事情:邮箱开启SMTP功能 .获得授权码 教程链接 1.给单个人发邮件 参考 from ...
- phpstorm怎么设置每个function都用那条横线隔开
- 20145304 网络对抗技术 逆向与Bof基础
20145304 网络对抗技术 逆向与Bof基础 实践目标 学习以下两种方法,运行正常情况下不会被运行的代码: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的 ...
- Spring DBCP用xml和properties2种格式配置DataSource
Spring提供数据库连接池:DBCP配置DataSource并且获取连接完成数据库操作: Spring帮助文档的地址: http://static.springsource.org/spring/d ...
- Package libvirt was not found in the pkg-config search path
关于pip安装libvirt-python的时候提示Package libvirt was not found in the pkg-config search path的问题解决方法 1.一开始以为 ...