Metody abstrakcyjne JAVA BODY

Metoda bez ciała (bez realizacji) jest znany jako metody abstrakcyjnej. Metoda musi zawsze być zadeklarowane w klasie abstrakcyjnej, lub innymi słowy można powiedzieć, że jeśli klasa ma metody abstrakcyjne, powinno zostać uznane za abstrakcyjne, jak również. W poprzednim poradniku omówiono klasa abstrakcyjna, jeśli nie masz jeszcze sprawdziłem go przeczytać tutaj: klasa abstrakcyjna w Javie, przed przeczytaniem tego przewodnika.
Jest to, jak wygląda metoda abstrakcyjna w Javie:

public abstract int myMethod (int N1, N2 int);

Jak widać nie ma to ciało.

Zasady metody abstrakcyjne

1. Streszczenie metody nie mają ciała, po prostu mieć podpis metody, jak pokazano powyżej.
2. Jeśli klasa ma metody abstrakcyjne powinno zostać zgłoszone streszczenie, vice versa nie jest prawdą, co oznacza, klasa abstrakcyjna nie musi posiadać metody abstrakcyjne obowiązkowy.
3. Jeżeli regularne klasa rozszerza klasę abstrakcyjną, a następnie klasa musi wdrożyć wszystkie abstrakcyjnych metod abstrakcyjnej klasy nadrzędnej lub musi ona zostać uznana za abstrakcyjne, jak również.

Przykład 1 Streszczenie Sposób klasy abstrakcyjnej

// klasa abstrakcyjna
klasa abstrakcyjna Suma {/ * Te dwa są metody abstrakcyjne, klasa dziecko * musi wdrożyć te metody * / public abstract int sumOfTwo (int N1, N2 int); public abstract int sumOfThree (int N1, N2 int, int N3); // regularna metoda public void disp () {System.out.println ( "Metoda klasy Sum"); }
}
// Zwykły klasa rozszerza klasę abstrakcyjną
Klasa Demo rozciąga Sum {/ * Jeśli nie zapewniają realizacji tych dwóch metod, program * wygeneruje błąd kompilacji. * / Int sumOfTwo publicznych (Int num1 int num2) {num1 powrotu + num2; } Publicznego Int sumOfThree (Int num1 int num2 int num3) {powrotu num1 + num2 + num3; } Publicznych statyczne pustych główne (arg łańcuchowe []) {Suma obj = nowy Demo (); System.out.println (obj.sumOfTwo (3, 7)); System.out.println (obj.sumOfThree (4, 3, 19)); obj.disp (); }
}

Wydajność:

10
26
Metoda klasy Sum

Przykład 2: streszczenie sposobu interfejs

Wszystkie metody interfejsu są jawne streszczenie domyślnie. Nie można mieć betonowe (zwykłych metod z ciałem) metody w interfejsie.

//Berło
interfejs Pomnóż {// metody abstrakcyjne public abstract int multiplyTwo (int N1, N2 int); / * Nie trzeba wspomnieć publicznego i abstrakcyjny interfejs * jak wszystkie metody w interfejsie są publiczne i abstrakcyjne * domyślnie więc kompilator będzie traktować tego jako * * public abstract multiplyThree (int N1, N2 int, int N3); * / Int multiplyThree (Int N1, N2 Int int N3); / * Regularne (lub beton) metody nie są dozwolone w interfejs * więc jeśli odkomentowaniu tej metody, otrzymasz błąd kompilacji * public void disp () {* System.out.println ( "dam błąd, jeśli u mnie odkomentowaniu „); *} * /
}
Klasa Demo realizuje Mnożenie {publicznego Int multiplyTwo (Int num1 int num2) {num1 powrotu * num2; } Publicznego Int multiplyThree (Int num1 int num2 int num3) {powrotu num1 * num2 * num3; } public statyczne pustych główne (arg łańcuchowe []) {Mnożenie obj = nowy Demo (); System.out.println (obj.multiplyTwo (3, 7)); System.out.println (obj.multiplyThree (1, 9, 0)); }
}

Wydajność:

21
0

Numer referencyjny:
Abstract metoda javadoc

