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语言中strcpy与strlen函数对字符串最后的'\0'的处理
对于strcpy来说,它会把字符串最后的‘\0’一起拷贝 对于strlen来说,它计算字符串长度的时候不会把最后的‘\0’计算进去
- kendo datetimepicker
@(Html.Kendo().DatePicker() .Name("yearCalendar") .Value(DateTime.Now) .Start(CalendarView ...
- mustache语法
mustache 模板,用于构造html页面内容.在实际工作中,当同一个模板中想要调用不同的函数来渲染画面,在已经自定义好了的前提下,可以在渲染页面时对传入的参数进行手动判断. 以下是学习笔记内容: ...
- linux下如何进入单用户模式
忘记密码时,我们可以通过进入单用户模式修改密码. 进入单用户模式的方式: 1. 启动服务器时,按 e 键进入引导选择界面.注意:可能需要多次按 e 键切换几个个界面后,才能进入选择界面. 2. 选择以 ...
- Linux基础命令---gunzip
gunzip 解压缩被gzip压缩过的文件.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 gunzip [-ac ...
- 基于GIT的管理
常用命令 git init : 初始化仓库git add 文件名 :把文件添加到暂存区git commit -m "操作记录" : 提交到仓库,设置相关操作的记录 git stat ...
- C++:struct和union 内存字节对齐问题
转自:http://blog.csdn.net/wangyanguiyiyang/article/details/53312049 struct内存对齐问题 1:数据成员对齐规则:结构(struct) ...
- Django框架----基础
一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...
- [转] Oracle学习之创建数据库(新建实例)
由于项目需求,在本机中开发,需要新建oracle数据库实例,亲测可以. 出处:http://blog.csdn.NET/luiseradl/article/details/6972217 http:/ ...
- centos 安装最新稳定版本docker
直接yum安装的docker版本是 : docker --versionDocker version 1.12.6, build 85d7426/1.12.6 一些新特性需要安装最新的稳定版本 国内可 ...