2011-05-31 5 views
3

Ci-dessous l'exemple de l'héritageJava Exemple d'héritage

class Parent { 
    Parent(int a, int b) { 
     int c = a + b; 
     System.out.println("Sum=" + c); 
    } 
    void display() { 
     System.out.println("Return Statement"); 
    } 
} 
class Child extends Parent { 
    Child(int a, int b) { 
     int c = a - b; 
     System.out.println("Difference=" + c); 
    } 
} 
public class InheritanceExample { 
    public static void main(String args[]) { 
     Child c = new Child(2, 1); 
     c.display(); 
    } 
} 

j'obtiens l'erreur ci-dessous lorsque je n'ai pas le parent constructeur non paramétrisé()

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor 

    at Child.<init>(InheritanceExample.java:14) 
    at InheritanceExample.main(InheritanceExample.java:22) 

Pouvez-vous s'il vous plaît me expliquer quel est le but du constructeur sans paramètres dans la classe de base.

+1

il est juste un constructeur par défaut qui crée une instance de la classe parente, dans ce cas. En général, vous définissez les variables d'objet sur une valeur par défaut, ou null. –

+0

S'il vous plaît inclure le _text_ de l'erreur, pas une capture d'écran. – SLaks

+0

est-ce vraiment le code source? il compile et fonctionne bien pour moi via copier/coller. – TofuBeer

Répondre

8
class child extends parent 
{ 
    child(int a,int b) 
    { 
     int c=a-b; 
     System.out.println("Difference="+c); 
    } 
} 

La première chose que le constructeur de classe enfant doit faire est d'appeler le constructeur de classe parent. Si vous ne le faites pas explicitement (par exemple super(a,b)), un appel au constructeur par défaut est impliqué (super()).

Pour que cela fonctionne, vous devez avoir ce constructeur par défaut (sans aucun paramètre).

Si vous ne déclarez aucun constructeur, vous obtenez le constructeur par défaut. Si vous déclarez au moins un constructeur, vous n'obtenez pas automatiquement le constructeur par défaut, mais vous pouvez l'ajouter à nouveau.

Le message d'erreur que vous obtenez se plaint de l'appel implicite à super() ne fonctionne pas, car il n'existe aucun constructeur dans la classe parente.

Deux façons de le corriger:

  1. ajouter un constructeur par défaut
  2. dans la première ligne du constructeur de l'enfant, appelez un constructeur parent non par défaut (super(a,b))

En outre, N'utilisez pas de noms de classes en minuscules.

0

Je pense qu'il y avait une question similaire à:

Why should the derived class constructor always access base class constructor?

Vous pouvez penser de cette façon: depuis « enfant » hérite de « parent », « enfant » doit aussi être une instance valide de "parent" (polymorphisme) avant qu'il puisse se comporter comme un "parent" lui-même. En tant que tel, la toute première chose que "child" doit faire est de se construire comme un "parent" valide - donc un appel au constructeur de "parent" via super() doit être le premier appel de méthode dans le constructeur. Si aucun appel de ce type n'est présent, un appel implicite au constructeur sans paramètre de "parent" est généré.

3

La raison pour laquelle il demande parent() est parce que child étend parent, mais vous n'appelez pas explicitement super (a, b) dans le constructeur enfant. Comme il n'y a pas d'appel explicite au constructeur parent, javac essaie d'appeler le constructeur par défaut parent() et se plaint quand il ne le trouve pas.

Vous pouvez le voir avec ce code:

class parent 
{ 
    public parent() { 
     System.out.println("Parent Constructor"); 
    } 

    public parent(int a,int b) { 
     int c=a+b; 
     System.out.println("Sum="+c); 
    } 

    public void display() { 
     System.out.println("Return Statement"); 
    } 
} 

class child extends parent 
{ 
    public child(int a,int b) { 
     int c=a-b; 
     System.out.println("Difference="+c); 
    } 
} 

public class InheritanceExample 
{ 
    public static void main(String args[]) { 
     child c=new child(2,1); 
     c.display(); 
    } 
} 

Sortie:

Parent Constructor 
Difference=1 
Return Statement 

En outre, cela fonctionne très bien sans constructeur par défaut:

class parent 
{ 
    public parent(int a,int b) { 
     int c=a+b; 
     System.out.println("Sum="+c); 
    } 

    public void display() { 
     System.out.println("Return Statement"); 
    } 
} 

class child extends parent 
{ 
    public child(int a,int b) { 
     super(a,b); 
     int c=a-b; 
     System.out.println("Difference="+c); 
    } 
} 

public class InheritanceExample 
{ 
    public static void main(String args[]) { 
     child c=new child(2,1); 
     c.display(); 
    } 
} 

Sortie:

Sum=3 
Difference=1 
Return Statement 
0

L'erreur est là parce que si nous n'appelons pas super explicitement alors JVM met super() dans le constructeur de la classe enfant et ce super() recherche un constructeur dans la classe parent sans paramètre qui n'est pas dans votre classe donc c'est faux. Placez un constructeur non paramétré dans la classe parente ou placez l'instruction super (a, b) dans la toute première ligne du constructeur enfant.

class Parent 
    { 
     Parent(int a, int b) 
     { 
      int c = a + b; 
      System.out.println("Sum=" + c); 
      } 
     void display() 
    { 
     System.out.println("Return Statement"); 
     } 
    } 
    class Child extends Parent 
    { 
     Child(int a, int b) 
    { 
     super(a,b); 
     int c = a - b; 
      System.out.println("Difference=" + c); 
     } 
    } 
    class InheritanceExample 
    { 
     public static void main(String args[]) 
    { 
      Child c = new Child(2, 1); 
     c.display(); 
     } 
    } 
0
public class Mobile{ 
private String manufacturer; 
private String operating_system; 
public String model; 
private int cost; 

Mobile(String man, String o,String m, int c){ 
this.manufacturer=man; 
this.operating_system=o; 
this.model=m; 
this.cost=c; 
} 
public String getModel(){ 
return this.model; 
} 
} 

public class Android extends Mobile{ 
Android(String man, String o,String m, int c){ 
super(man,o,m,c); 
} 
public String getModel(){ 
return "This is Android mobile" +model; 
} 
0
import java.io.*; 
public class XXX 
{ 
public static void main()throws IOException 
{ 
System.out.println("Enter your name."); 
String name = in.readLine(); 
System.out.println(name+" rules!! Thank You!!"); 
} 
}