❮ Poprzednie Następne ❯

JAVA DLA LUDZI {klasy abstrakcyjne i interfejsy} - MODERNNERD ...


W rozdziale dziedziczenia klas, dowiedzieliśmy się o utworzenie umowy między klasami, superklas i użytkowników. Poprzez utworzenie podklasy, które dzielą superklasę możemy dzielić pól i metod pomiędzy nimi, aby zmniejszyć ilość kodu piszemy, stworzenie przewidywalnego interfejs dla użytkowników, a także zatrudniają polimorfizm . W tym rozdziale dowiemy się, jak uczynić nasze kontrakty lepiej przez abstrakcyjnych klas i interfejsów.

Dlaczego klasy abstrakcyjne i interfejs są ważne i użyteczne

Regularne klasa definiuje pola, realizuje w pełni funkcjonujących metod i może być instancja; taka klasa jest nazywana betonu klasy. To jest zdecydowana większość zajęć będzie pisać i używać w swojej karierze programowania. Klasy abstrakcyjne i interfejsy nie może być instancja, ale oni też zdefiniować pola i metody - choć nie może implementować metody. Są one najlepiej do formowania umowę między klasą, jego podklasy, a użytkownicy jej podklasy.

Czytaj więcej:   jak w filmie STUDIO WINDOWS LIVE nakładanie obrazów w filmie

Klasa abstrakcyjna

Abstrakcyjna klasa jest bardzo podobny do zwykłej klasy w tym, że to może mieć pól i metod. Co czyni ją wyjątkową jest jej metody mogą lub nie mają ciał. Oznacza to, że klasa abstrakcyjna może mieć podpisy metod, które są zadeklarowane jako abstrakcyjne , jak również pełne metodami jak zwykle.

Streszczenie metoda jest metodą, która nie ma ciała i wymaga podklasy z klasy abstrakcyjnej jej w celu wdrożenia jej ciało. Funkcja ta jest przydatna, gdy masz metody, które chcesz mieć wszystkie podklasy, ale chcesz pozostawić go do różnych podklas do wdrożenia metody, jak chcą. Ponadto podklasą klasy abstrakcyjnej musi realizować wszystkich swoich abstrakcyjnych metod.

Weźmy na klasę człowieka ataku () metody instancji z rozdziału klasa dziedziczenia dla przykładu. Chcemy każdą podklasę klasy Human mieć metodę atakowania przeciwnika innego człowieka, ale oczekujemy, że każda podklasa mieć inny sposób atakowania. Powinniśmy uczynić nasz atak () metoda streszczenie zamiast wdrażać go w klasie ludzi, jak również każdej podklasy. W ten sposób, że nie będzie w stanie zapomnieć wdrożyć go w każdej podklasy i będziemy trzymać nasze kod czysty nie pisząc wyczekująco bezużyteczny kod w naszej nadrzędnej. Istnieje kilka metod tej klasy Human że powinniśmy abstrakcyjny, ale w tym celu musimy dokonać klasa Human klasą abstrakcyjną. Aby to zrobić, po prostu dodaj abstrakcyjne słowo kluczowe do podpisu klasy, zanim w klasie hasła.

public abstract class Human { 
// Dodanie pól, metod i sposobów abstrakcyjnych
}

Dla metod, które spodziewamy się zachowywać dokładnie tak samo we wszystkich naszych podklasy, możemy zapisać je w całości, jak zwykle. Metody takie jak pobierające i ustawiające pasują do tego rachunku. Ponadto, możemy jeszcze nasze wspólne pola w naszym klasy abstrakcyjnej. Rzućmy okiem na naszej nowej klasy Człowieka jako uaktualnienie rozdziale dziedziczenia klas:

public abstract class Human { 
chroniony String name;
...

publicznej Ludzki (String name) {...}

public abstract void Attack (ludzki);
public abstract void bronić ();
public abstract void skok ();
public abstract podwójne leczyć ();

public String getName () {...}
public double getHealth () { ... }
public long getExperience () {...}
public void setAttackPower ( int attackPower) { ... }
public long gainExperience ( długie doświadczenie) { ... }
public double leczyć ( podwójna additionalHealth) { ... }
public double decreaseHealth ( int opponentAttackPower) { ... }
}

