2016-12-21 2 views
0

Ma question est. Sont-ils les mêmes?Le problème de compréhension s'étend et instancie. Est-ce la même chose que l'instanciation d'une classe?

public class Pet { 
} 

public class Fish extends Pet { 
} 

Si je tends la classe Pet à ma classe de poisson, est la même chose que si j'instancier la classe Pet dans ma classe de poisson? L'extension est au-dessus et l'instancié est en dessous. Sont-ils les mêmes?

public class Pet { 
} 

public class Fish { 

Pet myPet = new Pet(); 
} 

+1

Non, ils ne sont pas identiques. Vous devez faire un peu de lecture sur ce que l'héritage est dans la POO. – alzee

+1

Lorsque vous étendez une classe, vous définissez une autre classe (sous-classe) qui hérite de certains attributs et méthodes de la première classe. Lorsque vous instanciez une classe, vous créez un nouvel objet (instance) de cette classe. Dans votre code, dans le premier cas vous créez une nouvelle classe nommée Fish qui a des choses communes (héritées) avec la classe Pet, alors Fish est une sous-classe de Pet, alors que dans le second cas vous créez une nouvelle classe , également nommé Fish, qui n'a pas de points communs avec Pet, mais il possède un attribut nommé myPet de type Pet. –

+0

Composition de Google vs héritage – StaticBeagle

Répondre

0

Le premier exemple décrit l'héritage, le second - la composition. Ce sont deux concepts de la POO. Ils permettent au programmeur de réutiliser la logique commune. Vous devriez préférer utiliser la composition plutôt que l'héritage.

Copie d'autres SO answer:

Ils sont tout à fait différents. L'héritage est une relation "est-un". La composition est un "has-a".

Vous faites composition en ayant une instance d'une autre classe C comme un champ de votre classe, au lieu d'étendre C. Un bon exemple où la composition aurait été beaucoup mieux que l'héritage est java.util.Stack , qui étend actuellement java.util.Vector. C'est maintenant considéré comme une erreur. Une pile "est-NOT-un" vecteur; vous ne devriez pas être autorisé à insérer et à supprimer des éléments arbitrairement . Il aurait dû être composition à la place.

Malheureusement, il est trop tard pour corriger cette erreur de conception, puisque changer la hiérarchie d'héritage maintenant romprait la compatibilité avec code existant. Si Stack avait utilisé la composition au lieu de l'héritage, il est toujours possible de modifier pour utiliser une autre structure de données sans violer l'API.

Je recommande vivement le livre de Josh Bloch Effective Java 2e édition

Article 16: Composition de Faveur sur l'héritage

Point 17: Conception et document d'héritage ou bien interdire

Bonne orienté objet la conception ne consiste pas à étendre généreusement les classes existantes. Votre premier instinct devrait être de composer à la place.

+0

Donc, ils sont fondamentalement les mêmes? Ils permettent juste à une certaine classe d'utiliser d'autres méthodes de classe? Alors pourquoi choisir l'un par rapport à l'autre? Qu'est-ce que vous dites est d'instancier la classe au lieu de prolonger, car il est plus facile de modifier plus tard sur la route? – Houzi88

+0

@ Houzi88 La première ligne de la citation se lit "Ils sont absolument différents.". –

+0

@MeikVtune Ils sont différents, mais ils font la même chose essentiellement, non? – Houzi88

0

Ils ne sont pas les mêmes.

Dans le premier exemple, avec l'héritage, une instance d'un Fish peut accéder à toutes ses propres propriétés et méthodes, y compris celles héritées de Pet, par l'intermédiaire this ou self, selon la langue.

Dans le second exemple, myPet est juste une variable qui se trouve être une instance de la classe Pet, mais Pet et Fish ont aucun lien entre eux.

0

Non, ils sont complètement différents.

Dans celui-ci public class Fish extends Pet { } vous utilisez l'héritage pour étendre la classe Pet à la classe Fish, ce qui signifie que Fish est une sous-classe de Pet, il héritera de la classe Pet.

Cependant, dans celui-ci

public class Fish { 

Pet myPet = new Pet(); } 

Vous créez appelé poisson entier un nouvel objet qui ne s'étend pas de quoi que ce soit, juste qu'il a un objet de niveau de classe qui est un animal de compagnie, vous pouvez utiliser le Pet objets méthodes variables etc à travers l'objet myPet mais il n'est pas hérité par Fish donc Fish serait son propre objet et pas une sous-classe de Pet.

Voici les différences. En ce qui concerne quand vous devriez utiliser, voici la règle générale: si vous améliorez une classe alors vous devriez utiliser Héritage, mais si vous allez utiliser une classe pour sa fonction particulière, vous devez l'instancier en tant que variable dans la classe.

+0

Merci beaucoup pour votre réponse! – Houzi88

+0

Pourquoi devrais-je choisir l'un sur l'autre? Ne font-ils pas techniquement la même chose? Vous permet d'appeler simplement des méthodes dans cette classe donnée? – Houzi88

+0

Généralement si vous allez améliorer une classe, alors il est préférable d'utiliser l'héritage, cependant si vous allez juste utiliser une classe, alors il est préférable de l'utiliser sous la forme d'un nouvel objet pour l'utiliser – SteelToe

0

Ils sont complètement différents. extends est une relation 'is-a', tandis que plus tard (composition) est 'has-a'. Jetez un oeil here pour plus de détails.