美文网首页
宅男知识大补丸 学多态 认包包

宅男知识大补丸 学多态 认包包

作者: 码思客 | 来源:发表于2018-09-03 10:04 被阅读0次

java零基础入门-面向对象篇(十)  多态

面向对象的三大特征,封装,继承我们讲完了,这次来讲多态。

多态就是指一个引用变量,在编译时和运行时类型不一样的情况。那我们首先就要搞清楚一个概念,什么是编译时,什么是运行时

其实这个概念我在最开始就讲过,还记不记得我们讲HelloWorld的时候,用命令行工具编译并且运行了一个java类。不记得的赶紧去复习(老规矩 从HelloWorld 开始吧)。

编译时,就是指java文件通过javac编译器,翻译成class文件的过程。这时候还没有开始执行方法,代码没有被加载到内存中,仅仅是做了一个翻译的动作。

运行时,是指程序申请了内存空间,将变量指向的对象放进内存,运行方法的动作。

为什么我们使用eclipse写代码的时候没见使用过javac这个编译器?

其实这就是使用工具写代码的好处,我们不需要手动操作编译的过程,但是我们经常在写代码的时候,工具在某行代码下面画了条红线,告诉我们这里无法编译通过,并且提示我们为什么,这就是在编译前,eclipse做的语法检查。

编译错误

那eclipse在什么时候编译java文件呢?我们看看eclipse背着我们做了些什么事

eclipse编译的时机

每次写完一段代码,这时eclipse会自动帮我们把写好的代码编译成class文件,而当我们完成了代码,点击运行的时候,这个时候所有的代码都被加载到内存中,这个时候就是运行时。

比如我们运行一个main方法的时候,所有的对象变量都在内存中待着,等候召唤,这个时候就是运行时。

搞清楚了编译时和运行时,我们继续来往下走。

什么是多态

首先我们举个例子帮助我们了解多态的概念。

有一天,你的女王大人说 我要买包包,但是他并没有具体说哪个牌子哪个款式,所以她说的只是一个概念,是父类

Bag bag;  你的女王大人给你定义了一个包,这是编译时。

我要买包包

圣旨已下,我们为了让她们开心,必须精挑细选。这里看好了三个包包,定义三个类,每个类都继承Bag类,有自己的价格和描述,最后给女王自己选。

女王只要包,没说具体要什么包,所以我们给的时候只能给包,这个包满足女王的条件即可。所以可以将具体的包(子类)看做是包(父类)的一种,换句话说,就是我们可以将子类看做是一种特殊的父类。

多态

当我们确定了两个类的父子关系以后,就可以将一个新创建的子类对象,赋值给父类变量。这时候我们注意看 queen.buyBag(XXX) 这段代码,同样一个对象 queen ,同样调用方法 buyBag ,却打印出了不同的结果,这就表现出了多态的特征。

这里要注意一点,多态是指子类重写了父类的方法后,展现出来的,而不包括成员变量,成员变量是不具备多态性的。

成员变量没有多态性

这是什么奇怪的规定?为什么方法具有多态的特征,而成员变量不具有多态的特征呢?

是不是又准备开始死记硬背了?说好的,我们要用理解代替死记硬背。

那么我就用内存图来解释这个奇怪的规定。

内存里的多态

通过内存图看多态,我们前面储备了足够的知识,如果你认真读过我前面的文章,看这个完全没压力。

内存图

为什么成员变量没有多态的特性?左边的图大家非常熟悉,就是一个普通的对象创建。

我们看右边,我们讲继承的时候说过,创建子类对象的时候,会自动获得父类的成员变量,会在内存中开辟空间,保存父类的成员变量,用super来访问他们。再看代码,左侧是父类的变量 bag_bv ,他指向哪?他指向子类对象的 super。

好了说到这,肯定又有同学要问,为啥指向super不是指向this?我很喜欢这种打破砂锅问到底的精神。

因为编译时,变量 bay_bv 是父类型,但是他并不知道 “将来” (运行时) 会指向何种子类型的对象,这时候你让他怎么去决定指向那个子类的变量?这不是强人所难么,所以他只能指向将来那个对象的super,通过super找到父类的成员变量,所以成员变量不具备多态的特征。

杠精还没下线,那为啥方法不指向父类的方法而是子类的重写的方法呢?

回答这个问题排除2个情况

1.父类没有describe方法,子类有describe方法,这个时候调用的就是子类的方法,没有发生多态。

2.父类有describe方法,子类没有describe方法,这个时候调用的是继承于父类的方法,没有发生多态。

最后就是,父类有方法,子类也有方法,这个时候子类重写了父类的方法。如果是父类变量保持子类对象地址,则发生多态。

发生多态时,就是我们上面讲解的概念,编译时编译的是父类的方法,运行时创建了子类的对象,是运行的子类方法

验证一下 编译时编译的是父类的方法(这里容易绕晕,还是验证一下)

编译时编译父类中方法

这个时候,首先运行代码左边,Bag bag_bv 这个时候,因为父类和子类都有方法  describe,所以父类完全可以在编译时就确定这个没有问题,编译通过,然后在运行时,使用 bag_bv 这个变量去调用子类的 describe方法,方法展现多态特征。

静态成员的多态规则

Bag bag_bv = new BottegaVeneta();

bag_bv.describe();

多态发生在对象调用方法的时候,而静态变量,静态方法属于类,如果 describe 是静态方法,那么使用对象调用方法和使用类调用方法是一样的

bag_bv.describe()    就是   Bag.describe()  

所以静态成员也没有多态,都是调用父类方法。

相关文章

  • 宅男知识大补丸 学多态 认包包

    java零基础入门-面向对象篇(十) 多态 面向对象的三大特征,封装,继承我们讲完了,这次来讲多态。 多态就是指一...

  • 1.9 多态基本概念

    本小节知识点: 【了解】什么是多态? 【掌握】多态的条件 【了解】多态的优点 1.什么是多态? 什么是多态:多态就...

  • 魔鬼搭讪学读后感

    魔鬼搭讪学看完了。 虽然这是一本介绍帮助宅男勾搭妹纸的书,但我觉得并不一定只针对宅男,宅女们也可以看看,也可以了解...

  • 2.0 多态的实现

    本小节知识点: 【掌握】如何实现多态 【了解】多态的原理 【掌握】多态的注意点 1.如何实现多态 Animal是父...

  • 2019-03-02泰山

    自从宝宝上了学以后假期越来越珍贵,加之爸爸是个宅男,出去玩耍更难安排。怎样能说动宅男爸爸出去玩呢?需要有一...

  • 日本电影《宅男之恋》: 深度宅男的恋爱故事

    宅男之恋 《宅男之恋》是关于宅男的恋爱故事的电影,男主是大龄宅男健太郎。 他在市政厅的档案部工作了13年,没有迟到...

  • 若宁说——神灯🚏(一)

    宅男有幸得到了神灯。 宅男:“神灯啊神灯,我想变成亿万富翁。” 神灯:“请充值。” 宅男:“??????” 神灯:...

  • 宅男

    不知道从什么时候开始,自己一不小心变成一个结结实实的中年宅男。 不想出去,怕毒辣的阳光,怕受各种异样的目光和刺激。...

  • 宅男

    某人,超级宅男,每次在我张罗出游时都是一句:这地方有什么好玩的。一起出游的次数少的可怜,一次是台湾,一次是意大利。...

  • 宅男

    宁可居无妻,不可不学习。 无妻会寂寞,不学更难受。 ...

网友评论

      本文标题:宅男知识大补丸 学多态 认包包

      本文链接:https://www.haomeiwen.com/subject/veptwftx.html