recherche

Maison  >  Questions et réponses  >  le corps du texte

java - 关于内部类继承另一个类的内部类

最近看《Thinking in Java》,关于内部类的继承那一章。
其中有一个练习:

“创建一个包含内部类的类,此内部类有一个非默认的构造器(需要参数的构造器)。创建另一个包含内部类的类,此内部类继承自第一个内部类。”

下面是书中给出的代码:

class FirstOuter {
    public class FirstInner {
        FirstInner(String s) {
            System.out.println("FirstOuter.FirstInner() " + s ); 
        }
    }
}
public class SecondOuter {
    public class SecondInner extends FirstOuter.FirstInner {
        SecondInner(FirstOuter x) { 
            x.super("hello"); 
            System.out.println("SecondOuter.SecondInner()"); 
        }        
    }
    public static void main(String[] args) {
        FirstOuter fo = new FirstOuter();
        SecondOuter so = new SecondOuter();
        SecondInner si = so.new SecondInner(fo);        
    }    
}

我的疑惑是这里,x.super("hello"); ,为什么是调用另一个外部类的super(),而且传入的是所继承的内部类的构造器所需要的参数,我搜索了一下没有找到相关的解释,这是固定的语法么

忘各位解惑,谢谢。

PHPzPHPz2888 Il y a quelques jours435

répondre à tous(3)je répondrai

  • 迷茫

    迷茫2017-04-17 17:39:20

    Si vous changez le code en :

    public class SecondOuter {
    
        public static class SecondInner extends FirstOuter.FirstInner {
            SecondInner() {
                super("hello");
                System.out.println("SecondOuter.SecondInner()");
            }
        }
    
        public static void main(String[] args) {
            FirstOuter fo = new FirstOuter();
            SecondOuter so = new SecondOuter();
            SecondOuter.SecondInner si = new SecondInner();
        }
    }
    class FirstOuter {
        public static class FirstInner {
            FirstInner(String s) {
                System.out.println("FirstOuter.FirstInner() " + s);
            }
        }
    }

    x.new n'est plus nécessaire. En fait, la simple compréhension est que la classe interne statique n'est pas comme un paramètre d'objet. Nous devons d'abord instancier l'objet avant de poursuivre le traitement des paramètres.

    répondre
    0
  • 黄舟

    黄舟2017-04-17 17:39:20

    x.super("hello"); pourquoi appelle-t-il super() d'une autre classe externe

    Ce n'est pas le super qui appelle une classe externe, mais le FirstInner que vous appelez super doit être écrit ainsi.
    Lors de l'acquisition d'une classe interne (non statique), vous devez avoir un objet de sa classe externe Cela conduit à une syntaxe apparemment étrange telle que so.new SecondInner(fo)
    x.super("hello") Vous pouvez. ignorez-le lors de la compréhension. Vous pouvez supprimer le so. x. au début et le comprendre comme une règle grammaticale.

    Tout comme la réforme @好学利行, celle-là est peut-être plus facile à comprendre et plus courante.

    répondre
    0
  • PHPz

    PHPz2017-04-17 17:39:20

    Est-il possible de combiner x new et super(...) en un seul ? C’est la première fois que je vois ce genre d’écriture.

    répondre
    0
  • Annulerrépondre