W tym fragmencie kodu, można zobaczyć, że mamy klasę ludzkiego i jego atak () , bronić () , skok () , i leczyć () metody instancji są abstrakcyjne. To dlatego, że są wszystkie funkcje, które powinny być unikalna dla każdej klasy, która je realizuje; Taoistycznych przypadki - znaki magiczne - nie uleczy samo jak przypadkach wojownikiem, więc powinny wdrożyć leczyć () metodę inaczej. Pan widział reszty klasy, więc te części zostały pominięte.

W tym momencie ważne jest, aby pamiętać, że metody statyczne nie mogą być abstrakcyjne, bo w najprostszych słowach, abstrakcyjne oznacza, że ​​metoda wykonuje żadnej funkcji i środki statycznych jest zdecydowanie funkcjonalność dostępna w metodzie lub dziedzinie nawet bez instancji klasy. Tak więc, mając statycznej metody abstrakcyjne byłby byłoby logiczną sprzeczność, która nie pozwala Java.

interfejsy

Interfejs jest nieco inna niż wszystko widzieliśmy do tej pory. Java interfejs jest bardziej abstrakcyjnej klasy niż zwykłej klasie. Interfejs może zawierać tylko podpisów i metody statyczne końcowe pola. Interfejs to jedynie umowa pomiędzy interfejsem i klas, które je wdrożyć. Podobnie jak w przypadku klas abstrakcyjnych, klas, które implementują interfejs musi wdrożyć ciał jego metod w celu zapewnienia funkcjonalności.

Czytaj więcej:   JAK OPERA wyszukiwarce Komputer

Interfejsy są najlepsze do tworzenia kontrakt, który zagwarantuje, że wszystkie klasy, które je wdrażają zachowują się podobnie przez przestrzeganie umowy. Pozwoli to użytkownikom bezpiecznie oczekiwać części programu zachowywać się podobnie jak wiele można się spodziewać wszystkie postacie w grze walki zachowywać się podobnie. W naszej grze Conquer z rozdziału dziedziczenia klas, możemy oczekiwać, że wszystkie znaki, aby móc zaatakować inne postacie, bronić się przed atakami, skakać i leczyć się wśród innych funkcji. Te funkcje są funkcjami wszystkie znaki mogą wykonywać, nie tylko przypadki ludzkich:

public interface Charakter { 
Losowe randomGenerator = new random ();

String getName ();
podwójne getHealth ();
długi getExperience ();
Int getAttackPower ();
nieważne setAttackPower ( Int attackPower);

nieważne obrony ();
void skok ();
Int leczyć ();
void atak (przeciwnik Character);
podwójne decreaseHealth ( Int opponentAttackPower);
długi gainExperience ( długi doświadczenia);
}

W charakterze interfejsu , numCharactersInGame pole jest niejawnie statycznych i wszystkie metody są domyślnie publiczne , więc nie ma potrzeby, aby zawierać statyczne i publicznych modyfikatory odpowiednio.

Top-level interfejs nie mogą być prywatne. Ponadto, wszystkie metody w interfejsie są intuicyjnie publiczny , więc nie zawiera żadnych metod, które zdaniem powinny być prywatne lub chronione .

Że chcemy umożliwić naszym postacie ludzkie mają znaki domowych w swoich towarzyszy, spodziewamy się, że przypadki zoologiczne mogą robić takie rzeczy jak atak, obrona, skakać i leczyć, ale nie innych rzeczy, które są unikalne dla instancji Człowieka. Ponadto, możemy mieć wiele różnych rodzajów zwierząt; użytkownik może chcieć mieć psa, kota, czy ptak jako zwierzę domowe. Za to, że mamy klasę psa, kota, a klasę klasy Bird. Każda z tych klas będzie z kolei rozszerzenie klasy Pet który określi współdzielonych pól przykład wdrażania wspólnych metod i deklarują, że wszystkie metody abstrakcyjne podklasy musi wdrożyć.

