* Наследяване в 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. Въпреки това програмата ще работи. Това е и първият "зачатък" на полиморфизъм. По-подробно ще го разгледаме в следваща статия.
Добави коментар