2012-10-10 3 views
0

J'ai le code ci-dessous.création d'objet dynamique en Java

public class Test { 
    public static void main(String args[]) 
    { 
     int i = 0; 

     if(i==0){ 
      Beer obj = new Beer(); 
     } 
     else { 
      Rum obj = new Rum(); 
     } 
     System.out.println(obj.brand); //doesn't work 
    } } 

class Drink { 
} 
class Beer extends Drink{ 
    public String brand = "BeerBrand"; } 

class Rum extends Drink{ 
    public String brand = "RumBrand"; } 
  1. est-il un moyen de faire le travail ci-dessus sans utiliser la fonction ou le remplacement d'un chargement de classe dynamique?
  2. Toutes les classes sont chargées dynamiquement dans JVM il n'y a pas de chargement statique comme en C. Est-ce correct?

Répondre

1

Existe-t-il un moyen de faire fonctionner ce qui précède sans utiliser le remplacement de fonction ou le chargement de classe dynamique?

La seule alternative est d'utiliser des réflexions, mais la fixation de la conception des classes serait beaucoup plus simple/mieux

Toutes les classes sont chargées dynamiquement dans JVM il n'y a pas une charge statique comme en C. Est c'est correct?

Oui. Ils peuvent être chargés dynamiquement plus d'une fois et même déchargés.


L'utilisation d'une approche orientée objet ressemblerait à ceci.

public class Test { 
    public static void main(String... args) { 
     Drink drink; 
     if (args.length == 0) { 
      drink = new Beer(); 
     } else { 
      drink = new Rum(); 
     } 
     System.out.println(drink.getBrand()); 
    } 
} 

interface Drink { 
    public String getBrand(); 
} 

class Beer implements Drink { 
    @Override 
    public String getBrand() { 
     return "BeerBrand"; 
    } 
} 

class Rum implements Drink { 
    @Override 
    public String getBrand() { 
     return "RumBrand"; 
    } 
} 
+0

Mais on m'a demandé dans une interview la différence entre le chargement de classe statique et le chargement de classe dynamique dans Java? : P –

+1

Il s'agit de termes mal utilisés pour lesquels il existe des réponses comme http://en.allexperts.com/q/Java-1046/2009/11/static-class-loading-vs.htm Dans tous les cas, la classe Java est chargée dynamiquement, mais la * liaison * des classes * nom * est statique (déterminée par la compilation javac) ou dynamique (déterminée à l'exécution) –

3

Drink devrait être une classe abstraite et de fournir un membre abstrait getBrand() ou similaire, par Beer substituée et Rum.

Ensuite, vous feriez quelque chose comme:

Drink d = null; 
if (...) { 
    d = new Beer(); 
} 

de sorte que vous instancier la référence appropriée. Parce qu'il est toujours de type Drink vous pouvez référencer la marque. La référence Drink vous permettra d'accéder à tout ce qui est buvable, et la mise en œuvre fournit les spécificités. Notez que Drink est résumé, puisque vous ne pouvez pas instancier un Drink - vous devez être plus précis.

Pour répondre à vos autres questions, vous pouvez fournir une méthode de base et faire quelque chose comme:

if (this instanceof Beer) { 
    ... 
} 

pour éviter primordial. Mais pourquoi le ferais-tu?

Pour répondre à votre deuxième question, les classes sont chargées dynamiquement par la JVM en référence. Vous pouvez observer cela en définissant l'indicateur -verbose sur la machine virtuelle Java.

2

Ce code ne fonctionnera pas car la portée de 'obj' est seulement dans le bloc if-else. Vous devez le déclarer au-dessus du bloc if-else du type Boire.

Questions connexes