Od dołu do góry, hierarchię konkretnych klas, klas abstrakcyjnych, a interfejs idzie tak:

betonu klasy interfejsu → → abstrakcyjne klasy.

Jeśli klasa rozszerza nadrzędnej - betonu lub abstrakcyjne - która implementuje interfejs, można zadeklarować odpowiednie metody z interfejsu w nadrzędnej. Spowoduje to spełnić obowiązek podklasy do przestrzegania umowy pomiędzy nim a interfejs ponieważ podklasa dziedziczy niezbędnych metod zamówienia od jej nadrzędnej. Alternatywnie, klasa może implementować metody interfejsu, na własną rękę.

Rzućmy okiem na nasz klasy abstrakcyjnej dla zwierząt i naszych konkretnych Archer i pies podklasy; będziemy korzystać z interfejsu charakteru i klasy abstrakcyjnej ludzkiego od wcześniej:

public abstract class Human realizuje postać { 
chroniony Pet pet ;
...

publicznej Ludzki (String name) {
...
numCharacters ++;
}
public void setPet (PET) { to . zwierzę = zwierzę; } 
Public Pet getPet () { return zwierzę ; }
Public abstract void atak (przeciwnik Character);
... 
}
public abstract class Pet realizuje postaci { 
chroniony Human właściciela ;
...
 publicznego Pet (String name, właściciel Human) { 
to . Nazwa = nazwa;
tego . właściciel = właściciel;
gainExperience (1);
numCharacters ++;
}

Publicznego getOwner ludzkie () { właściciel powrotu ; }
public abstract void atak (przeciwnik Character); 
...
}
public class Archer rozciąga człowieka { 
private int numArrows = 0;

publicznego Archer (String name) {
super (nazwa);
findArrows ();
}

Private void findArrows () {
systemu. z .println ( „szukam strzałek” );
}
@Override 
public void Attack (przeciwnik Character) {...}
@Override 
public void bronić () {...}
@Override 
public void skok () {...}
@Override 
public int leczyć () { powrócić 0; }
}
public class Dog rozciąga Pet { 
public Dog (String name, właściciel Human) {
super (nazwa, właściciel);
}

Public void bark () {
systemu. z .println ( "Wilk Wilk!" );
}

@Override
public void Attack (przeciwnik Character) {...}
@Override 
public void bronić () {...}
@Override 
public void skok () {...}
@Override 
public int leczyć () { powrócić 0; }
}

Teraz mamy wspaniałą umowę ustanowienia między podklasy abstrakcyjnych superklas oraz interfejs by wszystkimi rządzić. Interfejs Charakter definiuje interfejs zachowań dla wszystkich postaci w grze. The Human Abstract klasa implementuje interfejs charakter i określa zachowanie i pól dla wszystkich ludzkich charakterów w grze. Klasa Ludzki realizuje również niektóre z metod interfejsu znaków, które są wspólne dla wszystkich znaków Człowieka. Klasa Archer jest beton klasy, która rozszerza klasę ludzi i jest używany do tworzenia znaków Archer w grze. Ponadto, klasy Archer realizuje również interfejs postaci ponieważ jego nadrzędna, człowieka, nie. W związku z tym, przykłady Archer są również przypadki, od człowieka i ludzkie są również przypadki wystąpienia interfejsu znaków Archer przypadki to przypadki postaci. Tak więc, są przypadki Archer Archer i ludzkie postacie. To daje nam następującą hierarchię, od dołu do góry:

Czytaj więcej:   TWORZENIE DVD-Video na DVD LAB PRO PROGRAMU

Archer instancja Archer betonu klasy Human klasy abstrakcyjnej interfejsu Postaci.

Beton klasy Dog i Pet klasa abstrakcyjna praca podobnie z naszego interfejsu postaci:

Pies instancja pies beton klasy Pet klasa abstrakcyjna interfejs postaci.

Archer jest ludzka jest znak. Pies jest Pet to postać.

Archer jest ludzka jest postaci. Pies jest Pet jest postaci. Dlatego zarówno Archer i pies są równie przypadki charakteru jak wszystkich innych przypadkach człowieka i zwierząt byłoby, gdyby utworzyć więcej klas, które rozszerzają te klasy abstrakcyjne lub implementować interfejs znaków.

