猿问

为什么Super.method();在Java中是不允许的?

为什么Super.method();在Java中是不允许的?

我读这个问题并认为,如果一个人能写到,那么这个问题就会很容易解决(不是说没有它就解决不了):

@Overridepublic String toString() {
    return super.super.toString();}

我不确定它在很多情况下是否有用,但我想知道为什么如果这样的东西存在于其他语言中的话,它是不存在的。

你们觉得怎么样?

编辑:澄清一下:是的,我知道,这在Java中是不可能的,我并不是真的想念它。这不是我所期望的工作,我很惊讶地看到一个编译器错误。我刚想到这个主意,想讨论一下。


手掌心
浏览 933回答 3
3回答

慕村9548890

这违反了封装。您不应该能够绕过父类的行为。有时绕开你的自己类的行为(特别是在同一方法中),而不是您的父类。例如,假设我们有一个基本的“项集合”,一个表示“红色项集合”的子类,以及一个表示“大型红色项集合”的子类。合理的做法是:public class Items{     public void add(Item item) { ... }}public class RedItems extends Items{     @Override     public void add(Item item)     {         if (!item.isRed())         {             throw new NotRedItemException();         }         super.add(item);     }}public class BigRedItems extends RedItems{     @Override     public void add(Item item)     {         if (!item.isBig())         {             throw new NotBigItemException();         }         super.add(item);     }}这很好-RedItems总是可以确信它包含的项目都是红色的。现在假设我们都是能够调用Super.add():public class NaughtyItems extends RedItems{     @Override     public void add(Item item)     {         // I don't care if it's red or not. Take that, RedItems!         super.super.add(item);     }}现在我们可以添加任何我们喜欢的内容,以及RedItems都坏了。这有道理吗?

偶然的你

在大多数情况下,我认为下面的代码允许使用超级.方法()。(即使这么做很狡猾)总之创建祖先类型的临时实例将字段的值复制到原版对象改为临时对象。对临时对象调用目标方法将修改后的值复制回原始对象用法:public&nbsp;class&nbsp;A&nbsp;{ &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doThat()&nbsp;{&nbsp;...&nbsp;}}public&nbsp;class&nbsp;B&nbsp;extends&nbsp;A&nbsp;{ &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doThat()&nbsp;{&nbsp;/*&nbsp;don't&nbsp;call&nbsp;super.doThat()&nbsp;*/&nbsp;}}public&nbsp;class&nbsp;C&nbsp;extends&nbsp;B&nbsp;{ &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doThat()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Magic.exec(A.class,&nbsp;this,&nbsp;"doThat"); &nbsp;&nbsp;&nbsp;}}public&nbsp;class&nbsp;Magic&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;<Type,&nbsp;ChieldType&nbsp;extends&nbsp;Type>&nbsp;void&nbsp;exec(Class<Type>&nbsp;oneSuperType,&nbsp;ChieldType&nbsp;instance, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;methodOfParentToExec)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&nbsp;=&nbsp;oneSuperType.newInstance(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shareVars(oneSuperType,&nbsp;instance,&nbsp;type); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oneSuperType.getMethod(methodOfParentToExec).invoke(type); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shareVars(oneSuperType,&nbsp;type,&nbsp;instance); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;RuntimeException(e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;<Type,&nbsp;SourceType&nbsp;extends&nbsp;Type,&nbsp;TargetType&nbsp;extends&nbsp;Type>&nbsp;void&nbsp;shareVars(Class<Type>&nbsp;clazz, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SourceType&nbsp;source,&nbsp;TargetType&nbsp;target)&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class<?>&nbsp;loop&nbsp;=&nbsp;clazz; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Field&nbsp;f&nbsp;:&nbsp;loop.getDeclaredFields())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!f.isAccessible())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.set(target,&nbsp;f.get(source)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;=&nbsp;loop.getSuperclass(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(loop&nbsp;!=&nbsp;Object.class); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP

相关分类

Java
我要回答