* Наследяване в Java
Публикувано на 08 октомври 2009 в раздел ПИК3 Java.
Както всеки обектно-ориентиран език за програмиране, така и Java позволява наследяване. Това е възможността един клас да наследи цялата функционалност на друг клас и да я разшири. Класът, който е наследяван се нарича "родителски клас", а класа който наследява се нарича "наследник". Освен да добавят нова функционалност, наследниците също могат да изменят съществуваща.
Нека вземем един примерен клас за деца с метод, в който децата играят играта "камък - ножица - хартия". В главната програма ще пуснем децата да изиграят 10 поредни игри:
Файл kid.java:
package kids; import java.util.Scanner; class Kid{ public String name; public Kid(){ Scanner s = new Scanner(System.in); System.out.print("Enter the kid name: "); this.name = s.next(); } public Kid(String name){ this.name = name; } public static void introduce(){ System.out.println("Hello, nice to meet you!"); } public int getRand(){ int r = (int)Math.floor(Math.random()*3); return r; } public void playRPS(Kid oponent){ int i = this.getRand(); int j = oponent.getRand(); String[] rps = {"leafs", "scissors", "rocks"}; if (i == j){ System.out.println(this.name+" and "+oponent.name+ " both played "+rps[i]); System.out.println("The game is tie"); } else{ System.out.println(this.name+" played "+rps[i]+ " and "+oponent.name+" played "+rps[j]); switch(i){ case 0: if (j == 1) System.out.println(oponent.name+" wins!"); else System.out.println(this.name+" wins!"); break; case 1: if (j == 2) System.out.println(oponent.name+" wins!"); else System.out.println(this.name+" wins!"); break; case 2: if (j == 0) System.out.println(oponent.name+" wins!"); else System.out.println(this.name+" wins!"); break; } } } }
Файл kidsplay.java:
package kids; public class kidsplay{ public static void main(String[] args){ Kid ivancho = new Kid("Ivancho"); Kid pencho = new Kid("Pencho"); for (int i=0; i<10; i++){ ivancho.playRPS(pencho); System.out.println(); } } }
Нека сега създадем клас "момче", което има същите свойства, каквито и клас "дете", но добавя и нова функция:
Файл Boy.java:
package kids; class Boy extends Kid{ public String sex = "male"; public Boy(){ // извикване на конструктора на базовия клас super(); } public Boy(String name){ // извикване на конструктора на базовия клас super(name); } public void proposeGame(){ System.out.println(this.name+" said: Let's go play football!"); } }
Виждате, че можем да извикаме конструктора на базовият клас (също познат специално в Java и като "сурер клас") чрез извикване на метод "super()". Това все пак е нужно, защото всеки клас трябва да има конструктор (в случая конструктора на Boy изниква конструктора на Kid).
Можем да наследим класа и втори път:
Файл Girl.java:
package kids; class Girl extends Kid{ public String sex = "female"; public Girl(){ super(); } public Girl(String name){ super(name); } public void proposeGame(){ System.out.println(this.name+" said: Let's play fast and loose!"); } }
Нека сега променим главната програма така, че да работи вече с класове Boy и Girl:
Файл kidsplay.java:
package kids; public class kidsplay{ public static void main(String[] args){ Boy ivancho = new Boy("Ivancho"); Girl mariika = new Girl("Maria"); for (int i=0; i<10; i++){ ivancho.playRPS(mariika); System.out.println(); } ivancho.proposeGame(); mariika.proposeGame(); } }
Виждате, че всички функции от базовия клас бяха наследени от наследника му. Освен това трябва да обърнете внимание на метод playRPS(). Той очакваше като входен параметър обект от тип Kid, а ние му "изпращаме" обект от тип Girl. Въпреки това програмата ще работи. Това е и първият "зачатък" на полиморфизъм. По-подробно ще го разгледаме в следваща статия.
Добави коментар