Powinieneś być z siebie dumny w tym momencie. Teraz wiesz wszystko, co trzeba wiedzieć na temat klas, interfejsów i umów się rozpocząć tworzenie zabawnych projektów, które wykorzystują polimorfizm. Oto program startowy:

public class Main { 
public static void main (String [] args) {
Archer niceArcher = nowy Archer ( "Tom" );
Ludzki modernArcher = nowy Archer ( "Stacy" );

Pies modernDog = new Dog ( "Hunter" , modernArcher);
Pet petDog = new Dog ( "Buddy" , niceArcher);

System. z .println ( "
Start Game
"
);
modernArcher.attack (niceArcher);
. niceArcher.getPet () atak (modernArcher);
modernArcher.attack (niceArcher.getPet ());
modernDog.attack (petDog.getOwner ());
petDog.attack (modernArcher.getPet ());
}
/ * Drukuje:
Tom: Znaleziono 6 strzały ...
Stacy: Znaleziono 4 strzały ...
Stacy: Mam nowego zwierzaka. Cześć Hunter!
Hunter: Wilk Wilk!
Tom: Mam nowego zwierzaka. Cześć kolego!
Kolego: Wilk Wilk!

Rozpocznij grę

Stacy: Atakowanie Toma z moimi strzałami!
Tom: Mam został trafiony. Moje zdrowie teraz = 90,0
Buddy: Zjadliwa Stacy
Stacy: Zostałem trafiony. Moje zdrowie teraz = 99,0
Stacy: Atakowanie Buddy z moimi strzałami!
Kolego: Wilk Wilk!
Kolego: Zdrowie teraz = 90,0
Hunter: Zjadliwa Tom
Tom: Zostałem trafiony. Moje zdrowie teraz = 89,0
Buddy: Gryzienie Hunter
Hunter: Wilk Wilk!
Hunter: Zdrowie teraz = 99,0
* /
}

Polimorfizm jest zdolność do obiektów przybierać różne formy. Zauważ, że niceArcher jest typu ludzi, ale jest tworzony jako nowy Archer. Oznacza to, że niceArcher przepływa więcej niż jeden is-a testy, ponieważ zarówno jego ludzkiej i Archer. Ponadto należy zauważyć, że każdy obiekt może atakować wszystkie inne obiekty. Jest to możliwe tylko dlatego, że każdy przedmiot jest również przykład interfejsu znaków i atak () sposób wystąpienie Charakter bierze udział wystąpienie postaci jako jeden argument. Z wszystkich, że możemy powiedzieć, że te obiekty są polimorficzne.

Pamiętaj, że jeśli nie całkiem rozumieją znaczenie polimorfizmu jednak omówimy go bardziej szczegółowo wkrótce. Teraz spójrz na kod nośnej i upewnij się, że ją rozumieją. Spróbuj zmienić go dookoła i zrobić własne kontrakty.


Następny rozdział

Java dla ludzi {Struktury danych: Arrays}
W telefonie masz książkę telefoniczną wypełnioną nazw i numerów rodziny i przyjaciół. Dobrą rzeczą swoje ... medium.com

Tabela Zawartość

Java dla ludzi {Spis treści}
Piszę tę książkę, aby uczyć nikogo z najmniejszej odrobiny zainteresowania informatyki, inżynierii oprogramowania ... medium.com

Wybierz swój język

polskiangielski niemiecki hiszpański francuski włoski portugalski turecki arabski ukraiński szwedzki węgierski bułgarski estoński Chiński (uproszczony) wietnamski rumuński tajski słoweński słowacki serbski malajski norweski łotewski litewski koreański japoński indonezyjski hinduski hebrajski fiński grecki holenderski Czech duński chorwacki Chiński (tradycyjny) Filipińska urdu Azeybardzhansky ormiański Białoruski bengalski gruziński kazachski Kataloński mongolski rosyjski Tadzhitsky Tamil'skij telugu Uzbetsky


Dodaj komentarz

Twój e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *