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 插件 的互动来实现. 如需使用下列菜单,只需要在 ...
随机推荐
- 网络编程—代码—UDP数据报传输
UDP:数据报传输 1.接收端 public class Udps { //接收端 public static void main(String[] args) throws IOException ...
- PLSQL入门:cursor传参,loop fetch使用,if使用,单引号字符表示
1.cursor传入参数 定义:cursor [cursor变量名称]([参数名称] [参数类型]) IS [SQL语句,可以使用传入参数] 例子: cursor moTypeNames(dom ...
- Shell脚本实现每个工作日定时执行指定程序
我们可能会遇到这样的情景:必须在每个工作日定时执行Linux服务器上的某个程序.那么有没有办法实现这一功能呢?答案是肯定的.我们可以运用Shell脚本简单实现这一功能. 原理很简单,Shell脚本内部 ...
- 阿里云云主机swap功能设置实战案例
阿里云云主机swap功能设置实战案例 阿里云提供的云服务器(Elastic Compute Service,简称 ECS),是云主机的一种,当前采用的虚拟化驱动是Xen(这一点可以通过bios ven ...
- bzoj1056/1862 [Zjoi2006]GameZ游戏排名系统
题目链接:1,2 treap恶心题,不多说 #include<algorithm> #include<iostream> #include<cstdlib> #in ...
- P3313 [SDOI2014]旅行
P3313 [SDOI2014]旅行 树链剖分+动态线段树(并不是lct) 显然的,我们对于每一个宗教都要维护一个线段树. (那么空间不是爆炸了吗) 在这里引入:动态开点线段树 就是需要的点开起来,不 ...
- JQuery判断input是否被禁用
<script src="jquery.min.js"></script> <br/><input type="text&quo ...
- C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility
"数据结构"模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候,将这些特定数据结构封装在内部,在外部提供统一的接口, ...
- Unity3D之预设
预设的两个特性: 1.重用性.可以使我们快速方便的创建大量的重复性资源.这种创建是通过预设的实例化Instance操作来完成的 在Hierarchy视图中将实例物理添加到Assests中,此时图标 ...
- 20145205武钰《网络对抗》web安全基础实践
实验后问题回答 (1)SQL注入攻击原理,如何防御 攻击原理:SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的 防御手 ...