java父包引用_父类引用指向子类对象(java)

从对象的内存角度来理解试试.

假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.

现在通过代码来看看内存的分配情况:

Father f = new Father();//系统将分配1M内存.

Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.

Son s1 = s;//s1指向那1.5M的内存.

Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).

Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.

Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

示例:

class Father{

void print(){};

}

class Son extends Father{

void print(){System.out.println("子类中!");}

void show(){System.out.println("show 中!");}

}

class Demo{

public static void main(String args[]){

Father obj=new Son();

obj.print();

obj.show();  //这个调用会报错!

}

}

1 .如果你想实现多态,那么必须有三个条件,父类引用,子类对象,方法覆盖你这里如果Fathor类有一个show()方法,那么形成方法覆盖,那么此时就可以这么写:obj.show(),此刻形成了多态.

2. 没有方法覆盖,那你这里只能解释为父类引用去访问一个子类的方法,当然,父类引用没有这么大范围的权限,当然会报错

PS:多态实际上是一种机制,在编译时刻,会生成一张虚拟表,来记录所有覆盖的方法,没有被覆盖的方法是不会记录到这张表的.若一个父类引用调用了没有覆盖的子类方法,那么是不符合该表的,那么编译时刻就会报错. 在执行程序的时候,虚拟机会去这张虚拟表中找覆盖的方法,比如引用中实际上存的是一个子类对象引用,那么就会去找子类中的相应的覆盖的方法来执行

定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中

没有的方法,它是无可奈何的;

同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

看下面这段程序:

class Father{

public void func1(){

func2();

}

//这是父类中的func2()方法,因为下面的子类中重写了该方法

//所以在父类类型的引用中调用时,这个方法将不再有效

//取而代之的是将调用子类中重写的func2()方法

public void func2(){

System.out.println("AAA");

}

}

class Child extends Father{

//func1(int i)是对func1()方法的一个重载

//由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用

//所以在下面的main方法中child.func1(68)是不对的

public void func1(int i){

System.out.println("BBB");

}

//func2()重写了父类Father中的func2()方法

//如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法

public void func2(){

System.out.println("CCC");

}

}

public class PolymorphismTest {

public static void main(String[] args) {

Father child = new Child();

child.func1();//打印结果将会是什么?

}

}

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

那么该程序将会打印出什么样的结果呢?

很显然,应该是“CCC”。

变量是不存在重写覆盖的!

public class A { int a = 1; }

public class B extends A { int a = 2; }

测试类里调用了这个方法void compare(){

if(super.a == this.a)

System.out.println("not overrided");

else

System.out.println("overrided");}

控制台出来的是overrided

类中的属性是没有多态性的,即你在引用上面使用属性时,系统只会去找引用的静态类型中的那个属性,而与它的实际类型无关。

静态方法也是没有多态性的。

引自:百度文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技角逐:中美的人工智能布局

来源:人机与认知实验室2017年以来,与人工智能相关的国家级战略密集出台,社会关于人工智能的大讨论激烈展开,各国政府关于人工智能发展的思路也逐渐清晰。中美作为两大科技强国,都在人工智能领域投入巨大,有…

python中scale_Python中的Log-scale mathplotlib?

我试图拟合对数正态曲线,但我不知道如何将y(和x轴)更改为对数刻度?我尝试使用logspace而不是linspace,但是遇到了一个错误OverflowError: cannot convert float infinity to integer我试过了:^{pr2}$但这似乎也不管用。我附上了我…

akka kafka java_当使用websocket连接时,使用akka-stream-kafka从kafka主题获取最后一条消息...

