Occhio che non stai utilizzando correttamente l'ereditarietà... Nella classe Weapon hai definito dei campi che descrivono vari attributi della tua arma, ma questi sono definiti private perciò non vengono ereditati dalla classe figlia AK47. In campi che vai a ridefinire nella classe figlia sono una cosa completamente diversa da quelli della classe padre; l'effetto che hai è quindi quello di inizializzare i campi della classe figlia, ma non quelli della classe padre. Quindi i metodi ereditati della classe padre restituiscono i valori dei campi della classe padre (che non sono stati inizializzati quindi sono a 0).
In definitiva due alternative potrebbero essere queste:
- Creare un costruttore della classe weapon che inizializzi i campi della classe Weapon e che venga richiamato anche dai costruttori delle classi figlie
- Eliminare i campi delle classi figlie e rendere quelli della classe Weapon protected in modo che vengano ereditati anche dalle classi figlie
Non so se sono stato sufficientemente chiaro, in caso chiedi altre spiegazioni ;)