Dat is nog iets anders.
Een aggregatie is als een object A een (of meerdere) andere objecten van het type B (kan ook C of D zijn, zolang ze maar aan de interface van B voldoen)'heeft', maar die objecten (geen classes dus), kunnen wel op zichzelf bestaan. (In het voorbeeld van s-man2 kan die loop niet op zichzelf bestaan).
Een compositie is als een object A een object B bezit, en dat object B op zichzelf eigenlijk geen bestaansrecht heeft (zoals het voorbeeld van dat kanon en die loop).
Echter, imo gebruik je daar geen 'inner classes' voor, want dat is hetgeen waar jij het in je topicstart over hebt. Inner classes gebruik je imho enkel als je die 'inner class' enkel gaat gebruiken binnen de class waar je ze gedeclareert hebt.
Het voorbeeld van s-man2 zou je beter niet met inner classes gaan implementeren, maar mbhv composition.
In het voorbeeld van s-man2 zou je dus imo de volgende classes hebben:
een class Kanon (dat bv. de interface 'vuurwapen') implementeert, een een class 'Loop'.
De class Kanon bevat dan een object van het type loop. Op die manier kan je dan bv. ook makkelijk een class Geweer maken, die de 'vuurwapen' interface ook implementeert, en ook een object van het type loop bezit (zei het dan met andere eigenschappen).