使用David van Geest非常巧妙地描述的方法,我能够避免在客户端连接时获取任何上游数据here归结为在Consumer上有一个BroadcastHub:val liveSource Consumer.plainSource(consumerSettings, Subscriptions.topics(topic1, topic2)).map(kafkaObject >…

android px,dp,sp大小转换工具

package com.voole.playerlib.util;import android.content.Context;/*** Android大小单位转换工具类<br/>* * float scale context.getResources().getDisplayMetrics().density;*/ public class DisplayUtil {/*** 将px值转换为dip或dp值&#xff0c;保证尺寸大小不变…

工业物联网的应用领域与方向

&#xff08;图片来自pixabay&#xff09;来源&#xff1a;OFweek工控从一定程度上&#xff0c;物联网可以说是个“旧瓶装新酒”的概念&#xff0c;提出物联网——IoT&#xff08;Internet of things&#xff09;这个概念的确是一种创新&#xff0c;但是要把这个创新与传统的M2…

mysql count里面能加条件吗_select count(1) 和 count(*),哪个性能更好?

相信很多小伙伴都想了解 count(1) 和 count(*) 的性能问题 &#xff0c;今天给大家做一下测试。声明&#xff1a;本文使用MySql数据库&#xff0c;数据库表里面有100万条数据。先测试 count(*)可以看出&#xff0c;count(*) 用时间差不多15s.再测试 count(1)看到这个数据&#…

PDA 收银系统PDA手持打印扫描枪 销售开单 收银 扫描打印一体机

在零售方面也有很好的应用。如在一些高端品牌零售店,营业员可以随身导购&#xff0c;一站式完成了商品销售和收银&#xff0c;很是受消费者追捧&#xff0c;符合了企业对客户体验以及行业领先的追求。 PDA收银系统是一款多功能可以取代专业收银机的收银系统&#xff0c;适合各种…

如何获取投票提交地址_简单实用 | 2019全国医院擂台赛投票攻略(县域版)

作者&#xff1a;用户大当家2019改善医疗服务行动全国医院擂台赛案例征集环节结束。截止8月15日24时&#xff0c;城市组提交案例2196个&#xff0c;县域组提交案例1087个&#xff0c;总计3283个案例&#xff0c;数量再度创纪录。首先为积极改善医疗服务的您点赞。接下来&#x…

java 16 binary_【图片】【困扰】java(tm) platform se binary 已停止工作该如何是好【minecraft吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Completely ignored arguments: [--nativeLauncherVersion, 307][18:26:56] [Client thread/INFO]: Setting user: XXX[18:26:58] [Client thread/WARN]: Skipping bad option: lastServer:[18:26:58] [Client thread/INFO]: LWJGL…

菲尔兹奖数学家丘成桐:人工智能中的数学理论尚无很大突破

来源&#xff1a;机器人10月17日&#xff0c;在2019中关村论坛上&#xff0c;菲尔兹奖首位华人获得者、美国国家科学院院士、哈佛大学教授丘成桐发表主旨演讲。他呼吁国家应重视基础科学和数学的发展。一个国家的强大和长治久安&#xff0c;离不开强大的基础科学&#xff0c;没…

python定义类时括号_为什么在定义类时括号是可选的,而在定义函数时括号是必需的?...

我认为你的问题的答案只是语法。这正是Python的设置方式&#xff0c;但我对它的设置方式的看法是&#xff1a;我认为函数来自数学&#xff0c;比如&#xff1a;f(x) x所以当计算机编程语言被创造出来的时候&#xff0c;从模拟数学到编程语言似乎有某种逻辑上的连续性。另一方面…

java bean set_JavaBean自动生成get和set方法

android计算每个目录剩余空间丶总空间以及SD卡剩余空间ublic class MemorySpaceCheck { /** * 计算剩余空间 * param path * return */ public static String getAvail ...ionic&plus;angularjs开发hybrid App&lpar;环境配置&plus;创建测试项目&rpar;本文使用的…

从地心到宇宙,再到治疗癌症与“赋灵”智能,这届腾讯WE都聊了些啥?

来源&#xff1a;腾讯科学WE大会Hod Lipson这人是谁————哥伦比亚大学创意机器实验室主任&#xff0c;致力于开发机器人的创造力&#xff0c;让机器人拥有自己的思想和情感。说了些啥————大概100年来我们一直试图建造有自我意识的机器人&#xff0c;我们希望这些机器人…

复制文件,并重命名

总体思路&#xff1a;1. 先复制文件到指定目录下&#xff1b; 2. 根据需要&#xff0c;修改文件名称。 &#xff08;1&#xff09;复制文件 实现代码&#xff1a; 例如&#xff1a;把“D:\照片”目录下的文件复制到“D:\姓名”目录下。 /** * 描述&#xff1a;复制文件 到 目标…

python计算入门_Python入门教程02-01(计算机核心基础)

python入门课程第二章-计算机核心基础Python入门教程01-01(ATM购物车)学习过后&#xff0c;我们需要了解一下计算机的核心基础&#xff0c;目标就是为了让后面更好的理解python这门语言&#xff0c;更容易接受后续新的课程难点。下面我们来一起学习第二章吧~~~~一 引子:接下来一…

php字符串反转abcdefg_php中实现字符串翻转的方法

字符串:$str "abcdefg";方法一(直接使用php自带函数strrev($str))print_r(strrev($str));使用for循环方式,str_split($str)$newArrOne [];//初始化一个新的数组$newStrOne ;//初始化一个新的字符串$newArrOne str_split($str);$arrCount count($newArrOne);for …

RISC-V浪潮来袭!115页PPT超详论述,如何与ARM争锋!(一)

来源&#xff1a;芯潮近两年来&#xff0c;在ARM和Intel主导的竞争格局中&#xff0c;一个新的开源指令集架构RISC-V在芯片江湖声名鹊起。面对来势汹汹的AI和IoT浪潮&#xff0c;RISC-V提供了一种高能效低成本解决方案&#xff0c;吸引了谷歌、高通、IBM、镁光、西部数据、三星…

redisb并发访问慢出现的问题

最近项目一上线&#xff0c;就问题颇多&#xff0c;本地测试&#xff0c;ok&#xff0c;上线后&#xff0c;大用户量的时候&#xff0c;顶不住。用了一个礼拜的时间发现的问题&#xff0c;总结下来。 项目是netty4.0&#xff0c;reids2.8,nginx等框架。目前是4台proxy服务器&am…

python idle运行anaconda_在Python IDLE 下调用anaconda中的库教程

大家都知道&#xff0c;Anaconda是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。下载了anaconda我们可以很方便的随时调用这里面的库。原先我自己在Python官网下载了python 3.7开发环境&#xff0c;anaconda的后面下载的&#xff0c;…

php知识点_PHP那些琐碎的知识点(整理)

PHP不会检查单引号 字符串中变量内插或(几乎)任何转义序列&#xff0c;所以采用单引号这种方式来定义字符串相当简单快捷。但是&#xff0c;双引号 "" 则不然&#xff0c;php会检查字符串中的变量或者转义序列&#xff0c;并输出变量和转义序列的值。$a "123&…