V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
V2EX  ›  nguoidiqua  ›  全部回复第 69 页 / 共 75 页
回复总数  1485
1 ... 61  62  63  64  65  66  67  68  69  70 ... 75  
如果你非要说父类的字段我就是不要改,我就是要两个字段同时存在并打印子类新声明的同名字段,那只能重写 show,虽然一模一样……

如果你只是想要子类打出和父类不一样的值,那给字段赋值的方法很多,最简单的就是在初始化代码块里面赋值,就写两个大括号而已,不要声明,直接赋值。

class Son extends Father {
{
this. name = "son";
}
}

其实 PHP 和 Java 的继承机制不同的,我试了下把你这个 PHP 例子里面 Father 的 name 字段直接去掉,子类依然可以正常调用 show 方法,倒是 Father 自己调会报错。我感觉 PHP 的继承好像就是把父类的字段和方法直接 include 到子类里面去,和 Java 完全不一样的。

老实说,比起它们这两者,我更喜欢 GO 那种面向对象的实现方式。
多态的意义是同一个方法可以由子类进行不同的实现,然后用父类调用的时候可以表现不同的形态。

所以你这个例子本身就体现不了多态的意义,能表现的只有继承机制的意义。

你是想 show 的时候显示子类赋值的名字而已,那你直接给 name 字段改个值就是了,Java 声明并赋值和单纯赋值是有区别的,这跟 PHP 不一样。

你去反编译下 class 文件看看就知道了,如果子类没有重写父类方法的话,实际上子类是没有这个方法的,它会去引用的父类方法,字段也是如此的,没有声明的话就是没有这个字段。它运行时会先从自身寻找方法或字段,找不到就去上级类找。而父类那个 show 方法,编译后它会把参数改成 this.name,所以它打印的是一定是它自身的 name 字段。

现在你没有去改 super.name 的值,你是在子类这层新声明了一个新的 name 字段,你赋值的时候,改的只是子类这层的字段,父类不会变的。如果你没有声明新字段,而是直接赋值 this.name = "son",那么由于子类是没有这个字段的,它就回去往上找这个字段,找到父类有这个字段,然后改成 ” son “,这就能达到了你的目的。
2019 年 8 月 10 日
回复了 Leigg 创建的主题 剧集 哪吒好看吗,看了好多公众号说十年磨一剑
你看下国产票房第一不就知道了,国内现在是稍微好点的电影都要吹上天,太饥渴了。
这倒是和本人想到一块去了,希望谁来搞个方言把$->什么的去掉,加上静态类型,整合下 swoole 什么的。
1 ... 61  62  63  64  65  66  67  68  69  70 ... 75  
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   968 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 19:44 · PVG 03:44 · LAX 12:44 · JFK 15:44
♥ Do have faith in what you're doing.