第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

手掌心 2019-06-06 15:51:44
為什么Super.method();在Java中是不允許的?我讀這個(gè)問題并認(rèn)為,如果一個(gè)人能寫到,那么這個(gè)問題就會(huì)很容易解決(不是說沒有它就解決不了):@Overridepublic String toString() {     return super.super.toString();}我不確定它在很多情況下是否有用,但我想知道為什么如果這樣的東西存在于其他語言中的話,它是不存在的。你們覺得怎么樣?編輯:澄清一下:是的,我知道,這在Java中是不可能的,我并不是真的想念它。這不是我所期望的工作,我很驚訝地看到一個(gè)編譯器錯(cuò)誤。我剛想到這個(gè)主意,想討論一下。
查看完整描述

3 回答

?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

這違反了封裝。您不應(yīng)該能夠繞過父類的行為。有時(shí)繞開你的自己類的行為(特別是在同一方法中),而不是您的父類。例如,假設(shè)我們有一個(gè)基本的“項(xiàng)集合”,一個(gè)表示“紅色項(xiàng)集合”的子類,以及一個(gè)表示“大型紅色項(xiàng)集合”的子類。合理的做法是:

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總是可以確信它包含的項(xiàng)目都是紅色的?,F(xiàn)在假設(shè)我們都是能夠調(diào)用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);
    }}

現(xiàn)在我們可以添加任何我們喜歡的內(nèi)容,以及RedItems都?jí)牧恕?/trans>

這有道理嗎?


查看完整回答
反對(duì) 回復(fù) 2019-06-06
?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

在大多數(shù)情況下,我認(rèn)為下面的代碼允許使用超級(jí).方法()。(即使這么做很狡猾)

總之

  1. 創(chuàng)建祖先類型的臨時(shí)實(shí)例
  2. 將字段的值復(fù)制到

    原版

    對(duì)象改為臨時(shí)對(duì)象。
  3. 對(duì)臨時(shí)對(duì)象調(diào)用目標(biāo)方法
  4. 將修改后的值復(fù)制回原始對(duì)象

用法:

public class A {
   public void doThat() { ... }}public class B extends A {
   public void doThat() { /* don't call super.doThat() */ }}public class C extends B {
   public void doThat() {
      Magic.exec(A.class, this, "doThat");
   }}public class Magic {
    public static <Type, ChieldType extends Type> void exec(Class<Type> oneSuperType, ChieldType instance,
            String methodOfParentToExec) {
        try {
            Type type = oneSuperType.newInstance();
            shareVars(oneSuperType, instance, type);
            oneSuperType.getMethod(methodOfParentToExec).invoke(type);
            shareVars(oneSuperType, type, instance);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private static <Type, SourceType extends Type, TargetType extends Type> void shareVars(Class<Type> clazz,
            SourceType source, TargetType target) throws IllegalArgumentException, IllegalAccessException {
        Class<?> loop = clazz;
        do {
            for (Field f : loop.getDeclaredFields()) {
                if (!f.isAccessible()) {
                    f.setAccessible(true);
                }
                f.set(target, f.get(source));
            }
            loop = loop.getSuperclass();
        } while (loop != Object.class);
    }}


查看完整回答
反對(duì) 回復(fù) 2019-06-06
  • 3 回答
  • 0 關(guān)注
  • 950 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)