Java - szybki przewodnik

Język programowania Java został pierwotnie opracowany przez firmę Sun Microsystems, który został zapoczątkowany przez Jamesa Goslinga i wydany w 1995 roku jako podstawowy składnik platformy Java firmy Sun Microsystems (Java 1.0 [J2SE]).

Najnowsza wersja Java Standard Edition to Java SE 8. Wraz z rozwojem języka Java i jego powszechną popularnością zbudowano wiele konfiguracji dostosowanych do różnych typów platform. Na przykład: J2EE dla aplikacji korporacyjnych, J2ME dla aplikacji mobilnych.

Nowe wersje J2 zostały przemianowane odpowiednio na Java SE, Java EE i Java ME. Java jest gwarantowanaWrite Once, Run Anywhere.

Java to -

  • Object Oriented- W Javie wszystko jest obiektem. Javę można łatwo rozszerzyć, ponieważ jest oparta na modelu Object.

  • Platform Independent- W przeciwieństwie do wielu innych języków programowania, w tym C i C ++, kiedy Java jest kompilowana, nie jest ona kompilowana na maszynę specyficzną dla platformy, a raczej w niezależny od platformy kod bajtowy. Ten kod bajtowy jest dystrybuowany w Internecie i interpretowany przez maszynę wirtualną (JVM) na dowolnej platformie, na której jest uruchamiany.

  • Simple- Java została zaprojektowana tak, aby była łatwa do nauczenia. Jeśli rozumiesz podstawową koncepcję OOP Java, byłoby to łatwe do opanowania.

  • Secure- Dzięki bezpiecznej funkcji Java umożliwia tworzenie systemów wolnych od wirusów i manipulacji. Techniki uwierzytelniania opierają się na szyfrowaniu z kluczem publicznym.

  • Architecture-neutral - Kompilator Java generuje format pliku obiektowego neutralny pod względem architektury, co sprawia, że ​​skompilowany kod jest wykonywalny na wielu procesorach, przy obecności systemu wykonawczego Java.

  • Portable- Neutralność architektoniczna i brak aspektów specyfikacji zależnych od implementacji sprawia, że ​​Java jest przenośna. Kompilator w Javie jest napisany w ANSI C z czystą granicą przenośności, która jest podzbiorem POSIX.

  • Robust - Java stara się wyeliminować sytuacje podatne na błędy, kładąc nacisk głównie na sprawdzanie błędów podczas kompilacji i sprawdzanie czasu wykonania.

  • Multithreaded- Dzięki funkcji wielowątkowości Javy można pisać programy, które mogą wykonywać wiele zadań jednocześnie. Ta funkcja projektowania umożliwia programistom tworzenie interaktywnych aplikacji, które mogą działać płynnie.

  • Interpreted- Kod bajtowy Java jest tłumaczony w locie na natywne instrukcje maszynowe i nie jest nigdzie przechowywany. Proces rozwoju jest szybszy i bardziej analityczny, ponieważ łączenie jest procesem przyrostowym i lekkim.

  • High Performance - Dzięki wykorzystaniu kompilatorów Just-In-Time Java zapewnia wysoką wydajność.

  • Distributed - Java jest przeznaczona dla rozproszonego środowiska internetowego.

  • Dynamic- Java jest uważana za bardziej dynamiczną niż C lub C ++, ponieważ została zaprojektowana tak, aby dostosowywać się do zmieniającego się środowiska. Programy w języku Java mogą przenosić dużą ilość informacji w czasie wykonywania, których można użyć do weryfikacji i rozwiązywania problemów z dostępem do obiektów w czasie wykonywania.

Historia Javy

James Gosling zainicjował projekt języka Java w czerwcu 1991 r. Do wykorzystania w jednym ze swoich wielu projektów dekoderów. Język, początkowo nazywany „dębem” od dębu stojącego przed biurem Goslinga, również nosił nazwę „zielony”, a później został przemianowany na Java z listy przypadkowych słów.

Firma Sun wydała pierwszą publiczną implementację jako Java 1.0 w 1995 roku Write Once, Run Anywhere (WORA), zapewniające bezpłatne czasy działania na popularnych platformach.

W dniu 13 listopada 2006 r. Firma Sun wydała większość oprogramowania Java jako wolnego i otwartego oprogramowania na warunkach Powszechnej Licencji Publicznej GNU (GPL).

8 maja 2007 r. Firma Sun zakończyła ten proces, czyniąc cały podstawowy kod Javy wolnym i otwartym kodem źródłowym, z wyjątkiem niewielkiej części kodu, do którego firma Sun nie posiadała praw autorskich.

Potrzebne narzędzia

Do wykonania przykładów omawianych w tym samouczku potrzebny jest komputer Pentium 200 MHz z co najmniej 64 MB pamięci RAM (zalecane 128 MB pamięci RAM).

Będziesz także potrzebować następującego oprogramowania -

  • System operacyjny Linux 7.1 lub Windows XP / 7/8
  • Java JDK 8
  • Notatnik Microsoft lub inny edytor tekstu

Ten samouczek zapewni umiejętności niezbędne do tworzenia graficznego interfejsu użytkownika, aplikacji sieciowych i aplikacji internetowych przy użyciu języka Java.

Co jest następne?

W następnym rozdziale dowiesz się, jak uzyskać Javę i jej dokumentację. Na koniec instruuje Cię, jak zainstalować Javę i przygotować środowisko do tworzenia aplikacji Java.

W tym rozdziale omówimy różne aspekty tworzenia przyjaznego środowiska dla języka Java.

Konfiguracja środowiska lokalnego

Jeśli nadal chcesz skonfigurować środowisko pod kątem języka programowania Java, w tej sekcji omówiono sposób pobierania i konfigurowania środowiska Java na komputerze. Poniżej przedstawiono kroki konfiguracji środowiska.

Java SE jest dostępna bezpłatnie pod linkiem Pobierz Javę . Możesz pobrać wersję opartą na systemie operacyjnym.

Postępuj zgodnie z instrukcjami, aby pobrać Javę i uruchomić .exeaby zainstalować Javę na swoim komputerze. Po zainstalowaniu Javy na komputerze będziesz musiał ustawić zmienne środowiskowe, aby wskazywały prawidłowe katalogi instalacyjne -

Konfigurowanie ścieżki dla systemu Windows

Zakładając, że zainstalowałeś Javę w katalogu c: \ Program Files \ java \ jdk -

  • Kliknij prawym przyciskiem myszy „Mój komputer” i wybierz „Właściwości”.

  • Kliknij przycisk „Zmienne środowiskowe” na karcie „Zaawansowane”.

  • Teraz zmień zmienną „Path”, tak aby zawierała również ścieżkę do pliku wykonywalnego Java. Na przykład, jeśli ścieżka jest obecnie ustawiona na „C: \ WINDOWS \ SYSTEM32”, ​​zmień ścieżkę na „C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin”.

Konfigurowanie ścieżki dla systemów Linux, UNIX, Solaris, FreeBSD

Zmienna środowiskowa PATH powinna być ustawiona tak, aby wskazywała, gdzie zostały zainstalowane pliki binarne Java. Zajrzyj do dokumentacji powłoki, jeśli masz z tym problem.

Na przykład, jeśli używasz bash jako powłoki, to dodasz następujący wiersz na końcu swojego '.bashrc: export PATH = / path / to / java: $ PATH'

Popularne edytory Java

Do pisania programów w języku Java potrzebny będzie edytor tekstu. Na rynku dostępne są jeszcze bardziej wyrafinowane środowiska IDE. Ale na razie możesz rozważyć jedną z następujących -

  • Notepad - Na komputerze z systemem Windows możesz użyć dowolnego prostego edytora tekstu, takiego jak Notatnik (zalecany w tym samouczku), TextPad.

  • Netbeans - Środowisko Java IDE o otwartym kodzie źródłowym i bezpłatne, które można pobrać z witryny https://www.netbeans.org/index.html.

  • Eclipse - Środowisko Java IDE opracowane przez społeczność eclipse open source i można je pobrać z witryny https://www.eclipse.org/.

Co jest następne?

W następnym rozdziale nauczysz się, jak napisać i uruchomić swój pierwszy program w języku Java, a także poznać niektóre z ważnych podstawowych składni w języku Java potrzebnych do tworzenia aplikacji.

Kiedy rozważamy program w Javie, można go zdefiniować jako zbiór obiektów, które komunikują się poprzez wzajemne wywoływanie metod. Przyjrzyjmy się teraz pokrótce, co oznaczają klasy, obiekty, metody i zmienne instancji.

  • Object- Przedmioty mają stany i zachowania. Przykład: Pies ma stany - maść, imię, rasę, a także zachowania takie jak merdanie ogonem, szczekanie, jedzenie. Obiekt jest instancją klasy.

  • Class - Klasę można zdefiniować jako szablon / schemat opisujący zachowanie / stan, które obsługuje obiekt tego typu.

  • Methods- Metoda to w zasadzie zachowanie. Klasa może zawierać wiele metod. Dzieje się tak w metodach, w których zapisuje się logikę, manipuluje się danymi i wykonuje wszystkie akcje.

  • Instance Variables- Każdy obiekt ma swój unikalny zestaw zmiennych instancji. Stan obiektu jest tworzony przez wartości przypisane do tych zmiennych instancji.

Pierwszy program w języku Java

Spójrzmy na prosty kod, który wypisze słowa Hello World.

Przykład

public class MyFirstJavaProgram {

   /* This is my first java program.
    * This will print 'Hello World' as the output
    */

   public static void main(String []args) {
      System.out.println("Hello World"); // prints Hello World
   }
}

Spójrzmy, jak zapisać plik, skompilować i uruchomić program. Wykonaj kolejne kroki -

  • Otwórz notatnik i dodaj kod jak powyżej.

  • Zapisz plik jako: MyFirstJavaProgram.java.

  • Otwórz okno wiersza poleceń i przejdź do katalogu, w którym zapisałeś klasę. Załóżmy, że to C: \.

  • Wpisz „javac MyFirstJavaProgram.java” i naciśnij klawisz Enter, aby skompilować kod. Jeśli w kodzie nie ma błędów, wiersz polecenia przeniesie Cię do następnego wiersza (Założenie: zmienna ścieżki jest ustawiona).

  • Teraz wpisz „java MyFirstJavaProgram”, aby uruchomić program.

  • Będziesz mógł zobaczyć napis „Hello World” w oknie.

Wynik

C:\> javac MyFirstJavaProgram.java
C:\> java MyFirstJavaProgram 
Hello World

Podstawowa składnia

W przypadku programów w języku Java bardzo ważne jest, aby pamiętać o następujących kwestiach.

  • Case Sensitivity - Java rozróżnia wielkość liter, co oznacza identyfikator Hello i hello miałoby inne znaczenie w Javie.

  • Class Names- W przypadku wszystkich nazw klas pierwsza litera powinna być wielkimi literami. Jeśli do utworzenia nazwy klasy użyto kilku słów, pierwsza litera każdego wewnętrznego słowa powinna być pisana wielkimi literami.

    Example: klasa MyFirstJavaClass

  • Method Names- Wszystkie nazwy metod powinny zaczynać się małą literą. Jeśli do utworzenia nazwy metody użyto kilku słów, to pierwsza litera każdego wewnętrznego słowa powinna być pisana wielkimi literami.

    Example: public void myMethodName ()

  • Program File Name - Nazwa pliku programu powinna dokładnie odpowiadać nazwie klasy.

    Podczas zapisywania pliku należy go zapisać, używając nazwy klasy (pamiętaj, że w Javie jest rozróżniana wielkość liter) i na końcu nazwy dopisać `` .java '' (jeśli nazwa pliku i nazwa klasy nie zgadzają się, program nie będzie się kompilował ).

    Example:Załóżmy, że nazwą klasy jest „MyFirstJavaProgram”. Następnie plik powinien zostać zapisany jako „MyFirstJavaProgram.java”

  • public static void main(String args[]) - Przetwarzanie programu Java rozpoczyna się od metody main (), która jest obowiązkową częścią każdego programu Java.

Identyfikatory Java

Wszystkie komponenty Java wymagają nazw. Nazwy używane dla klas, zmiennych i metod są wywoływaneidentifiers.

W Javie jest kilka punktów, o których należy pamiętać o identyfikatorach. Są następujące -

  • Wszystkie identyfikatory powinny zaczynać się od litery (od A do Z lub od a do z), znaku waluty ($) lub podkreślenia (_).

  • Po pierwszym znaku identyfikatory mogą mieć dowolną kombinację znaków.

  • Słowa kluczowego nie można używać jako identyfikatora.

  • Co najważniejsze, w identyfikatorach rozróżniana jest wielkość liter.

  • Przykłady identyfikatorów prawnych: wiek, $ wynagrodzenie, _value, __1_value.

  • Przykłady nielegalnych identyfikatorów: 123abc, -salary.

Modyfikatory Java

Podobnie jak w przypadku innych języków, można modyfikować klasy, metody itp. Za pomocą modyfikatorów. Istnieją dwie kategorie modyfikatorów -

  • Access Modifiers - domyślny, publiczny, chroniony, prywatny

  • Non-access Modifiers - końcowe, abstrakcyjne, ścisłe

W następnej sekcji przyjrzymy się więcej szczegółom na temat modyfikatorów.

Zmienne Java

Poniżej przedstawiono typy zmiennych w Javie -

  • Zmienne lokalne
  • Zmienne klasowe (zmienne statyczne)
  • Zmienne instancji (zmienne niestatyczne)

Tablice Java

Tablice to obiekty przechowujące wiele zmiennych tego samego typu. Jednak sama tablica jest obiektem na stercie. W kolejnych rozdziałach przyjrzymy się, jak deklarować, konstruować i inicjować.

Java Enums

Wyliczenia zostały wprowadzone w Javie 5.0. Wyliczenia ograniczają zmienną, aby miała tylko jedną z kilku wstępnie zdefiniowanych wartości. Wartości na tej wyliczonej liście nazywane są wyliczeniami.

Za pomocą wyliczeń można zmniejszyć liczbę błędów w kodzie.

Na przykład, jeśli weźmiemy pod uwagę wniosek o sklep ze świeżymi sokami, możliwe byłoby ograniczenie rozmiaru szklanki do małego, średniego i dużego. Dzięki temu nikt nie będzie mógł zamówić innego rozmiaru niż mały, średni lub duży.

Przykład

class FreshJuice {
   enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
   FreshJuiceSize size;
}

public class FreshJuiceTest {

   public static void main(String args[]) {
      FreshJuice juice = new FreshJuice();
      juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
      System.out.println("Size: " + juice.size);
   }
}

Powyższy przykład da następujący wynik -

Wynik

Size: MEDIUM

Note- Wyliczenia można zadeklarować jako własne lub wewnątrz klasy. Metody, zmienne, konstruktory można także definiować wewnątrz wyliczeń.

Słowa kluczowe Java

Poniższa lista przedstawia słowa zastrzeżone w Javie. Te zarezerwowane słowa nie mogą być używane jako stałe, zmienne ani żadne inne nazwy identyfikatorów.

abstrakcyjny zapewniać boolean przerwa
bajt walizka łapać zwęglać
klasa konst kontyntynuj domyślna
zrobić podwójnie jeszcze enum
rozciąga się finał Wreszcie pływak
dla iść do gdyby przybory
import wystąpienie int berło
długo ojczysty Nowy pakiet
prywatny chroniony publiczny powrót
krótki statyczny ścisłefp Wspaniały
przełącznik zsynchronizowane to rzucać
rzuca przejściowy próbować unieważnić
lotny podczas

Komentarze w Javie

Java obsługuje jednowierszowe i wielowierszowe komentarze bardzo podobne do C i C ++. Wszystkie znaki dostępne w komentarzach są ignorowane przez kompilator Java.

Przykład

public class MyFirstJavaProgram {

   /* This is my first java program.
    * This will print 'Hello World' as the output
    * This is an example of multi-line comments.
    */

   public static void main(String []args) {
      // This is an example of single line comment
      /* This is also an example of single line comment. */
      System.out.println("Hello World");
   }
}

Wynik

Hello World

Korzystanie z pustych linii

Linia zawierająca tylko odstępy, ewentualnie z komentarzem, jest nazywana pustą linią i Java całkowicie ją ignoruje.

Dziedzictwo

W Javie klasy mogą pochodzić z klas. Zasadniczo, jeśli potrzebujesz utworzyć nową klasę, a tutaj jest już klasa, która zawiera część wymaganego kodu, możesz wyprowadzić nową klasę z już istniejącego kodu.

Ta koncepcja pozwala na ponowne użycie pól i metod istniejącej klasy bez konieczności przepisywania kodu w nowej klasie. W tym scenariuszu istniejąca klasa nosi nazwęsuperclass a klasa pochodna nosi nazwę subclass.

Interfejsy

W języku Java interfejs można zdefiniować jako kontrakt między obiektami dotyczący sposobu komunikacji między sobą. Interfejsy odgrywają istotną rolę, jeśli chodzi o pojęcie dziedziczenia.

Interfejs definiuje metody, których powinna używać klasa pochodna (podklasa). Ale implementacja metod zależy całkowicie od podklasy.

Co jest następne?

W następnej sekcji wyjaśniono obiekty i klasy w programowaniu w języku Java. Pod koniec sesji będziesz mógł uzyskać jasny obraz tego, czym są obiekty, a jakie klasy w Javie.

Java to język zorientowany obiektowo. Jako język posiadający funkcję zorientowaną obiektowo, Java obsługuje następujące podstawowe pojęcia -

  • Polymorphism
  • Inheritance
  • Encapsulation
  • Abstraction
  • Classes
  • Objects
  • Instance
  • Method
  • Przekazywanie wiadomości

W tym rozdziale przyjrzymy się pojęciom - klasom i obiektom.

  • Object- Przedmioty mają stany i zachowania. Przykład: Pies ma stany - maść, imię, rasę, a także zachowania - merdanie ogonem, szczekanie, jedzenie. Obiekt jest instancją klasy.

  • Class - Klasę można zdefiniować jako szablon / schemat opisujący zachowanie / stan, które obiekt tego typu obsługuje.

Obiekty w Javie

Przyjrzyjmy się teraz głęboko, czym są przedmioty. Jeśli weźmiemy pod uwagę świat rzeczywisty, możemy znaleźć wiele obiektów wokół nas, samochodów, psów, ludzi itp. Wszystkie te obiekty mają stan i zachowanie.

Jeśli weźmiemy pod uwagę psa, to jego stan to - imię, rasa, maść, a zachowanie to - szczekanie, merdanie ogonem, bieganie.

Jeśli porównasz obiekt oprogramowania z obiektem świata rzeczywistego, mają one bardzo podobne cechy.

Obiekty oprogramowania mają również stan i zachowanie. Stan obiektu oprogramowania jest przechowywany w polach, a zachowanie jest przedstawiane za pomocą metod.

Tak więc w tworzeniu oprogramowania metody działają na wewnętrznym stanie obiektu, a komunikacja obiekt-obiekt odbywa się za pomocą metod.

Zajęcia w Javie

Klasa to plan, z którego tworzone są poszczególne obiekty.

Poniżej znajduje się próbka klasy.

Przykład

public class Dog {
   String breed;
   int age;
   String color;

   void barking() {
   }

   void hungry() {
   }

   void sleeping() {
   }
}

Klasa może zawierać dowolny z następujących typów zmiennych.

  • Local variables- Zmienne zdefiniowane wewnątrz metod, konstruktorów lub bloków nazywane są zmiennymi lokalnymi. Zmienna zostanie zadeklarowana i zainicjowana w ramach metody, a zmienna zostanie zniszczona po zakończeniu metody.

  • Instance variables- Zmienne instancji to zmienne w klasie, ale poza żadną metodą. Te zmienne są inicjowane podczas tworzenia wystąpienia klasy. Dostęp do zmiennych instancji można uzyskać z wnętrza dowolnej metody, konstruktora lub bloków tej konkretnej klasy.

  • Class variables - Zmienne klasy to zmienne zadeklarowane w klasie, poza jakąkolwiek metodą, za pomocą słowa kluczowego static.

Klasa może mieć dowolną liczbę metod dostępu do wartości różnych rodzajów metod. W powyższym przykładzie metody barking (), hungry () i sleeping ().

Poniżej znajduje się kilka ważnych tematów, które należy omówić, analizując klasy języka Java.

Konstruktorzy

Podczas omawiania zajęć jednym z najważniejszych podtematów będą konstruktorzy. Każda klasa ma konstruktora. Jeśli nie napiszemy jawnie konstruktora dla klasy, kompilator Java utworzy domyślny konstruktor dla tej klasy.

Za każdym razem, gdy tworzony jest nowy obiekt, zostanie wywołany co najmniej jeden konstruktor. Główną zasadą konstruktorów jest to, że powinny mieć taką samą nazwę jak klasa. Klasa może mieć więcej niż jednego konstruktora.

Poniżej znajduje się przykład konstruktora -

Przykład

public class Puppy {
   public Puppy() {
   }

   public Puppy(String name) {
      // This constructor has one parameter, name.
   }
}

Java obsługuje również klasy singleton, w których można utworzyć tylko jedną instancję klasy.

Note- Mamy dwa różne typy konstruktorów. W kolejnych rozdziałach szczegółowo omówimy konstruktorów.

Tworzenie obiektu

Jak wspomniano wcześniej, klasa zapewnia plany obiektów. Zasadniczo obiekt jest tworzony z klasy. W Javie słowo kluczowe new służy do tworzenia nowych obiektów.

Tworzenie obiektu z klasy składa się z trzech kroków -

  • Declaration - Deklaracja zmiennej z nazwą zmiennej i typem obiektu.

  • Instantiation - Słowo kluczowe „new” służy do tworzenia obiektu.

  • Initialization- Po słowie kluczowym „new” następuje wywołanie konstruktora. To wywołanie inicjuje nowy obiekt.

Poniżej znajduje się przykład tworzenia obiektu -

Przykład

public class Puppy {
   public Puppy(String name) {
      // This constructor has one parameter, name.
      System.out.println("Passed Name is :" + name );
   }

   public static void main(String []args) {
      // Following statement would create an object myPuppy
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

Jeśli skompilujemy i uruchomimy powyższy program, da on następujący wynik -

Wynik

Passed Name is :tommy

Dostęp do zmiennych i metod instancji

Dostęp do zmiennych i metod instancji uzyskuje się za pośrednictwem utworzonych obiektów. Aby uzyskać dostęp do zmiennej instancji, poniżej znajduje się w pełni kwalifikowana ścieżka -

/* First create an object */
ObjectReference = new Constructor();

/* Now call a variable as follows */
ObjectReference.variableName;

/* Now you can call a class method as follows */
ObjectReference.MethodName();

Przykład

W tym przykładzie wyjaśniono, jak uzyskać dostęp do zmiennych instancji i metod klasy.

public class Puppy {
   int puppyAge;

   public Puppy(String name) {
      // This constructor has one parameter, name.
      System.out.println("Name chosen is :" + name );
   }

   public void setAge( int age ) {
      puppyAge = age;
   }

   public int getAge( ) {
      System.out.println("Puppy's age is :" + puppyAge );
      return puppyAge;
   }

   public static void main(String []args) {
      /* Object creation */
      Puppy myPuppy = new Puppy( "tommy" );

      /* Call class method to set puppy's age */
      myPuppy.setAge( 2 );

      /* Call another class method to get puppy's age */
      myPuppy.getAge( );

      /* You can access instance variable as follows as well */
      System.out.println("Variable Value :" + myPuppy.puppyAge );
   }
}

Jeśli skompilujemy i uruchomimy powyższy program, da on następujący wynik -

Wynik

Name chosen is :tommy
Puppy's age is :2
Variable Value :2

Zasady deklaracji pliku źródłowego

W ostatniej części tej sekcji przyjrzyjmy się teraz regułom deklaracji plików źródłowych. Reguły te są niezbędne podczas deklarowania klas, instrukcji importu i instrukcji pakietów w pliku źródłowym.

  • W pliku źródłowym może istnieć tylko jedna klasa publiczna.

  • Plik źródłowy może mieć wiele niepublicznych klas.

  • Publiczna nazwa klasy powinna być również nazwą pliku źródłowego, do której należy dołączyć .javana końcu. Na przykład: nazwa klasy to public class Employee {}, wówczas plik źródłowy powinien mieć nazwę Employee.java.

  • Jeśli klasa jest zdefiniowana w pakiecie, instrukcja pakietu powinna być pierwszą instrukcją w pliku źródłowym.

  • Jeśli istnieją instrukcje importu, należy je zapisać między instrukcją pakietu a deklaracją klasy. Jeśli nie ma instrukcji dotyczących pakietu, instrukcja importu powinna znajdować się w pierwszym wierszu pliku źródłowego.

  • Instrukcje importu i pakietu będą dotyczyły wszystkich klas obecnych w pliku źródłowym. Nie jest możliwe zadeklarowanie różnych instrukcji importu i / lub pakietu dla różnych klas w pliku źródłowym.

Klasy mają kilka poziomów dostępu i są różne typy zajęć; klasy abstrakcyjne, klasy końcowe itp. O tym wszystkim będziemy mówić w rozdziale o modyfikatorach dostępu.

Oprócz wyżej wymienionych typów klas, Java posiada również specjalne klasy zwane klasami wewnętrznymi i klasami anonimowymi.

Pakiet Java

Krótko mówiąc, jest to sposób kategoryzowania klas i interfejsów. Podczas tworzenia aplikacji w Javie zostaną napisane setki klas i interfejsów, dlatego kategoryzowanie tych klas jest koniecznością i znacznie ułatwia życie.

Import wyciągów

W Javie, jeśli podana jest w pełni kwalifikowana nazwa, która zawiera pakiet i nazwę klasy, kompilator może łatwo zlokalizować kod lub klasy źródłowe. Instrukcja Import to sposób na podanie kompilatorowi właściwej lokalizacji w celu znalezienia tej konkretnej klasy.

Na przykład poniższy wiersz poprosiłby kompilator o załadowanie wszystkich klas dostępnych w katalogu java_installation / java / io -

import java.io.*;

Proste studium przypadku

Na potrzeby naszego studium przypadku utworzymy dwie klasy. Są to Test Pracownika i Pracownika.

Najpierw otwórz notatnik i dodaj następujący kod. Pamiętaj, że to jest klasa pracownika, a klasa jest klasą publiczną. Teraz zapisz ten plik źródłowy pod nazwą Employee.java.

Klasa Employee zawiera cztery zmienne instancji - imię i nazwisko, wiek, stanowisko i wynagrodzenie. Klasa ma jeden jawnie zdefiniowany konstruktor, który przyjmuje parametr.

Przykład

import java.io.*;
public class Employee {

   String name;
   int age;
   String designation;
   double salary;

   // This is the constructor of the class Employee
   public Employee(String name) {
      this.name = name;
   }

   // Assign the age of the Employee  to the variable age.
   public void empAge(int empAge) {
      age = empAge;
   }

   /* Assign the designation to the variable designation.*/
   public void empDesignation(String empDesig) {
      designation = empDesig;
   }

   /* Assign the salary to the variable	salary.*/
   public void empSalary(double empSalary) {
      salary = empSalary;
   }

   /* Print the Employee details */
   public void printEmployee() {
      System.out.println("Name:"+ name );
      System.out.println("Age:" + age );
      System.out.println("Designation:" + designation );
      System.out.println("Salary:" + salary);
   }
}

Jak wspomniano wcześniej w tym samouczku, przetwarzanie rozpoczyna się od metody głównej. Dlatego, abyśmy mogli uruchomić tę klasę Employee, powinna istnieć główna metoda i powinny zostać utworzone obiekty. Będziemy tworzyć osobną klasę do tych zadań.

Poniżej znajduje się klasa EmployeeTest , która tworzy dwie instancje klasy Employee i wywołuje metody dla każdego obiektu w celu przypisania wartości każdej zmiennej.

Zapisz następujący kod w pliku EmployeeTest.java.

import java.io.*;
public class EmployeeTest {

   public static void main(String args[]) {
      /* Create two objects using constructor */
      Employee empOne = new Employee("James Smith");
      Employee empTwo = new Employee("Mary Anne");

      // Invoking methods for each object created
      empOne.empAge(26);
      empOne.empDesignation("Senior Software Engineer");
      empOne.empSalary(1000);
      empOne.printEmployee();

      empTwo.empAge(21);
      empTwo.empDesignation("Software Engineer");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

Teraz skompiluj obie klasy, a następnie uruchom EmployeeTest, aby zobaczyć wynik w następujący sposób -

Wynik

C:\> javac Employee.java
C:\> javac EmployeeTest.java
C:\> java EmployeeTest
Name:James Smith
Age:26
Designation:Senior Software Engineer
Salary:1000.0
Name:Mary Anne
Age:21
Designation:Software Engineer
Salary:500.0

Co jest następne?

W następnej sesji omówimy podstawowe typy danych w Javie i sposoby ich wykorzystania podczas tworzenia aplikacji Java.

Konstruktor inicjuje obiekt podczas jego tworzenia. Ma taką samą nazwę jak jego klasa i jest składniowo podobny do metody. Jednak konstruktory nie mają jawnego typu zwracanego.

Zwykle konstruktor będzie używany do nadawania wartości początkowych zmiennym instancji zdefiniowanym przez klasę lub do wykonywania innych procedur startowych wymaganych do utworzenia w pełni uformowanego obiektu.

Wszystkie klasy mają konstruktory, niezależnie od tego, czy je zdefiniujesz, czy nie, ponieważ Java automatycznie udostępnia domyślny konstruktor, który inicjuje wszystkie zmienne składowe na zero. Jednak po zdefiniowaniu własnego konstruktora domyślny konstruktor nie jest już używany.

Składnia

Poniżej znajduje się składnia konstruktora -

class ClassName {
   ClassName() {
   }
}

Java pozwala na dwa typy konstruktorów, a mianowicie -

  • Brak konstruktorów argumentów
  • Sparametryzowane konstruktory

Brak konstruktorów argumentów

Ponieważ nazwa określa, że ​​konstruktory bez argumentów języka Java nie akceptują żadnych parametrów zamiast tego, przy użyciu tych konstruktorów zmienne instancji metody zostaną zainicjowane stałymi wartościami dla wszystkich obiektów.

Przykład

Public class MyClass {
   Int num;
   MyClass() {
      num = 100;
   }
}

Możesz wywołać konstruktora w celu zainicjowania obiektów w następujący sposób

public class ConsDemo {
   public static void main(String args[]) {
      MyClass t1 = new MyClass();
      MyClass t2 = new MyClass();
      System.out.println(t1.num + " " + t2.num);
   }
}

Dałoby to następujący wynik

100 100

Sparametryzowane konstruktory

Najczęściej będziesz potrzebować konstruktora, który akceptuje jeden lub więcej parametrów. Parametry są dodawane do konstruktora w taki sam sposób, w jaki są dodawane do metody, wystarczy zadeklarować je w nawiasach po nazwie konstruktora.

Przykład

Oto prosty przykład wykorzystujący konstruktor -

// A simple constructor.
class MyClass {
   int x;
   
   // Following is the constructor
   MyClass(int i ) {
      x = i;
   }
}

Możesz wywołać konstruktora, aby zainicjować obiekty w następujący sposób -

public class ConsDemo {
   public static void main(String args[]) {
      MyClass t1 = new MyClass( 10 );
      MyClass t2 = new MyClass( 20 );
      System.out.println(t1.x + " " + t2.x);
   }
}

Dałoby to następujący wynik -

10 20

Zmienne to nic innego jak zarezerwowane miejsca w pamięci do przechowywania wartości. Oznacza to, że kiedy tworzysz zmienną, rezerwujesz trochę miejsca w pamięci.

Na podstawie typu danych zmiennej system operacyjny przydziela pamięć i decyduje, co może być przechowywane w zarezerwowanej pamięci. Dlatego przypisując różne typy danych do zmiennych, można przechowywać w tych zmiennych liczby całkowite, dziesiętne lub znaki.

W Javie dostępne są dwa typy danych -

  • Prymitywne typy danych
  • Typy danych referencyjnych / opisowych

Prymitywne typy danych

Istnieje osiem prymitywnych typów danych obsługiwanych przez Javę. Prymitywne typy danych są predefiniowane przez język i nazywane słowami kluczowymi. Przyjrzyjmy się teraz szczegółowo ośmiu prymitywnym typom danych.

bajt

  • Typ danych Byte to 8-bitowa liczba całkowita z dopełnieniem do dwóch ze znakiem

  • Minimalna wartość to -128 (-2 ^ 7)

  • Maksymalna wartość to 127 (włącznie) (2 ^ 7-1)

  • Wartość domyślna to 0

  • Typ danych bajt jest używany do oszczędzania miejsca w dużych tablicach, głównie zamiast liczb całkowitych, ponieważ bajt jest cztery razy mniejszy niż liczba całkowita.

  • Przykład: bajt a = 100, bajt b = -50

krótki

  • Krótki typ danych to 16-bitowa liczba całkowita z dopełnieniem do dwóch ze znakiem

  • Minimalna wartość to -32 768 (-2 ^ 15)

  • Maksymalna wartość to 32767 (włącznie) (2 ^ 15-1)

  • Krótki typ danych może również służyć do oszczędzania pamięci jako typ danych bajtowych. Krótki jest 2 razy mniejszy niż liczba całkowita

  • Wartość domyślna to 0.

  • Przykład: krótki s = 10000, krótki r = -20000

int

  • Typ danych Int to 32-bitowa liczba całkowita dopełniająca do dwóch ze znakiem.

  • Minimalna wartość to - 2 147 483 648 (-2 ^ 31)

  • Wartość maksymalna to 2 147 483 647 (włącznie) (2 ^ 31–1)

  • Liczba całkowita jest zwykle używana jako domyślny typ danych dla wartości całkowitych, chyba że istnieją obawy dotyczące pamięci.

  • Wartość domyślna to 0

  • Przykład: int a = 100000, int b = -200000

długo

  • Długi typ danych to 64-bitowa liczba całkowita uzupełniająca do dwóch ze znakiem
  • Minimalna wartość to -9 223 372 036 854 775 808 (-2 ^ 63)
  • Wartość maksymalna to 9 223 372 036 854 775 807 (włącznie) (2 ^ 63-1)
  • Ten typ jest używany, gdy potrzebny jest szerszy zakres niż int
  • Wartość domyślna to 0L
  • Przykład: długi a = 100000L, długi b = -200000L

pływak

  • Typ danych zmiennoprzecinkowych to 32-bitowy zmiennoprzecinkowy IEEE 754 o pojedynczej precyzji

  • Float jest używany głównie do oszczędzania pamięci w dużych tablicach liczb zmiennoprzecinkowych

  • Wartość domyślna to 0,0f

  • Typ danych zmiennoprzecinkowych nigdy nie jest używany w przypadku dokładnych wartości, takich jak waluta

  • Przykład: float f1 = 234,5f

podwójnie

  • typ danych double to 64-bitowy zmiennoprzecinkowy podwójnej precyzji IEEE 754

  • Ten typ danych jest zwykle używany jako domyślny typ danych dla wartości dziesiętnych, zazwyczaj jest to wybór domyślny

  • Podwójny typ danych nigdy nie powinien być używany dla dokładnych wartości, takich jak waluta

  • Wartość domyślna to 0,0d

  • Przykład: podwójne d1 = 123,4

boolean

  • logiczny typ danych reprezentuje jeden bit informacji
  • Istnieją tylko dwie możliwe wartości: prawda i fałsz
  • Ten typ danych jest używany dla prostych flag, które śledzą warunki prawda / fałsz
  • Wartość domyślna to false
  • Przykład: boolean one = true

zwęglać

  • typ danych char to pojedynczy 16-bitowy znak Unicode
  • Minimalna wartość to „\ u0000” (lub 0)
  • Maksymalna wartość to „\ uffff” (lub 65 535 włącznie)
  • Typ danych Char jest używany do przechowywania dowolnego znaku
  • Przykład: litera A = 'A'

Typy danych odniesienia

  • Zmienne referencyjne są tworzone przy użyciu zdefiniowanych konstruktorów klas. Służą do uzyskiwania dostępu do obiektów. Te zmienne mają określony typ, którego nie można zmienić. Na przykład pracownik, szczeniak itp.

  • Obiekty klas i różne typy zmiennych tablicowych należą do referencyjnego typu danych.

  • Wartość domyślna dowolnej zmiennej odniesienia to null.

  • Zmienna referencyjna może służyć do odwoływania się do dowolnego obiektu zadeklarowanego typu lub dowolnego zgodnego typu.

  • Przykład: Zwierzę zwierzę = nowe Zwierzę („żyrafa”);

Literały Java

Literał to reprezentacja stałej wartości w kodzie źródłowym. Są reprezentowane bezpośrednio w kodzie, bez żadnych obliczeń.

Literały można przypisać do dowolnej zmiennej typu pierwotnego. Na przykład -

byte a = 68;
char a = 'A';

bajt, int, long i short mogą być również wyrażone w systemie dziesiętnym (podstawa 10), szesnastkowym (podstawa 16) lub ósemkowym (podstawa 8).

Przedrostek 0 jest używany do wskazania liczby ósemkowej, a przedrostek 0x oznacza szesnastkowy, gdy używa się tych systemów liczbowych do literałów. Na przykład -

int decimal = 100;
int octal = 0144;
int hexa =  0x64;

Literały łańcuchowe w Javie są określane tak, jak w większości innych języków, przez umieszczenie sekwencji znaków między podwójnymi cudzysłowami. Przykłady literałów ciągów to -

Przykład

"Hello World"
"two\nlines"
"\"This is in quotes\""

Typy literałów typu string i char mogą zawierać dowolne znaki Unicode. Na przykład -

char a = '\u0001';
String a = "\u0001";

Język Java obsługuje również kilka specjalnych sekwencji ucieczki dla literałów typu String i char. Oni są -

Notacja Przedstawiony charakter
\ n Nowa linia (0x0a)
\ r Powrót karetki (0x0d)
\fa Formfeed (0x0c)
\b Backspace (0x08)
\ s Spacja (0x20)
\ t patka
\ " Cudzysłów
\ ' Pojedynczy cudzysłów
\\ ukośnik wsteczny
\ ddd Znak ósemkowy (DDD)
\ uxxxx Znak szesnastkowy UNICODE (xxxx)

Co jest następne?

W tym rozdziale wyjaśniono różne typy danych. Następny temat wyjaśnia różne typy zmiennych i ich zastosowanie. To pozwoli ci dobrze zrozumieć, w jaki sposób można ich używać w klasach Java, interfejsach itp.

Zmienna zapewnia nam nazwane miejsce do przechowywania, którym nasze programy mogą manipulować. Każda zmienna w Javie ma określony typ, który określa rozmiar i układ pamięci zmiennej; zakres wartości, które mogą być przechowywane w tej pamięci; oraz zestaw operacji, które można zastosować do zmiennej.

Musisz zadeklarować wszystkie zmienne, zanim będą mogły zostać użyte. Poniżej znajduje się podstawowa forma deklaracji zmiennej -

data type variable [ = value][, variable [ = value] ...] ;

Tutaj typ danych to jeden z typów danych Javy, a zmienna to nazwa zmiennej. Aby zadeklarować więcej niż jedną zmienną określonego typu, możesz użyć listy oddzielonej przecinkami.

Poniżej znajdują się prawidłowe przykłady deklaracji zmiennych i inicjalizacji w Javie -

Przykład

int a, b, c;         // Declares three ints, a, b, and c.
int a = 10, b = 10;  // Example of initialization
byte B = 22;         // initializes a byte type variable B.
double pi = 3.14159; // declares and assigns a value of PI.
char a = 'A';        // the char variable a iis initialized with value 'a'

W tym rozdziale wyjaśniono różne typy zmiennych dostępne w języku Java. W Javie istnieją trzy rodzaje zmiennych -

  • Zmienne lokalne
  • Zmienne instancji
  • Zmienne klasowe / statyczne

Zmienne lokalne

  • Zmienne lokalne są deklarowane w metodach, konstruktorach lub blokach.

  • Zmienne lokalne są tworzone po wprowadzeniu metody, konstruktora lub bloku, a zmienna zostanie zniszczona po wyjściu z metody, konstruktora lub bloku.

  • Modyfikatorów dostępu nie można używać do zmiennych lokalnych.

  • Zmienne lokalne są widoczne tylko w zadeklarowanej metodzie, konstruktorze lub bloku.

  • Zmienne lokalne są implementowane wewnętrznie na poziomie stosu.

  • Nie ma wartości domyślnej dla zmiennych lokalnych, dlatego należy zadeklarować zmienne lokalne i przypisać wartość początkową przed pierwszym użyciem.

Przykład

Tutaj wiek jest zmienną lokalną. Jest to zdefiniowane w metodzie pupAge () , a jej zakres jest ograniczony tylko do tej metody.

public class Test {
   public void pupAge() {
      int age = 0;
      age = age + 7;
      System.out.println("Puppy age is : " + age);
   }

   public static void main(String args[]) {
      Test test = new Test();
      test.pupAge();
   }
}

To da następujący wynik -

Wynik

Puppy age is: 7

Przykład

Poniższy przykład używa age bez inicjowania go, więc wystąpiłby błąd w czasie kompilacji.

public class Test {
   public void pupAge() {
      int age;
      age = age + 7;
      System.out.println("Puppy age is : " + age);
   }

   public static void main(String args[]) {
      Test test = new Test();
      test.pupAge();
   }
}

Spowoduje to następujący błąd podczas kompilacji -

Wynik

Test.java:4:variable number might not have been initialized
age = age + 7;
         ^
1 error

Zmienne instancji

  • Zmienne instancji są deklarowane w klasie, ale poza metodą, konstruktorem lub dowolnym blokiem.

  • Kiedy miejsce jest przydzielane dla obiektu w stercie, tworzony jest boks dla wartości zmiennej każdej instancji.

  • Zmienne instancji są tworzone, gdy obiekt jest tworzony przy użyciu słowa kluczowego „nowy” i niszczony, gdy obiekt jest niszczony.

  • Zmienne instancji przechowują wartości, do których musi odwoływać się więcej niż jedna metoda, konstruktor lub blok, lub istotne części stanu obiektu, które muszą być obecne w całej klasie.

  • Zmienne instancji można zadeklarować na poziomie klasy przed lub po użyciu.

  • Modyfikatory dostępu można podać dla zmiennych instancji.

  • Zmienne instancji są widoczne dla wszystkich metod, konstruktorów i bloków w klasie. Zwykle zaleca się, aby te zmienne były prywatne (poziom dostępu). Jednak widoczność dla podklas można zapewnić dla tych zmiennych za pomocą modyfikatorów dostępu.

  • Zmienne instancji mają wartości domyślne. W przypadku liczb wartością domyślną jest 0, dla wartości logicznych jest to fałsz, a dla odniesień do obiektów jest to zero. Wartości można przypisać podczas deklaracji lub w konstruktorze.

  • Dostęp do zmiennych instancji można uzyskać bezpośrednio, wywołując nazwę zmiennej wewnątrz klasy. Jednak w ramach metod statycznych (gdy zmienne instancji są dostępne) powinny być wywoływane przy użyciu w pełni kwalifikowanej nazwy. ObjectReference.VariableName .

Przykład

import java.io.*;
public class Employee {

   // this instance variable is visible for any child class.
   public String name;

   // salary  variable is visible in Employee class only.
   private double salary;

   // The name variable is assigned in the constructor.
   public Employee (String empName) {
      name = empName;
   }

   // The salary variable is assigned a value.
   public void setSalary(double empSal) {
      salary = empSal;
   }

   // This method prints the employee details.
   public void printEmp() {
      System.out.println("name  : " + name );
      System.out.println("salary :" + salary);
   }

   public static void main(String args[]) {
      Employee empOne = new Employee("Ransika");
      empOne.setSalary(1000);
      empOne.printEmp();
   }
}

To da następujący wynik -

Wynik

name  : Ransika
salary :1000.0

Zmienne klasowe / statyczne

  • Zmienne klas, znane również jako zmienne statyczne, są deklarowane za pomocą słowa kluczowego static w klasie, ale poza metodą, konstruktorem lub blokiem.

  • W każdej klasie istniałaby tylko jedna kopia każdej zmiennej klasowej, niezależnie od tego, ile obiektów zostało z niej utworzonych.

  • Zmienne statyczne są rzadko używane inaczej niż deklarowane jako stałe. Stałe to zmienne zadeklarowane jako publiczne / prywatne, końcowe i statyczne. Zmienne stałe nigdy nie zmieniają swojej wartości początkowej.

  • Zmienne statyczne są przechowywane w pamięci statycznej. Rzadko stosuje się zmienne statyczne inne niż zadeklarowane jako ostateczne i używane jako stałe publiczne lub prywatne.

  • Zmienne statyczne są tworzone podczas uruchamiania programu i niszczone, gdy program się zatrzymuje.

  • Widoczność jest podobna do zmiennych instancji. Jednak większość zmiennych statycznych jest deklarowanych jako publiczne, ponieważ muszą być dostępne dla użytkowników klasy.

  • Wartości domyślne są takie same, jak zmienne instancji. W przypadku liczb wartość domyślna to 0; dla Booleów to fałsz; a dla odniesień do obiektów jest zerowa. Wartości można przypisać podczas deklaracji lub w konstruktorze. Ponadto wartości można przypisać w specjalnych statycznych blokach inicjalizujących.

  • Dostęp do zmiennych statycznych można uzyskać, wywołując nazwę klasy ClassName.VariableName .

  • Podczas deklarowania zmiennych klas jako publiczne statyczne końcowe nazwy zmiennych (stałe) są pisane wielkimi literami. Jeśli zmienne statyczne nie są publiczne i ostateczne, składnia nazewnictwa jest taka sama, jak zmienne instancji i zmiennych lokalnych.

Przykład

import java.io.*;
public class Employee {

   // salary  variable is a private static variable
   private static double salary;

   // DEPARTMENT is a constant
   public static final String DEPARTMENT = "Development ";

   public static void main(String args[]) {
      salary = 1000;
      System.out.println(DEPARTMENT + "average salary:" + salary);
   }
}

To da następujący wynik -

Wynik

Development average salary:1000

Note - Jeśli dostęp do zmiennych uzyskuje się z zewnętrznej klasy, do stałej należy mieć dostęp jako Employee.DEPARTMENT

Co jest następne?

Użyłeś już modyfikatorów dostępu (publicznych i prywatnych) w tym rozdziale. W następnym rozdziale szczegółowo omówimy modyfikatory dostępu i modyfikatory braku dostępu.

Modyfikatory to słowa kluczowe, które dodajesz do tych definicji, aby zmienić ich znaczenie. Język Java ma wiele różnych modyfikatorów, w tym następujące -

  • Modyfikatory dostępu Java

  • Modyfikatory bez dostępu

Aby użyć modyfikatora, należy dołączyć jego słowo kluczowe do definicji klasy, metody lub zmiennej. Modyfikator poprzedza resztę instrukcji, jak w poniższym przykładzie.

Przykład

public class className {
   // ...
}

private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;

public static void main(String[] arguments) {
   // body of method
}

Modyfikatory kontroli dostępu

Java udostępnia wiele modyfikatorów dostępu do ustawiania poziomów dostępu dla klas, zmiennych, metod i konstruktorów. Cztery poziomy dostępu to -

  • Widoczny dla pakietu, domyślnie. Nie są potrzebne żadne modyfikatory.
  • Widoczne tylko dla klasy (prywatne).
  • Widoczne dla świata (publiczne).
  • Widoczne dla pakietu i wszystkich podklas (chronione).

Modyfikatory braku dostępu

Java udostępnia wiele modyfikatorów nie związanych z dostępem, aby uzyskać wiele innych funkcji.

  • Statyczne modyfikator tworzenia klasy metod i zmiennych.

  • Końcowy modyfikator sfinalizowania implementacje klas, metod i zmiennych.

  • Streszczenie modyfikator do tworzenia abstrakcyjnych klas i metod.

  • Do synchronicznych i lotne modyfikatory, które są stosowane do gwintów.

Co jest następne?

W następnej sekcji będziemy omawiać podstawowe operatory używane w języku Java. Rozdział ten zawiera przegląd sposobów wykorzystania tych operatorów podczas tworzenia aplikacji.

Java udostępnia bogaty zestaw operatorów do manipulowania zmiennymi. Możemy podzielić wszystkie operatory Java na następujące grupy -

  • Operatory arytmetyczne
  • Operatorzy relacyjni
  • Operatory bitowe
  • Operatory logiczne
  • Operatory przypisania
  • Różne operatory

Operatory arytmetyczne

Operatory arytmetyczne są używane w wyrażeniach matematycznych w taki sam sposób, jak w algebrze. W poniższej tabeli wymieniono operatory arytmetyczne -

Załóżmy, że zmienna całkowita A zawiera 10, a zmienna B 20, a następnie -

Pokaż przykłady

Operator Opis Przykład
+ (Dodawanie) Dodaje wartości po obu stronach operatora. A + B da 30
- (odejmowanie) Odejmuje operand po prawej stronie od operandu po lewej stronie. A - B da -10
* (Mnożenie) Mnoży wartości po obu stronach operatora. A * B da 200
/ (Podział) Dzieli operand po lewej stronie przez operand po prawej stronie. B / A da 2
% (Moduł) Dzieli operand po lewej stronie przez operand po prawej stronie i zwraca resztę. B% A da 0
++ (przyrost) Zwiększa wartość operandu o 1. B ++ daje 21
- (Zmniejsz) Zmniejsza wartość operandu o 1. B-- daje 19

Operatory relacyjne

Istnieją następujące operatory relacyjne obsługiwane przez język Java.

Załóżmy, że zmienna A zawiera 10, a zmienna B 20, a następnie -

Pokaż przykłady

Operator Opis Przykład
== (równe) Sprawdza, czy wartości dwóch operandów są równe, czy nie, jeśli tak, warunek staje się prawdziwy. (A == B) nie jest prawdą.
! = (różne od) Sprawdza, czy wartości dwóch operandów są równe, czy nie, jeśli wartości nie są równe, warunek staje się prawdziwy. (A! = B) jest prawdą.
> (większe niż) Sprawdza, czy wartość lewego operandu jest większa niż wartość prawego operandu, jeśli tak, warunek staje się prawdziwy. (A> B) nie jest prawdą.
<(mniej niż) Sprawdza, czy wartość lewego operandu jest mniejsza niż wartość prawego operandu. Jeśli tak, warunek staje się prawdziwy. (A <B) jest prawdą.
> = (większe lub równe) Sprawdza, czy wartość lewego operandu jest większa lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. (A> = B) nie jest prawdą.
<= (mniejsze lub równe) Sprawdza, czy wartość lewego operandu jest mniejsza lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. (A <= B) jest prawdą.

Operatory bitowe

Java definiuje kilka operatorów bitowych, które można zastosować do typów całkowitych, long, int, short, char i byte.

Operator bitowy działa na bitach i wykonuje operacje bit po bicie. Załóżmy, że a = 60 i b = 13; teraz w formacie binarnym będą wyglądać następująco -

a = 0011 1100

b = 0000 1101

-----------------

a & b = 0000 1100

a | b = 0011 1101

a ^ b = 0011 0001

~ a = 1100 0011

W poniższej tabeli wymieniono operatory bitowe -

Załóżmy, że zmienna całkowita A ma 60, a zmienna B zawiera 13, a następnie -

Pokaż przykłady

Operator Opis Przykład
& (bitowe i) Operator binarny AND kopiuje trochę do wyniku, jeśli istnieje w obu operandach. (A i B) dadzą 12, czyli 0000 1100
| (bitowe lub) Operator binarny OR kopiuje bit, jeśli istnieje w którymkolwiek operandzie. (A | B) da 61, czyli 0011 1101
^ (bitowy XOR) Binarny operator XOR kopiuje bit, jeśli jest ustawiony w jednym operandzie, ale nie w obu. (A ^ B) da 49, czyli 0011 0001
~ (komplement bitowy) Operator dopełniacza binarnego jest jednoargumentowy i powoduje „odwracanie” bitów. (~ A) da -61, czyli 1100 0011 w postaci uzupełnienia do 2 ze względu na liczbę binarną ze znakiem.
<< (przesunięcie w lewo) Binarny operator przesunięcia w lewo. Wartość lewych operandów jest przesuwana w lewo o liczbę bitów określoną przez prawy operand. << 2 da 240, czyli 1111 0000
>> (prawe przesunięcie) Binarny operator przesunięcia w prawo. Wartość lewego operandu jest przesuwana w prawo o liczbę bitów określoną przez prawy operand. >> 2 da 15, czyli 1111
>>> (zerowe przesunięcie w prawo) Przesuń w prawo operator wypełnienia zerowego. Wartość lewego operandu jest przesuwana w prawo o liczbę bitów określoną przez prawy operand, a przesunięte wartości są wypełniane zerami. >>> 2 da 15, czyli 0000 1111

Operatory logiczne

W poniższej tabeli wymieniono operatory logiczne -

Załóżmy, że zmienne logiczne A zawierają prawdę, a zmienna B fałsz, a następnie -

Pokaż przykłady

Operator Opis Przykład
&& (logiczne i) Nazywany operatorem logicznym AND. Jeśli oba operandy są niezerowe, warunek staje się prawdziwy. (A && B) jest fałszem
|| (logiczne lub) Nazywany operatorem logicznym OR. Jeśli którykolwiek z dwóch operandów jest niezerowy, warunek staje się prawdziwy. (A || B) jest prawdą
! (nie logiczne) Nazywany operatorem logicznym NOT. Służy do odwracania stanu logicznego operandu. Jeśli warunek jest spełniony, operator logiczny NOT spowoduje fałsz. ! (A && B) jest prawdą

Operatory przypisania

Poniżej przedstawiono operatory przypisania obsługiwane przez język Java -

Pokaż przykłady

Operator Opis Przykład
= Prosty operator przypisania. Przypisuje wartości z operandów po prawej stronie do operandów po lewej stronie. C = A + B przypisze wartość A + B do C.
+ = Dodaj operator przypisania AND. Dodaje prawy operand do lewego operandu i przypisuje wynik do lewego operandu. C + = A jest równoważne C = C + A
- = Operator odejmowania AND przypisania. Odejmuje prawy operand od lewego operandu i przypisuje wynik lewemu operandowi. C - = A jest równoważne C = C - A
* = Operator mnożenia AND przypisania. Mnoży prawy operand z lewym operandem i przypisuje wynik do lewego operandu. C * = A jest równoważne C = C * A
/ = Operator dzielenia AND. Dzieli lewy operand z prawym operandem i przypisuje wynik lewemu operandowi. C / = A jest równoważne C = C / A
% = Operator modułu AND przypisania. Pobiera moduł używając dwóch operandów i przypisuje wynik do lewego operandu. C% = A jest równoważne C = C% A
<< = Operator przesunięcia w lewo AND przypisania. C << = 2 to to samo, co C = C << 2
>> = Operator prawego przesunięcia AND przypisania. C >> = 2 to to samo, co C = C >> 2
& = Operator przypisania bitowego AND. C & = 2 to to samo, co C = C & 2
^ = bitowe wykluczające OR i operator przypisania. C ^ = 2 to to samo, co C = C ^ 2
| = bitowy operator OR i przypisanie. C | = 2 to to samo, co C = C | 2

Różni operatorzy

Istnieje kilka innych operatorów obsługiwanych przez język Java.

Operator warunkowy (?:)

Operator warunkowy jest również znany jako ternary operator. Ten operator składa się z trzech operandów i służy do obliczania wyrażeń boolowskich. Celem operatora jest podjęcie decyzji, jaką wartość należy przypisać zmiennej. Operator jest zapisywany jako -

variable x = (expression) ? value if true : value if false

Oto przykład -

Example

public class Test {

   public static void main(String args[]) {
      int a, b;
      a = 10;
      b = (a == 1) ? 20: 30;
      System.out.println( "Value of b is : " +  b );

      b = (a == 10) ? 20: 30;
      System.out.println( "Value of b is : " + b );
   }
}

To da następujący wynik -

Output

Value of b is : 30
Value of b is : 20

instanceof Operator

Ten operator jest używany tylko dla zmiennych odwołań do obiektów. Operator sprawdza, czy obiekt jest określonego typu (typ klasy lub typ interfejsu). operator instanceof jest zapisywany jako -

( Object reference variable ) instanceof  (class/interface type)

Jeśli obiekt, do którego odwołuje się zmienna po lewej stronie operatora, przejdzie kontrolę IS-A dla typu klasy / interfejsu po prawej stronie, to wynik będzie prawdziwy. Oto przykład -

Example

public class Test {

   public static void main(String args[]) {

      String name = "James";

      // following will return true since name is type of String
      boolean result = name instanceof String;
      System.out.println( result );
   }
}

To da następujący wynik -

Output

true

Ten operator nadal zwróci wartość true, jeśli porównywany obiekt jest przypisaniem zgodnym z typem po prawej stronie. Poniżej znajduje się jeszcze jeden przykład -

Example

class Vehicle {}

public class Car extends Vehicle {

   public static void main(String args[]) {

      Vehicle a = new Car();
      boolean result =  a instanceof Car;
      System.out.println( result );
   }
}

To da następujący wynik -

Output

true

Pierwszeństwo operatorów Java

Pierwszeństwo operatorów określa grupowanie terminów w wyrażeniu. Ma to wpływ na sposób oceny wyrażenia. Niektórzy operatorzy mają wyższy priorytet niż inni; na przykład operator mnożenia ma wyższy priorytet niż operator dodawania -

Na przykład x = 7 + 3 * 2; tutaj x ma przypisane 13, a nie 20, ponieważ operator * ma wyższy priorytet niż +, więc najpierw jest mnożony przez 3 * 2, a następnie sumowany do 7.

Tutaj operatory o najwyższym priorytecie pojawiają się na górze tabeli, a operatory o najniższym priorytecie - na dole. W wyrażeniu najpierw zostaną ocenione operatory o wyższym priorytecie.

Kategoria Operator Łączność
Przyrostek wyrażenie ++ wyrażenie-- Z lewej na prawą
Jednoargumentowe ++ wyrażenie –- wyrażenie + wyrażenie – wyrażenie ~! Od prawej do lewej
Mnożny * /% Z lewej na prawą
Przyłączeniowy + - Z lewej na prawą
Zmiana << >> >>> Z lewej na prawą
Relacyjny <> <=> = instanceof Z lewej na prawą
Równość ==! = Z lewej na prawą
Bitowe AND & Z lewej na prawą
Bitowe XOR ^ Z lewej na prawą
Bitowe OR | Z lewej na prawą
Logiczne AND && Z lewej na prawą
Logiczne LUB || Z lewej na prawą
Warunkowy ?: Od prawej do lewej
Zadanie = + = - = * = / =% = ^ = | = << = >> = >>> = Od prawej do lewej

Co jest następne?

W następnym rozdziale wyjaśniono sterowanie pętlami w programowaniu w języku Java. W tym rozdziale opisano różne typy pętli oraz sposób ich wykorzystania w tworzeniu programów w języku Java oraz w jakim celu są one używane.

Może zaistnieć sytuacja, w której trzeba będzie kilkakrotnie wykonać blok kodu. Ogólnie instrukcje są wykonywane sekwencyjnie: pierwsza instrukcja funkcji jest wykonywana jako pierwsza, po niej następuje druga i tak dalej.

Języki programowania zapewniają różne struktury kontrolne, które pozwalają na bardziej skomplikowane ścieżki wykonywania.

ZA loop instrukcja pozwala na wielokrotne wykonanie instrukcji lub grupy instrukcji, a następująca po niej jest ogólna postać instrukcji pętli w większości języków programowania -

Język programowania Java udostępnia następujące typy pętli do obsługi wymagań dotyczących pętli. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.

Sr.No. Pętla i opis
1 pętla while

Powtarza instrukcję lub grupę instrukcji, gdy dany warunek jest prawdziwy. Testuje warunek przed wykonaniem treści pętli.

2 dla pętli

Wykonuje sekwencję instrukcji wiele razy i skraca kod zarządzający zmienną pętli.

3 zrobić ... pętla while

Podobnie jak instrukcja while, z tą różnicą, że testuje warunek na końcu treści pętli.

Instrukcje sterowania pętlą

Instrukcje sterujące pętlą zmieniają wykonanie z jego normalnej sekwencji. Gdy wykonanie opuszcza zakres, wszystkie automatyczne obiekty utworzone w tym zakresie są niszczone.

Java obsługuje następujące instrukcje sterujące. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.

Sr.No. Oświadczenie i opis kontroli
1 instrukcja break

Kończy loop lub switch instrukcja i przekazuje wykonanie do instrukcji bezpośrednio po pętli lub przełączniku.

2 kontynuuj oświadczenie

Powoduje, że pętla pomija pozostałą część swojego ciała i natychmiast ponownie testuje swój stan przed ponownym powtórzeniem.

Ulepszona pętla for w Javie

Od wersji Java 5 wprowadzono ulepszoną pętlę for. Służy głównie do przechodzenia przez kolekcję elementów, w tym tablice.

Składnia

Poniżej znajduje się składnia rozszerzonej pętli for -

for(declaration : expression) {
   // Statements
}
  • Declaration- Nowo zadeklarowana zmienna blokowa jest typu zgodnego z elementami tablicy, do której uzyskujesz dostęp. Zmienna będzie dostępna w bloku for, a jej wartość będzie taka sama, jak w bieżącym elemencie tablicy.

  • Expression- To oblicza tablicę, przez którą musisz przejść. Wyrażenie może być zmienną tablicową lub wywołaniem metody, które zwraca tablicę.

Przykład

public class Test {

   public static void main(String args[]) {
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ) {
         System.out.print( x );
         System.out.print(",");
      }
      System.out.print("\n");
      String [] names = {"James", "Larry", "Tom", "Lacy"};

      for( String name : names ) {
         System.out.print( name );
         System.out.print(",");
      }
   }
}

To da następujący wynik -

Wynik

10, 20, 30, 40, 50,
James, Larry, Tom, Lacy,

Co jest następne?

W następnym rozdziale nauczymy się, jak podejmować decyzje w programowaniu w języku Java.

Struktury decyzyjne mają jeden lub więcej warunków, które mają być ocenione lub przetestowane przez program, wraz z instrukcją lub instrukcjami, które mają zostać wykonane, jeśli warunek zostanie określony jako prawdziwy, i opcjonalnie inne instrukcje do wykonania, jeśli warunek zostanie określony być fałszywym.

Poniżej przedstawiono ogólną formę typowej struktury podejmowania decyzji występującej w większości języków programowania -

Język programowania Java udostępnia następujące typy instrukcji decyzyjnych. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.

Sr.No. Oświadczenie i opis
1 jeśli oświadczenie

Na if statement składa się z wyrażenia logicznego, po którym następuje co najmniej jedna instrukcja.

2 if ... else oświadczenie

Na if statement może następować opcjonalnie else statement, która jest wykonywana, gdy wyrażenie logiczne ma wartość false.

3 zagnieżdżona instrukcja if

Możesz użyć jednego if lub else if oświadczenie wewnątrz innego if lub else if sprawozdania).

4 instrukcja przełączania

ZA switch Instrukcja umożliwia testowanie zmiennej pod kątem równości względem listy wartości.

The? : Operator

Omówiliśmy conditional operator ? : w poprzednim rozdziale, które można zastąpić if...elsesprawozdania. Ma następującą ogólną postać -

Exp1 ? Exp2 : Exp3;

Gdzie Exp1, Exp2 i Exp3 to wyrażenia. Zwróć uwagę na użycie i położenie okrężnicy.

Aby określić wartość całego wyrażenia, początkowo obliczana jest wartość exp1.

  • Jeśli wartość exp1 jest prawdziwa, to wartość Exp2 będzie wartością całego wyrażenia.

  • Jeśli wartość exp1 jest false, to Exp3 jest obliczane, a jego wartość staje się wartością całego wyrażenia.

Co jest następne?

W następnym rozdziale omówimy klasę Number (w pakiecie java.lang) i jej podklasy w języku Java.

Przyjrzymy się niektórym sytuacjom, w których będziesz używać wystąpień tych klas zamiast pierwotnych typów danych, a także klas, takich jak formatowanie, funkcje matematyczne, o których musisz wiedzieć podczas pracy z Numbers.

Zwykle podczas pracy z Numbers używamy prymitywnych typów danych, takich jak bajt, int, long, double itp.

Przykład

int i = 5000;
float gpa = 13.65f;
double mask = 125;

Jednak w rozwoju napotykamy sytuacje, w których musimy używać obiektów zamiast prymitywnych typów danych. Aby to osiągnąć, Java udostępniawrapper classes.

Wszystkie klasy opakowania (Integer, Long, Byte, Double, Float, Short) są podklasami klasy abstrakcyjnej Number.

Obiekt klasy opakowania zawiera lub opakowuje odpowiedni typ danych pierwotnych. Wywoływana jest konwersja pierwotnych typów danych na obiektboxingi zajmuje się tym kompilator. Dlatego korzystając z klasy opakowującej wystarczy przekazać wartość pierwotnego typu danych do konstruktora klasy Wrapper.

Obiekt Wrapper zostanie z powrotem przekonwertowany na pierwotny typ danych, a ten proces nazywa się rozpakowywaniem. PlikNumber class jest częścią pakietu java.lang.

Poniżej znajduje się przykład pakowania i rozpakowywania -

Przykład

public class Test {

   public static void main(String args[]) {
      Integer x = 5; // boxes int to an Integer object
      x =  x + 10;   // unboxes the Integer to a int
      System.out.println(x); 
   }
}

To da następujący wynik -

Wynik

15

Gdy x ma przypisaną wartość całkowitą, kompilator umieszcza ją w polu, ponieważ x jest obiektem typu integer. Później x zostaje rozpakowane, aby można je było dodać jako liczbę całkowitą.

Metody liczbowe

Poniżej znajduje się lista metod instancji, które implementują wszystkie podklasy klasy Number -

Sr.No. Metoda i opis
1 xxxValue ()

Konwertuje wartość tego obiektu Number na typ danych xxx i zwraca go.

2 porównać do()

Porównuje ten obiekt Number z argumentem.

3 równa się()

Określa, czy ten obiekt liczbowy jest równy argumentowi.

4 wartość()

Zwraca obiekt Integer zawierający wartość określonego prymitywu.

5 toString ()

Zwraca obiekt String reprezentujący wartość określonej wartości typu int lub Integer.

6 parseInt ()

Ta metoda służy do uzyskania pierwotnego typu danych określonego typu String.

7 abs ()

Zwraca wartość bezwzględną argumentu.

8 stropować()

Zwraca najmniejszą liczbę całkowitą większą lub równą argumentowi. Wrócił jako podwójny.

9 podłoga()

Zwraca największą liczbę całkowitą mniejszą lub równą argumentowi. Wrócił jako podwójny.

10 rint ()

Zwraca liczbę całkowitą, która jest najbliższa wartości argumentowi. Wrócił jako podwójny.

11 okrągły()

Zwraca najbliższy long lub int, zgodnie z typem zwrotu metody do argumentu.

12 min ()

Zwraca mniejszy z dwóch argumentów.

13 max ()

Zwraca większy z dwóch argumentów.

14 exp ()

Zwraca podstawę logarytmów naturalnych e do potęgi argumentu.

15 log()

Zwraca logarytm naturalny argumentu.

16 pow ()

Zwraca wartość pierwszego argumentu podniesionego do potęgi drugiego argumentu.

17 sqrt ()

Zwraca pierwiastek kwadratowy z argumentu.

18 grzech()

Zwraca sinus określonej podwójnej wartości.

19 sałata()

Zwraca cosinus określonej podwójnej wartości.

20 dębnik()

Zwraca styczną określonej podwójnej wartości.

21 jak w()

Zwraca arcus sinus określonej podwójnej wartości.

22 acos ()

Zwraca arccosine określonej podwójnej wartości.

23 atan ()

Zwraca arcus tangens określonej podwójnej wartości.

24 atan2 ()

Konwertuje współrzędne prostokątne (x, y) na współrzędne biegunowe (r, theta) i zwraca theta.

25 toDegrees ()

Konwertuje argument na stopnie.

26 toRadians ()

Konwertuje argument na radiany.

27 losowy()

Zwraca liczbę losową.

Co jest następne?

W następnej sekcji omówimy klasę Character w Javie. Dowiesz się, jak używać znaków obiektu i prymitywnego typu danych char w Javie.

Zwykle podczas pracy ze znakami używamy prymitywnych typów danych char.

Przykład

char ch = 'a';

// Unicode for uppercase Greek omega character
char uniChar = '\u039A'; 

// an array of chars
char[] charArray ={ 'a', 'b', 'c', 'd', 'e' };

Jednak w rozwoju napotykamy sytuacje, w których musimy używać obiektów zamiast prymitywnych typów danych. Aby to osiągnąć, Java udostępnia klasę opakowującąCharacter dla pierwotnych danych typu char.

Klasa Character oferuje szereg przydatnych klas (tj. Statycznych) metod do manipulowania znakami. Możesz utworzyć obiekt Character za pomocą konstruktora Character -

Character ch = new Character('a');

W pewnych okolicznościach kompilator Java utworzy również obiekt Character. Na przykład, jeśli przekażesz prymitywny znak do metody, która oczekuje obiektu, kompilator automatycznie konwertuje znak na znak za Ciebie. Ta funkcja nazywa się autoboxing lub unboxing, jeśli konwersja przebiega w drugą stronę.

Przykład

// Here following primitive char 'a'
// is boxed into the Character object ch
Character ch = 'a';

// Here primitive 'x' is boxed for method test,
// return is unboxed to char 'c'
char c = test('x');

Sekwencje ewakuacyjne

Znak poprzedzony ukośnikiem odwrotnym (\) jest sekwencją ucieczki i ma specjalne znaczenie dla kompilatora.

Znak nowego wiersza (\ n) był często używany w tym samouczku w instrukcjach System.out.println (), aby przejść do następnego wiersza po wydrukowaniu ciągu.

Poniższa tabela przedstawia sekwencje specjalne Java -

Sekwencja ewakuacyjna Opis
\ t W tym miejscu wstawia tabulator do tekstu.
\b W tym miejscu wstawia w tekście spację.
\ n W tym miejscu wstawia nowy wiersz w tekście.
\ r W tym miejscu wstawia znak powrotu karetki do tekstu.
\fa W tym miejscu wstawia do tekstu posuw formularza.
\ ' W tym miejscu wstawia pojedynczy znak cudzysłowu do tekstu.
\ " W tym miejscu wstawia w tekście znak podwójnego cudzysłowu.
\\ W tym miejscu wstawia w tekście znak ukośnika odwrotnego.

Gdy w instrukcji print napotkana jest sekwencja ucieczki, kompilator odpowiednio ją interpretuje.

Przykład

Jeśli chcesz umieścić cudzysłowy w cudzysłowach, musisz użyć sekwencji sterującej \ "w cudzysłowach wewnętrznych -

public class Test {

   public static void main(String args[]) {
      System.out.println("She said \"Hello!\" to me.");
   }
}

To da następujący wynik -

Wynik

She said "Hello!" to me.

Metody znakowe

Poniżej znajduje się lista ważnych metod instancji, które implementują wszystkie podklasy klasy Character -

Sr.No. Metoda i opis
1 isLetter ()

Określa, czy określona wartość char jest literą.

2 isDigit ()

Określa, czy określona wartość char jest cyfrą.

3 isWhitespace ()

Określa, czy określona wartość char jest odstępem.

4 isUpperCase ()

Określa, czy określona wartość znaku jest wielkimi literami.

5 isLowerCase ()

Określa, czy podana wartość znaku jest małymi literami.

6 toUpperCase ()

Zwraca wielką literę określonej wartości znaku.

7 toLowerCase ()

Zwraca małą literę dla określonej wartości znaku.

8 toString ()

Zwraca obiekt String reprezentujący określoną wartość znaku, czyli jednoznakowy ciąg.

Pełną listę metod można znaleźć w specyfikacji interfejsu API java.lang.Character.

Co jest następne?

W następnej sekcji omówimy klasę String w Javie. Dowiesz się, jak efektywnie deklarować i używać ciągów znaków, a także niektóre z ważnych metod w klasie String.

Ciągi znaków, które są szeroko stosowane w programowaniu w języku Java, to sekwencja znaków. W języku programowania Java ciągi znaków są traktowane jako obiekty.

Platforma Java udostępnia klasę String do tworzenia łańcuchów i manipulowania nimi.

Tworzenie ciągów

Najbardziej bezpośrednim sposobem utworzenia ciągu jest napisanie -

String greeting = "Hello world!";

Za każdym razem, gdy napotka w kodzie literał ciągu, kompilator tworzy obiekt String z jego wartością, w tym przypadku „Hello world!”.

Podobnie jak w przypadku każdego innego obiektu, możesz tworzyć obiekty String, używając słowa kluczowego new i konstruktora. Klasa String ma 11 konstruktorów, które umożliwiają podanie wartości początkowej ciągu przy użyciu różnych źródeł, takich jak tablica znaków.

Przykład

public class StringDemo {

   public static void main(String args[]) {
      char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.' };
      String helloString = new String(helloArray);  
      System.out.println( helloString );
   }
}

To da następujący wynik -

Wynik

hello.

Note- Klasa String jest niezmienna, dlatego po utworzeniu obiektu String nie można zmienić. Jeśli istnieje potrzeba wprowadzenia wielu modyfikacji w ciągach znaków, powinieneś użyć klas bufora ciągów i budujących ciągi .

Długość łańcucha

Metody uzyskiwania informacji o obiekcie znane są jako accessor methods. Jedną metodą dostępową, której można używać z ciągami znaków, jest metoda length (), która zwraca liczbę znaków zawartych w obiekcie ciągu.

Poniższy program jest przykładem length(), metoda Klasa String.

Przykład

public class StringDemo {

   public static void main(String args[]) {
      String palindrome = "Dot saw I was Tod";
      int len = palindrome.length();
      System.out.println( "String Length is : " + len );
   }
}

To da następujący wynik -

Wynik

String Length is : 17

Łączenie ciągów

Klasa String zawiera metodę łączenia dwóch ciągów -

string1.concat(string2);

Zwraca nowy ciąg, który jest ciągiem 1 z dodanym ciągiem 2 na końcu. Możesz również użyć metody concat () z literałami łańcuchowymi, jak w -

"My name is ".concat("Zara");

Łańcuchy są częściej łączone z operatorem +, jak w -

"Hello," + " world" + "!"

co skutkuje -

"Hello, world!"

Spójrzmy na następujący przykład -

Przykład

public class StringDemo {

   public static void main(String args[]) {
      String string1 = "saw I was ";
      System.out.println("Dot " + string1 + "Tod");
   }
}

To da następujący wynik -

Wynik

Dot saw I was Tod

Tworzenie ciągów formatujących

Masz metody printf () i format () do drukowania wyników ze sformatowanymi liczbami. Klasa String ma równoważną metodę klasy, format (), która zwraca obiekt String zamiast obiektu PrintStream.

Użycie statycznej metody format () klasy String umożliwia utworzenie sformatowanego ciągu, którego można użyć ponownie, w przeciwieństwie do jednorazowej instrukcji print. Na przykład zamiast -

Przykład

System.out.printf("The value of the float variable is " +
                  "%f, while the value of the integer " +
                  "variable is %d, and the string " +
                  "is %s", floatVar, intVar, stringVar);

Możesz napisać -

String fs;
fs = String.format("The value of the float variable is " +
                   "%f, while the value of the integer " +
                   "variable is %d, and the string " +
                   "is %s", floatVar, intVar, stringVar);
System.out.println(fs);

Metody ciągów

Oto lista metod obsługiwanych przez klasę String -

Sr.No. Metoda i opis
1 char charAt (int index)

Zwraca znak o określonym indeksie.

2 int compareTo (Object o)

Porównuje ten ciąg z innym obiektem.

3 int compareTo (String anotherString)

Porównuje dwa ciągi leksykograficzne.

4 int CompareToIgnoreCase (String str)

Porównuje dwa ciągi leksykograficznie, ignorując różnice w wielkości liter.

5 String concat (String str)

Łączy określony ciąg na końcu tego ciągu.

6 boolean contentEquals (StringBuffer sb)

Zwraca wartość true wtedy i tylko wtedy, gdy ten String reprezentuje tę samą sekwencję znaków co określony StringBuffer.

7 static String copyValueOf (char [] dane)

Zwraca ciąg, który reprezentuje sekwencję znaków w określonej tablicy.

8 static String copyValueOf (char [] dane, int offset, int count)

Zwraca ciąg, który reprezentuje sekwencję znaków w określonej tablicy.

9 boolean endWith (przyrostek ciągu)

Sprawdza, czy ten ciąg kończy się określonym sufiksem.

10 boolean równa się (Object anObject)

Porównuje ten ciąg z określonym obiektem.

11 boolean equalsIgnoreCase (String anotherString)

Porównuje ten ciąg z innym ciągiem, ignorując rozważania dotyczące wielkości liter.

12 bajt getBytes ()

Koduje ten ciąg do sekwencji bajtów przy użyciu domyślnego zestawu znaków platformy, przechowując wynik w nowej tablicy bajtów.

13 byte [] getBytes (String charsetName)

Koduje ten ciąg znaków w sekwencję bajtów przy użyciu nazwanego zestawu znaków, przechowując wynik w nowej tablicy bajtów.

14 void getChars (int srcBegin, int srcEnd, char [] dst, int dstBegin)

Kopiuje znaki z tego ciągu do docelowej tablicy znaków.

15 int hashCode ()

Zwraca kod skrótu dla tego ciągu.

16 int indexOf (int ch)

Zwraca indeks pierwszego wystąpienia określonego znaku w tym ciągu.

17 int indexOf (int ch, int fromIndex)

Zwraca indeks w ramach tego ciągu pierwszego wystąpienia określonego znaku, rozpoczynając wyszukiwanie od określonego indeksu.

18 int indexOf (String str)

Zwraca indeks w tym ciągu pierwszego wystąpienia określonego podciągu.

19 int indexOf (String str, int fromIndex)

Zwraca indeks w tym ciągu pierwszego wystąpienia określonego podciągu, rozpoczynając od określonego indeksu.

20 String intern ()

Zwraca kanoniczną reprezentację obiektu ciągu.

21 int lastIndexOf (int ch)

Zwraca indeks w tym ciągu ostatniego wystąpienia określonego znaku.

22 int lastIndexOf (int ch, int fromIndex)

Zwraca indeks w tym ciągu ostatniego wystąpienia określonego znaku, przeszukując wstecz, zaczynając od określonego indeksu.

23 int lastIndexOf (ciąg znaków)

Zwraca indeks w tym ciągu najbardziej prawego wystąpienia określonego podciągu.

24 int lastIndexOf (String str, int fromIndex)

Zwraca indeks w tym ciągu ostatniego wystąpienia określonego podciągu, przeszukując wstecz, zaczynając od określonego indeksu.

25 int długość ()

Zwraca długość tego ciągu.

26 dopasowania logiczne (wyrażenie regularne typu String)

Informuje, czy ten ciąg pasuje do podanego wyrażenia regularnego.

27 boolean regionMatches (boolean ignoreCase, int toffset, String other, int ooffset, int len)

Testuje, czy dwa regiony strun są równe.

28 boolean regionMatches (int toffset, String other, int ooffset, int len)

Testuje, czy dwa regiony strun są równe.

29 Zastąp ciąg (znak staryChar, znak nowyChar)

Zwraca nowy ciąg będący wynikiem zastąpienia wszystkich wystąpień oldChar w tym ciągu przez newChar.

30 String replaceAll (wyrażenie regularne ciągu, zamiana ciągu

Zastępuje każdy podciąg tego ciągu, który pasuje do podanego wyrażenia regularnego, na podany zamiennik.

31 String replaceFirst (wyrażenie regularne, zamiana ciągu)

Zastępuje pierwszy podciąg tego ciągu, który pasuje do podanego wyrażenia regularnego, na podany zamiennik.

32 Podział ciągu [] (wyrażenie regularne ciągu)

Dzieli ten ciąg wokół dopasowań podanego wyrażenia regularnego.

33 String [] split (ciąg wyrażenia regularnego, limit int)

Dzieli ten ciąg wokół dopasowań podanego wyrażenia regularnego.

34 boolean startedWith (przedrostek ciągu)

Sprawdza, czy ten ciąg zaczyna się od określonego prefiksu.

35 boolean startedWith (prefiks ciągu, int toffset)

Sprawdza, czy ten ciąg zaczyna się od określonego prefiksu rozpoczynającego się od określonego indeksu.

36 CharSequence subSequence (int beginIndex, int endIndex)

Zwraca nową sekwencję znaków, która jest podciągiem tej sekwencji.

37 Podciąg ciągu (int beginIndex)

Zwraca nowy ciąg, który jest podłańcuchem tego ciągu.

38 Podciąg ciągu (int beginIndex, int endIndex)

Zwraca nowy ciąg, który jest podłańcuchem tego ciągu.

39 char [] toCharArray ()

Konwertuje ten ciąg na nową tablicę znaków.

40 Ciąg toLowerCase ()

Konwertuje wszystkie znaki w tym String na małe litery przy użyciu reguł domyślnych ustawień regionalnych.

41 Ciąg toLowerCase (ustawienia regionalne)

Konwertuje wszystkie znaki w tym ciągu na małe litery przy użyciu reguł danego ustawienia regionalnego.

42 Ciąg toString ()

Ten obiekt (który jest już łańcuchem!) Jest zwracany sam.

43 Ciąg toUpperCase ()

Konwertuje wszystkie znaki w tym łańcuchu na wielkie litery przy użyciu reguł domyślnych ustawień regionalnych.

44 Ciąg toUpperCase (ustawienia regionalne)

Konwertuje wszystkie znaki w tym łańcuchu na wielkie litery przy użyciu reguł danego ustawienia regionalnego.

45 Przycinanie sznurka ()

Zwraca kopię ciągu z pominięciem wiodących i końcowych białych znaków.

46 static String valueOf (pierwotny typ danych x)

Zwraca ciąg znaków reprezentujący przekazany argument typu danych.

Java zapewnia strukturę danych, rozszerzenie array, który przechowuje sekwencyjną kolekcję elementów tego samego typu o stałym rozmiarze. Tablica jest używana do przechowywania kolekcji danych, ale często bardziej przydatne jest myślenie o tablicy jako o zbiorze zmiennych tego samego typu.

Zamiast deklarować pojedyncze zmienne, takie jak liczba0, liczba1, ... i liczba99, deklarujesz jedną zmienną tablicową, taką jak liczby, i używasz liczb [0], liczb [1] i ..., liczb [99] do reprezentowania indywidualne zmienne.

W tym samouczku przedstawiono, jak deklarować zmienne tablicowe, tworzyć tablice i przetwarzać tablice przy użyciu zmiennych indeksowanych.

Deklarowanie zmiennych tablicowych

Aby użyć tablicy w programie, należy zadeklarować zmienną odwołującą się do tablicy i określić typ tablicy, do której zmienna może się odwoływać. Oto składnia deklarowania zmiennej tablicowej -

Składnia

dataType[] arrayRefVar;   // preferred way.
or
dataType arrayRefVar[];  // works but not preferred way.

Note - Styl dataType[] arrayRefVarjest preferowany. StyldataType arrayRefVar[] pochodzi z języka C / C ++ i został zaadaptowany w Javie, aby pomieścić programistów C / C ++.

Przykład

Poniższe fragmenty kodu są przykładami takiej składni -

double[] myList;   // preferred way.
or
double myList[];   // works but not preferred way.

Tworzenie tablic

Możesz utworzyć tablicę za pomocą operatora new o następującej składni -

Składnia

arrayRefVar = new dataType[arraySize];

Powyższe stwierdzenie ma dwie rzeczy -

  • Tworzy tablicę przy użyciu new dataType [arraySize].

  • Przypisuje odniesienie do nowo utworzonej tablicy do zmiennej arrayRefVar.

Zadeklarowanie zmiennej tablicowej, utworzenie tablicy i przypisanie odwołania tablicy do zmiennej można połączyć w jednej instrukcji, jak pokazano poniżej -

dataType[] arrayRefVar = new dataType[arraySize];

Alternatywnie możesz utworzyć tablice w następujący sposób -

dataType[] arrayRefVar = {value0, value1, ..., valuek};

Dostęp do elementów tablicy uzyskuje się za pośrednictwem index. Indeksy tablicowe są oparte na 0; to znaczy, zaczynają się od 0 doarrayRefVar.length-1.

Przykład

Następująca instrukcja deklaruje zmienną tablicową myList, tworzy tablicę 10 elementów typu double i przypisuje jej odwołanie do myList -

double[] myList = new double[10];

Poniższy rysunek przedstawia tablicę myList. Tutaj myList zawiera dziesięć podwójnych wartości, a indeksy wynoszą od 0 do 9.

Przetwarzanie tablic

Podczas przetwarzania elementów tablic często używamy obu for pętla lub foreach pętla, ponieważ wszystkie elementy w tablicy są tego samego typu i znany jest rozmiar tablicy.

Przykład

Oto kompletny przykład pokazujący, jak tworzyć, inicjować i przetwarzać tablice -

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList[i] + " ");
      }
     
      // Summing all elements
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList[i];
      }
      System.out.println("Total is " + total);
      
      // Finding the largest element
      double max = myList[0];
      for (int i = 1; i < myList.length; i++) {
         if (myList[i] > max) max = myList[i];
      }
      System.out.println("Max is " + max);  
   }
}

To da następujący wynik -

Wynik

1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5

Pętle foreach

W JDK 1.5 wprowadzono nową pętlę for znaną jako pętla foreach lub ulepszona pętla for, która umożliwia przechodzenie przez całą tablicę sekwencyjnie bez użycia zmiennej indeksu.

Przykład

Poniższy kod wyświetla wszystkie elementy w tablicy myList -

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (double element: myList) {
         System.out.println(element);
      }
   }
}

To da następujący wynik -

Wynik

1.9
2.9
3.4
3.5

Przekazywanie tablic do metod

Tak jak możesz przekazywać wartości typu pierwotnego do metod, możesz również przekazywać tablice do metod. Na przykład poniższa metoda wyświetla elementy w plikuint tablica -

Przykład

public static void printArray(int[] array) {
   for (int i = 0; i < array.length; i++) {
      System.out.print(array[i] + " ");
   }
}

Możesz go wywołać, przekazując tablicę. Na przykład poniższa instrukcja wywołuje metodę printArray w celu wyświetlenia 3, 1, 2, 6, 4 i 2 -

Przykład

printArray(new int[]{3, 1, 2, 6, 4, 2});

Zwracanie tablicy z metody

Metoda może również zwrócić tablicę. Na przykład poniższa metoda zwraca tablicę będącą odwróceniem innej tablicy -

Przykład

public static int[] reverse(int[] list) {
   int[] result = new int[list.length];

   for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
      result[j] = list[i];
   }
   return result;
}

Klasa Arrays

Klasa java.util.Arrays zawiera różne statyczne metody sortowania i wyszukiwania tablic, porównywania tablic i wypełniania elementów tablic. Te metody są przeciążone dla wszystkich typów pierwotnych.

Sr.No. Method & Description
1

public static int binarySearch(Object[] a, Object key)

Searches the specified array of Object ( Byte, Int , double, etc.) for the specified value using the binary search algorithm. The array must be sorted prior to making this call. This returns index of the search key, if it is contained in the list; otherwise, it returns ( – (insertion point + 1)).

2

public static boolean equals(long[] a, long[] a2)

Returns true if the two specified arrays of longs are equal to one another. Two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal. This returns true if the two arrays are equal. Same method could be used by all other primitive data types (Byte, short, Int, etc.)

3

public static void fill(int[] a, int val)

Assigns the specified int value to each element of the specified array of ints. The same method could be used by all other primitive data types (Byte, short, Int, etc.)

4

public static void sort(Object[] a)

Sorts the specified array of objects into an ascending order, according to the natural ordering of its elements. The same method could be used by all other primitive data types ( Byte, short, Int, etc.)

Java provides the Date class available in java.util package, this class encapsulates the current date and time.

The Date class supports two constructors as shown in the following table.

Sr.No. Constructor & Description
1

Date( )

This constructor initializes the object with the current date and time.

2

Date(long millisec)

This constructor accepts an argument that equals the number of milliseconds that have elapsed since midnight, January 1, 1970.

Following are the methods of the date class.

Sr.No. Method & Description
1

boolean after(Date date)

Returns true if the invoking Date object contains a date that is later than the one specified by date, otherwise, it returns false.

2

boolean before(Date date)

Returns true if the invoking Date object contains a date that is earlier than the one specified by date, otherwise, it returns false.

3

Object clone( )

Duplicates the invoking Date object.

4

int compareTo(Date date)

Compares the value of the invoking object with that of date. Returns 0 if the values are equal. Returns a negative value if the invoking object is earlier than date. Returns a positive value if the invoking object is later than date.

5

int compareTo(Object obj)

Operates identically to compareTo(Date) if obj is of class Date. Otherwise, it throws a ClassCastException.

6

boolean equals(Object date)

Returns true if the invoking Date object contains the same time and date as the one specified by date, otherwise, it returns false.

7

long getTime( )

Returns the number of milliseconds that have elapsed since January 1, 1970.

8

int hashCode( )

Returns a hash code for the invoking object.

9

void setTime(long time)

Sets the time and date as specified by time, which represents an elapsed time in milliseconds from midnight, January 1, 1970.

10

String toString( )

Converts the invoking Date object into a string and returns the result.

Pobieranie aktualnej daty i godziny

Jest to bardzo łatwa metoda uzyskania aktualnej daty i godziny w Javie. Możesz użyć prostego obiektu Date z metodą toString () , aby wydrukować bieżącą datę i godzinę w następujący sposób -

Przykład

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date using toString()
      System.out.println(date.toString());
   }
}

To da następujący wynik -

Wynik

on May 04 09:51:52 CDT 2009

Porównanie dat

Poniżej przedstawiono trzy sposoby porównania dwóch dat -

  • Możesz użyć metody getTime (), aby uzyskać liczbę milisekund, które upłynęły od północy 1 stycznia 1970 r. Dla obu obiektów, a następnie porównać te dwie wartości.

  • Możesz użyć metod przed (), after () i equals (). Ponieważ 12 dzień miesiąca przypada na przykład przed 18. dniem, new Date (99, 2, 12) .before (new Date (99, 2, 18)) zwraca wartość true.

  • Możesz użyć metody compareTo (), która jest zdefiniowana przez interfejs Comparable i implementowana przez Date.

Formatowanie daty przy użyciu SimpleDateFormat

SimpleDateFormat to konkretna klasa do formatowania i analizowania dat w sposób uwzględniający ustawienia regionalne. SimpleDateFormat umożliwia rozpoczęcie od wybrania dowolnych wzorców zdefiniowanych przez użytkownika do formatowania daty i godziny.

Przykład

import java.util.*;
import java.text.*;

public class DateDemo {

   public static void main(String args[]) {
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

      System.out.println("Current Date: " + ft.format(dNow));
   }
}

To da następujący wynik -

Wynik

Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

Proste kody formatu DateFormat

Aby określić format czasu, użyj łańcucha wzorca czasu. W tym wzorze wszystkie litery ASCII są zarezerwowane jako litery wzorca, które są zdefiniowane w następujący sposób:

Postać Opis Przykład
sol Wyznacznik ery OGŁOSZENIE
y Rok za pomocą czterech cyfr 2001
M Miesiąc w roku Lipiec lub 07
re Dzień w miesiącu 10
godz Godzina w godzinach AM / PM (1 ~ 12) 12
H. Godzina w dzień (0 ~ 23) 22
m Minuta za godzinę 30
s Sekunda za minutę 55
S Milisekunda 234
mi Dzień w tygodniu wtorek
re Dzień w roku 360
fa Dzień tygodnia w miesiącu 2 (druga środa lipca)
w Tydzień w roku 40
W. Tydzień w miesiącu 1
za Znacznik AM / PM PO POŁUDNIU
k Godzina w dzień (1 ~ 24) 24
K. Godzina w godzinach AM / PM (0 ~ 11) 10
z Strefa czasowa Wschodni czas standardowy
' Escape dla tekstu Separator
" Pojedynczy cudzysłów `

Formatowanie daty za pomocą printf

Formatowanie daty i czasu można bardzo łatwo wykonać za pomocą printfmetoda. Używasz formatu dwuliterowego, zaczynając odt i kończący się jedną z liter tabeli, jak pokazano w poniższym kodzie.

Przykład

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date
      String str = String.format("Current Date/Time : %tc", date );

      System.out.printf(str);
   }
}

To da następujący wynik -

Wynik

Current Date/Time : Sat Dec 15 16:37:57 MST 2012

Byłoby trochę głupie, gdybyś musiał podać datę wiele razy, aby sformatować każdą część. Z tego powodu ciąg formatu może wskazywać indeks argumentu do sformatowania.

Indeks musi natychmiast następować po% i musi być zakończony znakiem $.

Przykład

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display time and date
      System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
   }
}

To da następujący wynik -

Wynik

Due date: February 09, 2004

Alternatywnie możesz użyć flagi <. Wskazuje, że należy ponownie użyć tego samego argumentu, co w poprzedniej specyfikacji formatu.

Przykład

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display formatted date
      System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
   }
}

To da następujący wynik -

Wynik

Due date: February 09, 2004

Znaki konwersji daty i czasu

Postać Opis Przykład
do Pełna data i godzina Poniedziałek, 4 maja, 09:51:52 CDT 2009
fa Data ISO 8601 2004-02-09
re Data w formacie amerykańskim (miesiąc / dzień / rok) 02/09/2004
T 24-godzinny czas 18:05:19
r 12 godzin 18:05:19
R 24 godziny bez sekund 18:05
Y Rok czterocyfrowy (z wiodącymi zerami) 2004
y Ostatnie dwie cyfry roku (z zerami na początku) 04
do Pierwsze dwie cyfry roku (z zerami na początku) 20
b Pełna nazwa miesiąca luty
b Skrócona nazwa miesiąca Luty
m Dwucyfrowy miesiąc (z wiodącymi zerami) 02
re Dwucyfrowy dzień (z wiodącymi zerami) 03
mi Dwucyfrowy dzień (bez wiodących zer) 9
ZA Pełna nazwa dnia tygodnia poniedziałek
za Skrócona nazwa dnia tygodnia Pon
jot Trzycyfrowy dzień roku (z zerami na początku) 069
H. Dwucyfrowa godzina (z zerami na początku), od 00 do 23 18
k Dwucyfrowa godzina (bez wiodących zer), od 0 do 23 18
ja Dwucyfrowa godzina (z zerami na początku), od 01 do 12 06
l Dwucyfrowa godzina (bez wiodących zer), od 1 do 12 6
M Dwucyfrowe minuty (z wiodącymi zerami) 05
S Dwucyfrowe sekundy (z wiodącymi zerami) 19
L Trzycyfrowe milisekundy (z zerami na początku) 047
N Dziewięciocyfrowe nanosekundy (z zerami na początku) 047000000
P. Wielkie litery rano lub po południu PO POŁUDNIU
p Mały marker rano lub po południu po południu
z RFC 822 numeryczne przesunięcie względem GMT -0800
Z Strefa czasowa PST
s Sekundy od 1970-01-01 00:00:00 GMT 1078884319
Q Milisekundy od 1970-01-01 00:00:00 GMT 1078884319047

Istnieją inne przydatne klasy związane z datą i godziną. Więcej informacji można znaleźć w dokumentacji Java Standard.

Przetwarzanie ciągów znaków na daty

Klasa SimpleDateFormat ma kilka dodatkowych metod, w szczególności parse (), która próbuje przeanalizować ciąg znaków zgodnie z formatem przechowywanym w danym obiekcie SimpleDateFormat.

Przykład

import java.util.*;
import java.text.*;
  
public class DateDemo {

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
      String input = args.length == 0 ? "1818-11-11" : args[0]; 

      System.out.print(input + " Parses as "); 
      Date t;
      try {
         t = ft.parse(input); 
         System.out.println(t); 
      } catch (ParseException e) { 
         System.out.println("Unparseable using " + ft); 
      }
   }
}

Przykładowy przebieg powyższego programu dałby następujący wynik -

Wynik

1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818

Spać na chwilę

Możesz spać przez dowolny okres od jednej milisekundy do czasu życia komputera. Na przykład następujący program będzie spał przez 3 sekundy -

Przykład

import java.util.*;
public class SleepDemo {

   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) {
         System.out.println("Got an exception!"); 
      }
   }
}

To da następujący wynik -

Wynik

Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009

Mierzenie upływającego czasu

Czasami może być konieczne zmierzenie punktu w czasie w milisekundach. Zatem ponownie napiszmy powyższy przykład -

Przykład

import java.util.*;
public class DiffDemo {

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}

To da następujący wynik -

Wynik

Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:57 GMT 2009
Difference is : 5993

GregorianCalendar Class

GregorianCalendar jest konkretną implementacją klasy Calendar, która implementuje zwykły kalendarz gregoriański, który znasz. Nie omawialiśmy klasy Calendar w tym samouczku, możesz zajrzeć do standardowej dokumentacji Java.

Plik getInstance( )Metoda Calendar zwraca GregorianCalendar zainicjowany z bieżącą datą i godziną w domyślnych ustawieniach regionalnych i strefie czasowej. GregorianCalendar definiuje dwa pola: AD i BC. Reprezentują one dwie epoki określone przez kalendarz gregoriański.

Istnieje również kilka konstruktorów dla obiektów GregorianCalendar -

Sr.No. Konstruktor i opis
1

GregorianCalendar()

Konstruuje domyślny kalendarz GregorianCalendar przy użyciu bieżącego czasu w domyślnej strefie czasowej z domyślnymi ustawieniami regionalnymi.

2

GregorianCalendar(int year, int month, int date)

Konstruuje kalendarz GregorianCalendar z podaną datą ustawioną w domyślnej strefie czasowej z domyślnymi ustawieniami regionalnymi.

3

GregorianCalendar(int year, int month, int date, int hour, int minute)

Konstruuje GregorianCalendar z podaną datą i godziną ustawioną dla domyślnej strefy czasowej z domyślnymi ustawieniami regionalnymi.

4

GregorianCalendar(int year, int month, int date, int hour, int minute, int second)

Konstruuje GregorianCalendar z podaną datą i godziną ustawioną dla domyślnej strefy czasowej z domyślnymi ustawieniami regionalnymi.

5

GregorianCalendar(Locale aLocale)

Konstruuje GregorianCalendar na podstawie bieżącego czasu w domyślnej strefie czasowej z podanymi ustawieniami regionalnymi.

6

GregorianCalendar(TimeZone zone)

Konstruuje GregorianCalendar na podstawie bieżącego czasu w danej strefie czasowej z domyślnymi ustawieniami regionalnymi.

7

GregorianCalendar(TimeZone zone, Locale aLocale)

Konstruuje GregorianCalendar na podstawie bieżącego czasu w danej strefie czasowej z podanymi ustawieniami regionalnymi.

Oto lista kilku przydatnych metod wsparcia dostarczonych przez klasę GregorianCalendar -

Sr.No. Metoda i opis
1

void add(int field, int amount)

Dodaje określony (podpisany) czas do podanego pola czasu, na podstawie reguł kalendarza.

2

protected void computeFields()

Konwertuje czas UTC jako milisekundy na wartości pól czasu.

3

protected void computeTime()

Zastępuje kalendarz Konwertuje wartości pól czasu na czas UTC w milisekundach.

4

boolean equals(Object obj)

Porównuje ten GregorianCalendar z odwołaniem do obiektu.

5

int get(int field)

Pobiera wartość dla danego pola czasu.

6

int getActualMaximum(int field)

Zwraca maksymalną wartość, jaką może mieć to pole, biorąc pod uwagę bieżącą datę.

7

int getActualMinimum(int field)

Zwraca minimalną wartość, jaką może mieć to pole, biorąc pod uwagę bieżącą datę.

8

int getGreatestMinimum(int field)

Jeśli jest zmienna, zwraca najwyższą minimalną wartość dla danego pola.

9

Date getGregorianChange()

Pobiera datę zmiany kalendarza gregoriańskiego.

10

int getLeastMaximum(int field)

Jeśli jest zmienna, zwraca najniższą wartość maksymalną dla danego pola.

11

int getMaximum(int field)

Zwraca maksymalną wartość dla danego pola.

12

Date getTime()

Pobiera bieżącą godzinę tego kalendarza.

13

long getTimeInMillis()

Pobiera bieżący czas tego kalendarza jako długi.

14

TimeZone getTimeZone()

Pobiera strefę czasową.

15

int getMinimum(int field)

Zwraca minimalną wartość dla danego pola.

16

int hashCode()

Zastępuje hashCode.

17

boolean isLeapYear(int year)

Określa, czy dany rok jest rokiem przestępnym.

18

void roll(int field, boolean up)

Dodaje lub odejmuje (w górę / w dół) pojedynczą jednostkę czasu w danym polu czasu bez zmiany większych pól.

19

void set(int field, int value)

Ustawia pole czasu z podaną wartością.

20

void set(int year, int month, int date)

Ustawia wartości pól rok, miesiąc i dzień.

21

void set(int year, int month, int date, int hour, int minute)

Ustawia wartości pól rok, miesiąc, data, godzina i minuta.

22

void set(int year, int month, int date, int hour, int minute, int second)

Ustawia wartości pól rok, miesiąc, data, godzina, minuta i sekunda.

23

void setGregorianChange(Date date)

Ustawia datę zmiany kalendarza gregoriańskiego.

24

void setTime(Date date)

Ustawia bieżący czas kalendarza z podaną datą.

25

void setTimeInMillis(long millis)

Ustawia bieżący czas tego kalendarza na podstawie podanej długiej wartości.

26

void setTimeZone(TimeZone value)

Ustawia strefę czasową z podaną wartością strefy czasowej.

27

String toString()

Zwraca ciąg znaków reprezentujący ten kalendarz.

Przykład

import java.util.*;
public class GregorianCalendarDemo {

   public static void main(String args[]) {
      String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", 
         "Oct", "Nov", "Dec"};
      
      int year;
      // Create a Gregorian calendar initialized
      // with the current date and time in the
      // default locale and timezone.
      
      GregorianCalendar gcalendar = new GregorianCalendar();
      
      // Display current time and date information.
      System.out.print("Date: ");
      System.out.print(months[gcalendar.get(Calendar.MONTH)]);
      System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
      System.out.println(year = gcalendar.get(Calendar.YEAR));
      System.out.print("Time: ");
      System.out.print(gcalendar.get(Calendar.HOUR) + ":");
      System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
      System.out.println(gcalendar.get(Calendar.SECOND));

      // Test if the current year is a leap year
      if(gcalendar.isLeapYear(year)) {
         System.out.println("The current year is a leap year");
      }else {
         System.out.println("The current year is not a leap year");
      }
   }
}

To da następujący wynik -

Wynik

Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year

Pełną listę stałych dostępnych w klasie Calendar można znaleźć w standardowej dokumentacji języka Java.

Java udostępnia pakiet java.util.regex do dopasowywania wzorców za pomocą wyrażeń regularnych. Wyrażenia regularne Java są bardzo podobne do języka programowania Perl i bardzo łatwe do nauczenia.

Wyrażenie regularne to specjalna sekwencja znaków, która pomaga dopasować lub znaleźć inne ciągi lub zestawy ciągów przy użyciu specjalistycznej składni przechowywanej we wzorcu. Można ich używać do wyszukiwania, edycji lub manipulowania tekstem i danymi.

Pakiet java.util.regex składa się głównie z następujących trzech klas -

  • Pattern Class- Obiekt Pattern jest skompilowaną reprezentacją wyrażenia regularnego. Klasa Pattern nie udostępnia żadnych publicznych konstruktorów. Aby utworzyć wzorzec, musisz najpierw wywołać jeden z jego publicznych statycznychcompile()metody, które następnie zwrócą obiekt Pattern. Te metody akceptują wyrażenie regularne jako pierwszy argument.

  • Matcher Class- Obiekt Matcher to silnik, który interpretuje wzorzec i wykonuje operacje dopasowywania względem ciągu wejściowego. Podobnie jak klasa Pattern, Matcher nie definiuje żadnych publicznych konstruktorów. Otrzymujesz obiekt Matcher, wywołującmatcher() na obiekcie Pattern.

  • PatternSyntaxException - Obiekt PatternSyntaxException to niezaznaczony wyjątek, który wskazuje na błąd składni we wzorcu wyrażenia regularnego.

Przechwytywanie grup

Przechwytywanie grup to sposób na traktowanie wielu postaci jako jednej jednostki. Tworzy się je poprzez umieszczenie znaków, które mają być zgrupowane, w nawiasach. Na przykład wyrażenie regularne (pies) tworzy pojedynczą grupę zawierającą litery „d”, „o” i „g”.

Grupy przechwytywania są numerowane, licząc ich nawiasy otwierające od lewej do prawej. Na przykład w wyrażeniu ((A) (B (C))) są cztery takie grupy -

  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)

Aby dowiedzieć się, ile grup jest obecnych w wyrażeniu, wywołaj metodę groupCount na obiekcie dopasowującym. Metoda groupCount zwraca plikint pokazująca liczbę grup przechwytujących obecnych we wzorcu dopasowania.

Istnieje również grupa specjalna, grupa 0, która zawsze reprezentuje całe wyrażenie. Ta grupa nie jest uwzględniona w łącznej kwocie zgłaszanej przez groupCount.

Example

Poniższy przykład ilustruje, jak znaleźć ciąg cyfr z podanego ciągu alfanumerycznego -

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      }else {
         System.out.println("NO MATCH");
      }
   }
}

To da następujący wynik -

Output

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

Składnia wyrażeń regularnych

Oto tabela zawierająca listę wszystkich składni metaznaków wyrażeń regularnych dostępnych w języku Java -

Podwyrażenie mecze
^ Dopasowuje początek wiersza.
$ Dopasowuje do końca wiersza.
. Dopasowuje dowolny pojedynczy znak z wyjątkiem nowej linii. Za pomocąm Opcja pozwala również dopasować nową linię.
[…] Dopasowuje dowolny pojedynczy znak w nawiasach.
[^ ...] Dopasowuje dowolny pojedynczy znak nie w nawiasach.
\ZA Początek całego ciągu.
\ z Koniec całego ciągu.
\ Z Koniec całego ciągu z wyjątkiem dopuszczalnego końcowego terminatora wiersza.
re* Dopasowuje 0 lub więcej wystąpień poprzedniego wyrażenia.
re + Dopasowuje 1 lub więcej poprzedniej rzeczy.
re? Dopasowuje 0 lub 1 wystąpienie poprzedniego wyrażenia.
re {n} Dopasowuje dokładnie n liczbę wystąpień poprzedniego wyrażenia.
re {n,} Dopasowuje n lub więcej wystąpień poprzedniego wyrażenia.
re {n, m} Dopasowuje co najmniej n i co najwyżej m wystąpień poprzedniego wyrażenia.
a | b Pasuje do a lub b.
(re) Grupuje wyrażenia regularne i zapamiętuje dopasowany tekst.
(?: re) Grupuje wyrażenia regularne bez zapamiętywania dopasowanego tekstu.
(?> re) Dopasowuje niezależny wzorzec bez cofania.
\ w Dopasowuje znaki słowa.
\ W Dopasowuje znaki inne niż słowa.
\ s Odpowiada spacji. Odpowiednik [\ t \ n \ r \ f].
\ S Dopasowuje niebiałą spację.
\re Dopasowuje cyfry. Odpowiednik [0-9].
\RE Dopasowuje niecyfry.
\ZA Dopasowuje początek ciągu.
\ Z Dopasowuje koniec ciągu. Jeśli istnieje nowa linia, pasuje ona tuż przed nową linią.
\ z Dopasowuje koniec ciągu.
\SOL Odpowiada punktowi, w którym zakończył się ostatni mecz.
\ n Odwołanie wsteczne do numeru grupy przechwytywania „n”.
\b Dopasowuje granice wyrazów poza nawiasami. Dopasowuje znak Backspace (0x08) wewnątrz nawiasów.
\B Dopasowuje granice bez słów.
\ n, \ t itd. Dopasowuje znaki nowej linii, powroty karetki, tabulatory itp.
\ Q Escape (cudzysłów) wszystkimi znakami do \ E.
\MI Kończy cytowanie zaczynające się od \ Q.

Metody klasy dopasowującej

Oto lista przydatnych metod instancji -

Metody indeksowania

Metody indeksu zapewniają przydatne wartości indeksu, które dokładnie pokazują, gdzie znaleziono dopasowanie w ciągu wejściowym -

Sr.No. Metoda i opis
1

public int start()

Zwraca indeks początkowy poprzedniego dopasowania.

2

public int start(int group)

Zwraca indeks początkowy podciągu przechwyconego przez daną grupę podczas poprzedniej operacji dopasowania.

3

public int end()

Zwraca przesunięcie po ostatnim dopasowanym znaku.

4

public int end(int group)

Zwraca przesunięcie po ostatnim znaku podciągu przechwyconego przez daną grupę podczas poprzedniej operacji dopasowania.

Metody badań

Metody badania sprawdzają ciąg wejściowy i zwracają wartość logiczną wskazującą, czy wzorzec został znaleziony, czy nie -

Sr.No. Metoda i opis
1

public boolean lookingAt()

Próbuje dopasować sekwencję wejściową, zaczynając od początku regionu, względem wzorca.

2

public boolean find()

Próbuje znaleźć następny podciąg sekwencji wejściowej, który pasuje do wzorca.

3

public boolean find(int start)

Resetuje ten element dopasowujący, a następnie próbuje znaleźć następny podciąg sekwencji wejściowej, który pasuje do wzorca, zaczynając od określonego indeksu.

4

public boolean matches()

Próbuje dopasować cały region do wzorca.

Metody wymiany

Metody zamiany to przydatne metody zastępowania tekstu w ciągu wejściowym -

Sr.No. Metoda i opis
1

public Matcher appendReplacement(StringBuffer sb, String replacement)

Implementuje nieterminalowy krok dołączania i zamieniania.

2

public StringBuffer appendTail(StringBuffer sb)

Implementuje krok dołączania i zastępowania terminala.

3

public String replaceAll(String replacement)

Zastępuje każdy podciąg sekwencji wejściowej, który pasuje do wzorca podanym ciągiem zastępującym.

4

public String replaceFirst(String replacement)

Zastępuje pierwszy podciąg sekwencji wejściowej, który pasuje do wzorca, podanym ciągiem zastępującym.

5

public static String quoteReplacement(String s)

Zwraca ciąg znaków zastępujący literał dla określonego ciągu. Ta metoda generuje String, który będzie działał jako dosłowny zamienniks w metodzie appendReplacement klasy Matcher.

Metody rozpoczęcia i zakończenia

Poniżej znajduje się przykład zliczający, ile razy słowo „kot” pojawia się w ciągu wejściowym -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = "\\bcat\\b";
   private static final String INPUT = "cat cat cat cattie cat";

   public static void main( String args[] ) {
      Pattern p = Pattern.compile(REGEX);
      Matcher m = p.matcher(INPUT);   // get a matcher object
      int count = 0;

      while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

To da następujący wynik -

Output

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Jak widać, w tym przykładzie zastosowano granice słów, aby zapewnić, że litery „c”, „a” „t” nie są jedynie podłańcuchem w dłuższym słowie. Zawiera również przydatne informacje o tym, gdzie w ciągu wejściowym wystąpiło dopasowanie.

Metoda start zwraca indeks początkowy podciągu przechwyconego przez daną grupę podczas poprzedniej operacji dopasowania, a end zwraca indeks ostatniego dopasowanego znaku plus jeden.

Dopasowania i metody LookingAt

Metody match i lookingAt próbują dopasować sekwencję wejściową do wzorca. Różnica polega jednak na tym, że dopasowanie wymaga dopasowania całej sekwencji wejściowej, a lookAt nie.

Obie metody zawsze rozpoczynają się na początku ciągu wejściowego. Oto przykład wyjaśniający funkcjonalność -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = "foo";
   private static final String INPUT = "fooooooooooooooooo";
   private static Pattern pattern;
   private static Matcher matcher;

   public static void main( String args[] ) {
      pattern = Pattern.compile(REGEX);
      matcher = pattern.matcher(INPUT);

      System.out.println("Current REGEX is: "+REGEX);
      System.out.println("Current INPUT is: "+INPUT);

      System.out.println("lookingAt(): "+matcher.lookingAt());
      System.out.println("matches(): "+matcher.matches());
   }
}

To da następujący wynik -

Output

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

Metody replaceFirst i replaceAll

Metody replaceFirst i replaceAll zastępują tekst pasujący do danego wyrażenia regularnego. Jak wskazują ich nazwy, replaceFirst zastępuje pierwsze wystąpienie, a replaceAll zastępuje wszystkie wystąpienia.

Oto przykład wyjaśniający funkcjonalność -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = "dog";
   private static String INPUT = "The dog says meow. " + "All dogs say meow.";
   private static String REPLACE = "cat";

   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT); 
      INPUT = m.replaceAll(REPLACE);
      System.out.println(INPUT);
   }
}

To da następujący wynik -

Output

The cat says meow. All cats say meow.

Metody appendReplacement i appendTail

Klasa Matcher udostępnia również metody appendReplacement i appendTail do zastępowania tekstu.

Oto przykład wyjaśniający funkcjonalność -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()) {
         m.appendReplacement(sb, REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

To da następujący wynik -

Output

-foo-foo-foo-

Metody klasy PatternSyntaxException

Wyjątek PatternSyntaxException to niezaznaczony wyjątek, który wskazuje na błąd składni we wzorcu wyrażenia regularnego. Klasa PatternSyntaxException udostępnia następujące metody pomagające określić, co poszło nie tak -

Sr.No. Metoda i opis
1

public String getDescription()

Pobiera opis błędu.

2

public int getIndex()

Pobiera indeks błędu.

3

public String getPattern()

Pobiera błędny wzorzec wyrażenia regularnego.

4

public String getMessage()

Zwraca wielowierszowy ciąg zawierający opis błędu składniowego i jego indeksu, błędny wzorzec wyrażenia regularnego oraz wizualne wskazanie indeksu błędu we wzorcu.

Metoda Java to zbiór instrukcji, które są zgrupowane razem w celu wykonania operacji. Kiedy wywołujesz System.out.println() na przykład system faktycznie wykonuje kilka instrukcji w celu wyświetlenia komunikatu na konsoli.

Teraz nauczysz się, jak tworzyć własne metody ze zwracanymi wartościami lub bez nich, wywoływać metodę z parametrami lub bez nich oraz stosować abstrakcję metod w projekcie programu.

Metoda tworzenia

Biorąc pod uwagę następujący przykład w celu wyjaśnienia składni metody -

Syntax

public static int methodName(int a, int b) {
   // body
}

Tutaj,

  • public static - modyfikator

  • int - typ zwrotu

  • methodName - nazwa metody

  • a, b - parametry formalne

  • int a, int b - lista parametrów

Definicja metody składa się z nagłówka metody i treści metody. To samo jest pokazane w następującej składni -

Syntax

modifier returnType nameOfMethod (Parameter List) {
   // method body
}

Przedstawiona powyżej składnia obejmuje -

  • modifier - Definiuje typ dostępu do metody i jest opcjonalne.

  • returnType - Metoda może zwrócić wartość.

  • nameOfMethod- To jest nazwa metody. Podpis metody składa się z nazwy metody i listy parametrów.

  • Parameter List- Lista parametrów, czyli rodzaj, kolejność i liczba parametrów metody. Są opcjonalne, metoda może zawierać zero parametrów.

  • method body - Treść metody określa, co metoda robi z instrukcjami.

Example

Oto kod źródłowy wyżej zdefiniowanej metody o nazwie min(). Ta metoda przyjmuje dwa parametry num1 i num2 i zwraca maksimum między dwoma -

/** the snippet returns the minimum between two numbers */

public static int minFunction(int n1, int n2) {
   int min;
   if (n1 > n2)
      min = n2;
   else
      min = n1;

   return min; 
}

Wywołanie metod

Aby użyć metody, należy ją wywołać. Istnieją dwa sposoby wywołania metody, tj. Metoda zwraca wartość lub nic nie zwraca (nie zwraca wartości).

Proces wywoływania metody jest prosty. Gdy program wywołuje metodę, kontrola programu zostaje przeniesiona do wywoływanej metody. Ta wywołana metoda następnie zwraca kontrolę do wywołującego w dwóch warunkach, gdy -

  • wykonywana jest instrukcja return.
  • dociera do metody kończącej nawias zamykający.

Metody zwracające void są traktowane jako wywołanie instrukcji. Rozważmy przykład -

System.out.println("This is tutorialspoint.com!");

Metodę zwracającą wartość można zrozumieć na poniższym przykładzie -

int result = sum(6, 9);

Poniżej znajduje się przykład pokazujący, jak zdefiniować metodę i jak ją wywołać -

Example

public class ExampleMinNumber {
   
   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      int c = minFunction(a, b);
      System.out.println("Minimum Value = " + c);
   }

   /** returns the minimum of two numbers */
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

To da następujący wynik -

Output

Minimum value = 6

Puste słowo kluczowe

Słowo kluczowe void pozwala nam tworzyć metody, które nie zwracają wartości. W poniższym przykładzie rozważamy metodę void methodRankPoints . Ta metoda jest metodą void, która nie zwraca żadnej wartości. Wywołanie metody void musi być instrukcją, tj. MethodRankPoints (255,7); . Jest to instrukcja języka Java zakończona średnikiem, jak pokazano w poniższym przykładzie.

Example

public class ExampleVoid {

   public static void main(String[] args) {
      methodRankPoints(255.7);
   }

   public static void methodRankPoints(double points) {
      if (points >= 202.5) {
         System.out.println("Rank:A1");
      }else if (points >= 122.4) {
         System.out.println("Rank:A2");
      }else {
         System.out.println("Rank:A3");
      }
   }
}

To da następujący wynik -

Output

Rank:A1

Przekazywanie parametrów według wartości

Podczas pracy z procesem wywołującym należy przekazywać argumenty. Powinny być w tej samej kolejności, co ich odpowiednie parametry w specyfikacji metody. Parametry mogą być przekazywane przez wartość lub przez odniesienie.

Przekazywanie parametrów przez wartość oznacza wywołanie metody z parametrem. W ten sposób wartość argumentu jest przekazywana do parametru.

Example

Poniższy program przedstawia przykład przekazywania parametru przez wartość. Wartości argumentów pozostają takie same nawet po wywołaniu metody.

public class swappingExample {

   public static void main(String[] args) {
      int a = 30;
      int b = 45;
      System.out.println("Before swapping, a = " + a + " and b = " + b);

      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be same here**:");
      System.out.println("After swapping, a = " + a + " and b is " + b);
   }

   public static void swapFunction(int a, int b) {
      System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
      
      // Swap n1 with n2
      int c = a;
      a = b;
      b = c;
      System.out.println("After swapping(Inside), a = " + a + " b = " + b);
   }
}

To da następujący wynik -

Output

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30

**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

Przeciążanie metod

Gdy klasa ma dwie lub więcej metod o tej samej nazwie, ale różnych parametrach, jest to nazywane przeciążaniem metod. Różni się od nadpisywania. Przy zastępowaniu metoda ma tę samą nazwę metody, typ, liczbę parametrów itp.

Rozważmy omówiony wcześniej przykład znalezienia minimalnych liczb typu całkowitego. Jeśli, powiedzmy, chcemy znaleźć minimalną liczbę typów podwójnych. Następnie zostanie wprowadzona koncepcja przeciążania, aby utworzyć dwie lub więcej metod o tej samej nazwie, ale różnych parametrach.

Poniższy przykład wyjaśnia to samo -

Example

public class ExampleOverloading {

   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      double c = 7.3;
      double d = 9.4;
      int result1 = minFunction(a, b);
      
      // same function name with different parameters
      double result2 = minFunction(c, d);
      System.out.println("Minimum Value = " + result1);
      System.out.println("Minimum Value = " + result2);
   }

   // for integer
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
   
   // for double
   public static double minFunction(double n1, double n2) {
     double min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

To da następujący wynik -

Output

Minimum Value = 6
Minimum Value = 7.3

Przeciążanie metod sprawia, że ​​program jest czytelny. Tutaj dwie metody są podane pod tą samą nazwą, ale z różnymi parametrami. Wynikiem jest minimalna liczba z typów całkowitych i podwójnych.

Korzystanie z argumentów wiersza polecenia

Czasami będziesz chciał przekazać pewne informacje do programu po jego uruchomieniu. Osiąga się to poprzez przekazanie argumentów wiersza poleceń do funkcji main ().

Argument wiersza polecenia to informacja, która następuje bezpośrednio po nazwie programu w wierszu poleceń podczas jego wykonywania. Dostęp do argumentów wiersza poleceń w programie Java jest dość łatwy. Są przechowywane jako łańcuchy w tablicy String przekazanej do funkcji main ().

Example

Poniższy program wyświetla wszystkie argumenty wiersza polecenia, które jest wywoływane z -

public class CommandLine {

   public static void main(String args[]) { 
      for(int i = 0; i<args.length; i++) {
         System.out.println("args[" + i + "]: " +  args[i]);
      }
   }
}

Spróbuj uruchomić ten program, jak pokazano tutaj -

$java CommandLine this is a command line 200 -100

To da następujący wynik -

Output

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

Słowo kluczowe this

thisto słowo kluczowe w Javie, które jest używane jako odniesienie do obiektu bieżącej klasy, w metodzie instancji lub konstruktorze. Używając tego możesz odwoływać się do członków klasy, takich jak konstruktory, zmienne i metody.

Note- słowo kluczowe this jest używane tylko w metodach instancji lub konstruktorach

Ogólnie rzecz biorąc, słowo kluczowe this jest używane do -

  • Odróżnij zmienne instancji od zmiennych lokalnych, jeśli mają takie same nazwy w konstruktorze lub metodzie.

class Student {
   int age;   
   Student(int age) {
      this.age = age;	
   }
}
  • Wywołaj jeden typ konstruktora (sparametryzowany konstruktor lub domyślny) z innego w klasie. Nazywa się to jawnym wywołaniem konstruktora.

class Student {
   int age
   Student() {
      this(20);
   }
   
   Student(int age) {
      this.age = age;	
   }
}

Example

Oto przykład, który używa tego słowa kluczowego, aby uzyskać dostęp do członków klasy. Skopiuj i wklej następujący program do pliku o nazwie,This_Example.java.

public class This_Example {
   // Instance variable num
   int num = 10;
	
   This_Example() {
      System.out.println("This is an example program on keyword this");	
   }

   This_Example(int num) {
      // Invoking the default constructor
      this();
      
      // Assigning the local variable num to the instance variable num
      this.num = num;	   
   }
   
   public void greet() {
      System.out.println("Hi Welcome to Tutorialspoint");
   }
      
   public void print() {
      // Local variable num
      int num = 20;
      
      // Printing the local variable
      System.out.println("value of local variable num is : "+num);
      
      // Printing the instance variable
      System.out.println("value of instance variable num is : "+this.num);
      
      // Invoking the greet method of a class
      this.greet();     
   }
   
   public static void main(String[] args) {
      // Instantiating the class
      This_Example obj1 = new This_Example();
      
      // Invoking the print method
      obj1.print();
	  
      // Passing a new value to the num variable through Parameterized constructor
      This_Example obj2 = new This_Example(30);
      
      // Invoking the print method again
      obj2.print(); 
   }
}

To da następujący wynik -

Output

This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 10
Hi Welcome to Tutorialspoint
This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 30
Hi Welcome to Tutorialspoint

Argumenty zmienne (var-args)

JDK 1.5 umożliwia przekazywanie zmiennej liczby argumentów tego samego typu do metody. Parametr w metodzie jest zadeklarowany w następujący sposób -

typeName... parameterName

W deklaracji metody określasz typ, po którym następuje wielokropek (...). W metodzie można określić tylko jeden parametr o zmiennej długości, który musi być ostatnim parametrem. Wszelkie zwykłe parametry muszą go poprzedzać.

Example

public class VarargsDemo {

   public static void main(String args[]) {
      // Call method with variable args  
	   printMax(34, 3, 3, 2, 56.5);
      printMax(new double[]{1, 2, 3});
   }

   public static void printMax( double... numbers) {
      if (numbers.length == 0) {
         System.out.println("No argument passed");
         return;
      }

      double result = numbers[0];

      for (int i = 1; i <  numbers.length; i++)
      if (numbers[i] >  result)
      result = numbers[i];
      System.out.println("The max value is " + result);
   }
}

To da następujący wynik -

Output

The max value is 56.5
The max value is 3.0

Metoda finalize ()

Możliwe jest zdefiniowanie metody, która zostanie wywołana tuż przed ostatecznym zniszczeniem obiektu przez moduł odśmiecania pamięci. Ta metoda nazywa sięfinalize( )i może służyć do zapewnienia prawidłowego zakończenia obiektu.

Na przykład możesz użyć finalize (), aby upewnić się, że otwarty plik, którego właścicielem jest ten obiekt, zostanie zamknięty.

Aby dodać finalizator do klasy, wystarczy zdefiniować metodę finalize (). Środowisko wykonawcze Java wywołuje tę metodę za każdym razem, gdy ma zamiar odtworzyć obiekt tej klasy.

W metodzie finalize () określisz akcje, które muszą zostać wykonane, zanim obiekt zostanie zniszczony.

Metoda finalize () ma tę ogólną postać -

protected void finalize( ) {
   // finalization code here
}

Tutaj słowo kluczowe protected jest specyfikatorem, który zapobiega dostępowi do finalize () przez kod zdefiniowany poza jego klasą.

Oznacza to, że nie możesz wiedzieć, kiedy, a nawet czy finalize () zostanie wykonany. Na przykład, jeśli program zakończy się przed wyrzuceniem elementów bezużytecznych, funkcja finalize () nie zostanie wykonana.

Pakiet java.io zawiera prawie każdą klasę, której możesz potrzebować do wykonywania operacji wejścia / wyjścia (I / O) w Javie. Wszystkie te strumienie stanowią źródło wejściowe i miejsce docelowe. Strumień w pakiecie java.io obsługuje wiele danych, takich jak prymitywy, obiekt, zlokalizowane znaki itp.

Strumień

Strumień można zdefiniować jako sekwencję danych. Istnieją dwa rodzaje strumieni -

  • InPutStream - InputStream służy do odczytywania danych ze źródła.

  • OutPutStream - OutputStream służy do zapisywania danych w miejscu docelowym.

Java zapewnia silną, ale elastyczną obsługę we / wy związaną z plikami i sieciami, ale ten samouczek obejmuje bardzo podstawowe funkcje związane ze strumieniami i we / wy. Najczęściej używane przykłady zobaczymy jeden po drugim -

Strumienie bajtów

Strumienie bajtów Java są używane do wprowadzania i wyprowadzania 8-bitowych bajtów. Chociaż istnieje wiele klas związanych ze strumieniami bajtów, ale najczęściej używanymi klasami są:FileInputStream i FileOutputStream. Poniżej znajduje się przykład, który wykorzystuje te dwie klasy do kopiowania pliku wejściowego do pliku wyjściowego -

Example

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {  
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Teraz miejmy plik input.txt o następującej treści -

This is test for copy file.

W kolejnym kroku skompiluj powyższy program i uruchom go, co spowoduje utworzenie pliku output.txt z taką samą zawartością, jaką mamy w pliku input.txt. Więc umieśćmy powyższy kod w pliku CopyFile.java i wykonajmy następujące czynności -

$javac CopyFile.java $java CopyFile

Strumienie postaci

Jawa Byte strumienie są używane do wykonywania operacji wejścia i wyjścia 8-bitowych bajtów, podczas gdy Java Characterstrumienie są używane do wykonywania operacji wejścia i wyjścia dla 16-bitowego Unicode. Chociaż istnieje wiele klas związanych ze strumieniami postaci, ale najczęściej używanymi klasami są,FileReader i FileWriter. Chociaż wewnętrznie FileReader używa FileInputStream, a FileWriter używa FileOutputStream, ale tutaj główna różnica polega na tym, że FileReader odczytuje dwa bajty na raz, a FileWriter zapisuje dwa bajty na raz.

Możemy ponownie napisać powyższy przykład, który wykorzystuje te dwie klasy do skopiowania pliku wejściowego (posiadającego znaki Unicode) do pliku wyjściowego -

Example

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Teraz miejmy plik input.txt o następującej treści -

This is test for copy file.

W kolejnym kroku skompiluj powyższy program i uruchom go, co spowoduje utworzenie pliku output.txt z taką samą zawartością, jaką mamy w pliku input.txt. Więc umieśćmy powyższy kod w pliku CopyFile.java i wykonajmy następujące czynności -

$javac CopyFile.java $java CopyFile

Strumienie standardowe

Wszystkie języki programowania zapewniają obsługę standardowych operacji we / wy, w których program użytkownika może pobierać dane wejściowe z klawiatury, a następnie wyświetlać dane wyjściowe na ekranie komputera. Jeśli znasz języki programowania C lub C ++, musisz wiedzieć o trzech standardowych urządzeniach STDIN, STDOUT i STDERR. Podobnie Java udostępnia następujące trzy standardowe strumienie -

  • Standard Input - Służy do dostarczania danych do programu użytkownika i zwykle klawiatura jest używana jako standardowy strumień wejściowy i jest reprezentowana jako System.in.

  • Standard Output - Służy do wyprowadzania danych generowanych przez program użytkownika i zwykle ekran komputera jest używany do standardowego strumienia wyjściowego i jest reprezentowany jako System.out.

  • Standard Error - Służy do wyświetlania danych o błędach generowanych przez program użytkownika i zwykle ekran komputera jest używany do standardowego strumienia błędów i jest reprezentowany jako System.err.

Poniżej znajduje się prosty program, który tworzy InputStreamReader czytać standardowy strumień wejściowy, dopóki użytkownik nie wpisze „q” -

Example

import java.io.*;
public class ReadConsole {

   public static void main(String args[]) throws IOException {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}

Zachowajmy powyższy kod w pliku ReadConsole.java i spróbujmy go skompilować i wykonać, jak pokazano w poniższym programie. Ten program odczytuje i wypisuje ten sam znak, dopóki nie naciśniemy 'q' -

$javac ReadConsole.java $java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

Czytanie i pisanie plików

Jak opisano wcześniej, strumień można zdefiniować jako sekwencję danych. PlikInputStream służy do odczytywania danych ze źródła i pliku OutputStream służy do zapisywania danych w miejscu docelowym.

Oto hierarchia klas zajmujących się strumieniami wejściowymi i wyjściowymi.

Są to dwa ważne strumienie FileInputStream i FileOutputStream, które zostaną omówione w tym samouczku.

FileInputStream

Ten strumień służy do odczytywania danych z plików. Obiekty można tworzyć za pomocą słowa kluczowegonew i jest dostępnych kilka typów konstruktorów.

Poniższy konstruktor przyjmuje nazwę pliku jako ciąg znaków, aby utworzyć obiekt strumienia wejściowego w celu odczytania pliku -

InputStream f = new FileInputStream("C:/java/hello");

Poniższy konstruktor pobiera obiekt pliku, aby utworzyć obiekt strumienia wejściowego w celu odczytania pliku. Najpierw tworzymy obiekt pliku za pomocą metody File () w następujący sposób -

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

Gdy masz już pod ręką obiekt InputStream , pojawia się lista metod pomocniczych, których można użyć do odczytu strumienia lub wykonywania innych operacji w strumieniu.

Sr.No. Metoda i opis
1

public void close() throws IOException{}

Ta metoda zamyka strumień wyjściowy pliku. Zwalnia wszystkie zasoby systemowe skojarzone z plikiem. Zgłasza IOException.

2

protected void finalize()throws IOException {}

Ta metoda czyści połączenie z plikiem. Zapewnia, że ​​metoda close tego strumienia wyjściowego pliku jest wywoływana, gdy nie ma więcej odwołań do tego strumienia. Zgłasza IOException.

3

public int read(int r)throws IOException{}

Ta metoda odczytuje określony bajt danych z InputStream. Zwraca int. Zwraca następny bajt danych i zwraca -1, jeśli jest to koniec pliku.

4

public int read(byte[] r) throws IOException{}

Ta metoda odczytuje r.length bajtów ze strumienia wejściowego do tablicy. Zwraca całkowitą liczbę odczytanych bajtów. Jeśli jest to koniec pliku, zostanie zwrócone -1.

5

public int available() throws IOException{}

Podaje liczbę bajtów, które można odczytać z tego strumienia wejściowego pliku. Zwraca int.

Dostępne są inne ważne strumienie wejściowe, aby uzyskać więcej informacji, możesz zapoznać się z poniższymi linkami -

  • ByteArrayInputStream

  • DataInputStream

FileOutputStream

FileOutputStream służy do tworzenia pliku i zapisywania do niego danych. Strumień utworzyłby plik, jeśli jeszcze nie istnieje, przed otwarciem go do wyjścia.

Oto dwa konstruktory, których można użyć do utworzenia obiektu FileOutputStream.

Następujący konstruktor przyjmuje nazwę pliku jako ciąg znaków, aby utworzyć obiekt strumienia wejściowego do zapisania pliku -

OutputStream f = new FileOutputStream("C:/java/hello")

Poniższy konstruktor pobiera obiekt pliku, aby utworzyć obiekt strumienia wyjściowego do zapisania pliku. Najpierw tworzymy obiekt pliku za pomocą metody File () w następujący sposób -

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

Gdy masz już w ręku obiekt OutputStream , pojawia się lista metod pomocniczych, których można użyć do zapisu w strumieniu lub wykonywania innych operacji w strumieniu.

Sr.No. Metoda i opis
1

public void close() throws IOException{}

Ta metoda zamyka strumień wyjściowy pliku. Zwalnia wszystkie zasoby systemowe skojarzone z plikiem. Zgłasza IOException.

2

protected void finalize()throws IOException {}

Ta metoda czyści połączenie z plikiem. Zapewnia, że ​​metoda close tego strumienia wyjściowego pliku jest wywoływana, gdy nie ma więcej odwołań do tego strumienia. Zgłasza IOException.

3

public void write(int w)throws IOException{}

Te metody zapisują określony bajt w strumieniu wyjściowym.

4

public void write(byte[] w)

Zapisuje bajty w.length ze wspomnianej tablicy bajtów do OutputStream.

Dostępne są inne ważne strumienie wyjściowe, aby uzyskać więcej informacji, możesz zapoznać się z poniższymi linkami -

  • ByteArrayOutputStream

  • DataOutputStream

Example

Poniżej znajduje się przykład demonstrujący InputStream i OutputStream -

import java.io.*;
public class fileStreamTest {

   public static void main(String args[]) {
   
      try {
         byte bWrite [] = {11,21,3,40,5};
         OutputStream os = new FileOutputStream("test.txt");
         for(int x = 0; x < bWrite.length ; x++) {
            os.write( bWrite[x] );   // writes the bytes
         }
         os.close();
     
         InputStream is = new FileInputStream("test.txt");
         int size = is.available();

         for(int i = 0; i < size; i++) {
            System.out.print((char)is.read() + "  ");
         }
         is.close();
      } catch (IOException e) {
         System.out.print("Exception");
      }	
   }
}

Powyższy kod utworzyłby plik test.txt i zapisałby podane liczby w formacie binarnym. To samo byłoby dane wyjściowe na ekranie standardowym.

Nawigacja po plikach i we / wy

Jest kilka innych zajęć, przez które będziemy przechodzić, aby poznać podstawy nawigacji po plikach i we / wy.

  • Klasa pliku

  • Klasa FileReader

  • Klasa FileWriter

Katalogi w Javie

Katalog to plik, który może zawierać listę innych plików i katalogów. UżywaszFileobiekt do tworzenia katalogów, do listy plików dostępnych w katalogu. Aby uzyskać szczegółowe informacje, zapoznaj się z listą wszystkich metod, które możesz wywołać w obiekcie File, i sprawdź, co jest związane z katalogami.

Tworzenie katalogów

Są dwa przydatne File metody narzędziowe, które można wykorzystać do tworzenia katalogów -

  • Plik mkdir( )metoda tworzy katalog, zwracając wartość true w przypadku sukcesu i false w przypadku niepowodzenia. Niepowodzenie wskazuje, że ścieżka określona w obiekcie File już istnieje lub że nie można utworzyć katalogu, ponieważ cała ścieżka jeszcze nie istnieje.

  • Plik mkdirs() metoda tworzy zarówno katalog, jak i wszystkie elementy nadrzędne katalogu.

Poniższy przykład tworzy katalog "/ tmp / user / java / bin" -

Example

import java.io.File;
public class CreateDir {

   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      
      // Create directory now.
      d.mkdirs();
   }
}

Skompiluj i wykonaj powyższy kod, aby utworzyć plik „/ tmp / user / java / bin”.

Note- Java automatycznie dba o separatory ścieżek w systemach UNIX i Windows zgodnie z konwencjami. Jeśli użyjesz ukośnika (/) w wersji Java dla systemu Windows, ścieżka nadal będzie poprawnie rozpoznawana.

Lista katalogów

Możesz użyć list( ) metoda dostarczona przez File obiekt, aby wyświetlić listę wszystkich plików i katalogów dostępnych w katalogu w następujący sposób -

Example

import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;
  
      try {      
         // create new file object
         file = new File("/tmp");

         // array of files and directory
         paths = file.list();

         // for each name in the path array
         for(String path:paths) {
            // prints filename and directory name
            System.out.println(path);
         }
      } catch (Exception e) {
         // if any error occurs
         e.printStackTrace();
      }
   }
}

Spowoduje to wygenerowanie następującego wyniku w oparciu o katalogi i pliki dostępne w Twoim /tmp katalog -

Output

test1.txt
test2.txt
ReadDir.java
ReadDir.class

Wyjątkiem (lub wyjątkowym zdarzeniem) jest problem, który pojawia się podczas wykonywania programu. Kiedy plikException występuje, normalny przepływ programu zostaje zakłócony, a program / Aplikacja kończy się nieprawidłowo, co nie jest zalecane, dlatego te wyjątki powinny być obsługiwane.

Wyjątek może wystąpić z wielu różnych powodów. Poniżej przedstawiono kilka scenariuszy, w których występuje wyjątek.

  • Użytkownik wprowadził nieprawidłowe dane.

  • Nie można znaleźć pliku, który należy otworzyć.

  • Połączenie sieciowe zostało utracone w trakcie komunikacji lub w maszynie JVM zabrakło pamięci.

Niektóre z tych wyjątków są spowodowane błędem użytkownika, inne błędem programisty, a jeszcze innymi zasobami fizycznymi, które w jakiś sposób uległy awarii.

Na tej podstawie mamy trzy kategorie wyjątków. Musisz je zrozumieć, aby wiedzieć, jak działa obsługa wyjątków w Javie.

  • Checked exceptions- Sprawdzony wyjątek to wyjątek, który jest sprawdzany (powiadamiany) przez kompilator w czasie kompilacji, są one również nazywane wyjątkami czasu kompilacji. Tych wyjątków nie można po prostu zignorować, programista powinien się nimi zająć (obsłużyć).

Na przykład, jeśli używasz FileReaderklasy w programie do odczytu danych z pliku, jeśli plik określony w jego konstruktorze nie istnieje, występuje wyjątek FileNotFoundException i kompilator monituje programistę o obsłużenie wyjątku.

Przykład

import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {

   public static void main(String args[]) {		
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file); 
   }
}

Jeśli spróbujesz skompilować powyższy program, uzyskasz następujące wyjątki.

Wynik

C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error

Note - Od metod read() i close() klasy FileReader zgłasza IOException, można zauważyć, że kompilator powiadamia o obsłużeniu IOException wraz z FileNotFoundException.

  • Unchecked exceptions- Niezaznaczony wyjątek to wyjątek występujący w czasie wykonywania. Są one również nazywane jakoRuntime Exceptions. Obejmują one błędy programistyczne, takie jak błędy logiczne lub niewłaściwe użycie interfejsu API. Wyjątki środowiska uruchomieniowego są ignorowane w czasie kompilacji.

Na przykład, jeśli deklarują tablicę o rozmiarze 5 w swoim programie, a próby wywołania 6 th element tablicy wówczas ArrayIndexOutOfBoundsExceptionexception występuje.

Przykład

public class Unchecked_Demo {
   
   public static void main(String args[]) {
      int num[] = {1, 2, 3, 4};
      System.out.println(num[5]);
   }
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wyjątek.

Wynik

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)
  • Errors- To wcale nie są wyjątki, ale problemy, które powstają poza kontrolą użytkownika lub programisty. Błędy są zwykle ignorowane w kodzie, ponieważ rzadko można coś zrobić z błędem. Na przykład, jeśli nastąpi przepełnienie stosu, wystąpi błąd. Są również ignorowane podczas kompilacji.

Hierarchia wyjątków

Wszystkie klasy wyjątków są podtypami klasy java.lang.Exception. Klasa wyjątku jest podklasą klasy Throwable. Oprócz klasy wyjątków istnieje inna podklasa o nazwie Error, która wywodzi się z klasy Throwable.

Błędy to nienormalne warunki występujące w przypadku poważnych awarii, których nie obsługują programy Java. Błędy są generowane w celu wskazania błędów generowanych przez środowisko wykonawcze. Przykład: zabrakło pamięci w JVM. Zwykle programy nie mogą naprawić błędów.

Klasa Exception ma dwie główne podklasy: klasę IOException i klasę RuntimeException.

Poniżej znajduje się lista najczęściej zaznaczonych i niezaznaczonych wbudowanych wyjątków Java .

Metody wyjątków

Poniżej znajduje się lista ważnych metod dostępnych w klasie Throwable.

Sr.No. Metoda i opis
1

public String getMessage()

Zwraca szczegółowy komunikat o wystąpieniu wyjątku. Ta wiadomość jest inicjowana w konstruktorze Throwable.

2

public Throwable getCause()

Zwraca przyczynę wyjątku reprezentowaną przez obiekt Throwable.

3

public String toString()

Zwraca nazwę klasy połączoną z wynikiem getMessage ().

4

public void printStackTrace()

Wyświetla wynik metody toString () wraz ze śladem stosu do System.err, strumienia wyjściowego błędu.

5

public StackTraceElement [] getStackTrace()

Zwraca tablicę zawierającą każdy element ze śladu stosu. Element pod indeksem 0 reprezentuje górę stosu wywołań, a ostatni element w tablicy reprezentuje metodę na dole stosu wywołań.

6

public Throwable fillInStackTrace()

Wypełnia ślad stosu tego obiektu Throwable bieżącym śladem stosu, dodając do wszelkich poprzednich informacji w śladzie stosu.

Łapanie wyjątków

Metoda przechwytuje wyjątek przy użyciu kombinacji try i catchsłowa kluczowe. Blok try / catch jest umieszczany wokół kodu, który może generować wyjątek. Kod w bloku try / catch jest nazywany kodem chronionym, a składnia użycia try / catch wygląda następująco -

Składnia

try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

Kod podatny na wyjątki jest umieszczony w bloku try. Gdy wystąpi wyjątek, ten wyjątek jest obsługiwany przez skojarzony z nim blok catch. Po każdym bloku try powinien natychmiast następować blok catch lub blok na końcu.

Instrukcja catch obejmuje deklarowanie typu wyjątku, który próbujesz przechwycić. Jeśli w kodzie chronionym wystąpi wyjątek, sprawdzany jest blok (lub bloki) catch, który następuje po try. Jeśli typ wyjątku, który wystąpił, jest wymieniony w bloku catch, wyjątek jest przekazywany do bloku catch, podobnie jak argument jest przekazywany do parametru metody.

Przykład

Poniżej znajduje się tablica zadeklarowana z 2 elementami. Następnie kod próbuje uzyskać dostęp do 3 rd elementu tablicy, który zgłasza wyjątek.

// File Name : ExcepTest.java
import java.io.*;

public class ExcepTest {

   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

To da następujący wynik -

Wynik

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

Wiele bloków połowowych

Po bloku try może następować wiele bloków catch. Składnia wielu bloków catch wygląda następująco -

Składnia

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}

Poprzednie instrukcje przedstawiają trzy bloki catch, ale po jednej próbie możesz mieć ich dowolną liczbę. Jeśli wyjątek wystąpi w chronionym kodzie, wyjątek zostanie zgłoszony do pierwszego bloku catch na liście. Jeśli typ danych zgłoszonego wyjątku jest zgodny z ExceptionType1, zostanie tam przechwycony. Jeśli nie, wyjątek jest przekazywany do drugiej instrukcji catch. Trwa to do momentu, gdy wyjątek zostanie przechwycony lub przechwycony przez wszystkie przechwytywania, w takim przypadku bieżąca metoda zatrzymuje wykonywanie, a wyjątek jest zgłaszany do poprzedniej metody na stosie wywołań.

Przykład

Oto segment kodu pokazujący, jak używać wielu instrukcji try / catch.

try {
   file = new FileInputStream(fileName);
   x = (byte) file.read();
} catch (IOException i) {
   i.printStackTrace();
   return -1;
} catch (FileNotFoundException f) // Not valid! {
   f.printStackTrace();
   return -1;
}

Wyłapywanie wielu typów wyjątków

Od wersji Java 7 można obsługiwać więcej niż jeden wyjątek za pomocą jednego bloku catch, ta funkcja upraszcza kod. Oto, jak byś to zrobił -

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Słowa kluczowe rzuca / rzuca

Jeśli metoda nie obsługuje zaznaczonego wyjątku, metoda musi zadeklarować ją przy użyciu throwssłowo kluczowe. Słowo kluczowe throws pojawia się na końcu podpisu metody.

Możesz zgłosić wyjątek, nowo utworzony lub wyjątek, który właśnie został przechwycony, używając throw słowo kluczowe.

Spróbuj zrozumieć różnicę między słowami kluczowymi throws i throw, throws służy do odroczenia obsługi sprawdzanego wyjątku, a throw służy do jawnego wywołania wyjątku.

Poniższa metoda deklaruje, że zgłasza RemoteException -

Przykład

import java.io.*;
public class className {

   public void deposit(double amount) throws RemoteException {
      // Method implementation
      throw new RemoteException();
   }
   // Remainder of class definition
}

Metoda może zadeklarować, że zgłasza więcej niż jeden wyjątek, w którym to przypadku wyjątki są zadeklarowane na liście oddzielonej przecinkami. Na przykład poniższa metoda deklaruje, że zgłasza RemoteException i InsufficientFundsException -

Przykład

import java.io.*;
public class className {

   public void withdraw(double amount) throws RemoteException, 
      InsufficientFundsException {
      // Method implementation
   }
   // Remainder of class definition
}

Ostatni blok

Ostatni blok następuje po bloku try lub bloku catch. Końcowy blok kodu zawsze jest wykonywany, niezależnie od wystąpienia wyjątku.

Korzystanie z bloku last umożliwia uruchamianie dowolnych instrukcji typu czyszczenia, które chcesz wykonać, bez względu na to, co dzieje się w chronionym kodzie.

Ostateczny blok pojawia się na końcu bloków catch i ma następującą składnię -

Składnia

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}

Przykład

public class ExcepTest {

   public static void main(String args[]) {
      int a[] = new int[2];
      try {
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown  :" + e);
      }finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

To da następujący wynik -

Wynik

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

Zwróć uwagę na następujące kwestie -

  • Klauzula catch nie może istnieć bez instrukcji try.

  • Nie jest obowiązkowe umieszczanie klauzul końcowych za każdym razem, gdy obecny jest blok try / catch.

  • Blok try nie może być obecny bez klauzuli catch lub klauzuli last.

  • Żaden kod nie może występować pomiędzy blokami try, catch, last.

Próba z zasobami

Ogólnie rzecz biorąc, kiedy używamy jakichkolwiek zasobów, takich jak strumienie, połączenia itp., Musimy je jawnie zamknąć, używając funkcji last block. W poniższym programie odczytujemy dane z pliku za pomocąFileReader i zamykamy go za pomocą final block.

Przykład

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]) {
      FileReader fr = null;		
      try {
         File file = new File("file.txt");
         fr = new FileReader(file); char [] a = new char[50];
         fr.read(a);   // reads the content to the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }finally {
         try {
            fr.close();
         } catch (IOException ex) {		
            ex.printStackTrace();
         }
      }
   }
}

try-with-resources, zwany także automatic resource management, to nowy mechanizm obsługi wyjątków, który został wprowadzony w Javie 7, który automatycznie zamyka zasoby używane w bloku try catch.

Aby skorzystać z tej instrukcji, wystarczy zadeklarować wymagane zasoby w nawiasach, a utworzony zasób zostanie automatycznie zamknięty na końcu bloku. Poniżej znajduje się składnia instrukcji try-with-resources.

Składnia

try(FileReader fr = new FileReader("file path")) {
   // use the resource
   } catch () {
      // body of catch 
   }
}

Poniżej znajduje się program, który odczytuje dane z pliku za pomocą instrukcji try-with-resources.

Przykład

import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]) {
      try(FileReader fr = new FileReader("E://file.txt")) {
         char [] a = new char[50];
         fr.read(a);   // reads the contentto the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Podczas pracy z instrukcją try-with-resources należy pamiętać o następujących kwestiach.

  • Aby użyć klasy z instrukcją try-with-resources, należy ją zaimplementować AutoCloseable interfejs i close() metoda jest wywoływana automatycznie w czasie wykonywania.

  • W instrukcji try-with-resources można zadeklarować więcej niż jedną klasę.

  • Podczas deklarowania wielu klas w bloku try instrukcji try-with-resources, klasy te są zamykane w odwrotnej kolejności.

  • Z wyjątkiem deklaracji zasobów w nawiasach, wszystko jest takie samo jak zwykły blok try / catch bloku try.

  • Zasób zadeklarowany w try zostanie utworzony tuż przed rozpoczęciem bloku try.

  • Zasób zadeklarowany w bloku try jest niejawnie deklarowany jako ostateczny.

Wyjątki zdefiniowane przez użytkownika

Możesz tworzyć własne wyjątki w Javie. Podczas pisania własnych klas wyjątków pamiętaj o następujących kwestiach -

  • Wszystkie wyjątki muszą być dzieckiem Throwable.

  • Jeśli chcesz napisać sprawdzony wyjątek, który jest automatycznie wymuszany przez regułę Handle lub Declare, musisz rozszerzyć klasę Exception.

  • Jeśli chcesz napisać wyjątek czasu wykonywania, musisz rozszerzyć klasę RuntimeException.

Możemy zdefiniować własną klasę wyjątków, jak poniżej -

class MyException extends Exception {
}

Wystarczy rozszerzyć predefiniowany plik Exceptionklasę, aby utworzyć własny wyjątek. Są to wyjątki sprawdzone. NastępująceInsufficientFundsExceptionclass to wyjątek zdefiniowany przez użytkownika, który rozszerza klasę Exception, czyniąc go sprawdzanym wyjątkiem. Klasa wyjątku jest jak każda inna klasa i zawiera przydatne pola i metody.

Przykład

// File Name InsufficientFundsException.java
import java.io.*;

public class InsufficientFundsException extends Exception {
   private double amount;
   
   public InsufficientFundsException(double amount) {
      this.amount = amount;
   }
   
   public double getAmount() {
      return amount;
   }
}

Aby zademonstrować użycie naszego wyjątku zdefiniowanego przez użytkownika, poniższa klasa CheckingAccount zawiera metodę replace (), która zgłasza wyjątek InsufficientFundsException.

// File Name CheckingAccount.java
import java.io.*;

public class CheckingAccount {
   private double balance;
   private int number;
   
   public CheckingAccount(int number) {
      this.number = number;
   }
   
   public void deposit(double amount) {
      balance += amount;
   }
   
   public void withdraw(double amount) throws InsufficientFundsException {
      if(amount <= balance) {
         balance -= amount;
      }else {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   
   public double getBalance() {
      return balance;
   }
   
   public int getNumber() {
      return number;
   }
}

Poniższy program BankDemo demonstruje wywoływanie metod depozyt () i wycofanie () konta CheckingAccount.

// File Name BankDemo.java
public class BankDemo {

   public static void main(String [] args) {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); } catch (InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount());
         e.printStackTrace();
      }
   }
}

Skompiluj wszystkie powyższe trzy pliki i uruchom BankDemo. To da następujący wynik -

Wynik

Depositing $500... Withdrawing $100...

Withdrawing $600... Sorry, but you are short $200.0
InsufficientFundsException
         at CheckingAccount.withdraw(CheckingAccount.java:25)
         at BankDemo.main(BankDemo.java:13)

Typowe wyjątki

W Javie można zdefiniować dwie kategorie Wyjątki i Błędy.

  • JVM Exceptions- Są to wyjątki / błędy, które są zgłaszane wyłącznie lub logicznie przez maszynę JVM. Przykłady: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.

  • Programmatic Exceptions- Te wyjątki są zgłaszane jawnie przez aplikację lub programistów API. Przykłady: IllegalArgumentException, IllegalStateException.

W tym rozdziale omówimy wewnętrzne klasy języka Java.

Klasy zagnieżdżone

W Javie, podobnie jak w metodach, zmienne klasy mogą mieć inną klasę jako jej składową. Pisanie klasy w innej jest dozwolone w Javie. Klasa zapisana w programie nazywa sięnested class, a klasa, która zawiera klasę wewnętrzną, nazywa się outer class.

Syntax

Poniżej znajduje się składnia do napisania klasy zagnieżdżonej. Tutaj klasaOuter_Demo jest klasą zewnętrzną i klasą Inner_Demo to klasa zagnieżdżona.

class Outer_Demo {
   class Inner_Demo {
   }
}

Zagnieżdżone klasy są podzielone na dwa typy -

  • Non-static nested classes - To są niestatyczni członkowie klasy.

  • Static nested classes - To są statyczni członkowie klasy.

Klasy wewnętrzne (niestatyczne klasy zagnieżdżone)

Klasy wewnętrzne są mechanizmem bezpieczeństwa w Javie. Wiemy, że klasa nie może być powiązana z modyfikatorem dostępuprivate, ale jeśli mamy klasę jako członka innej klasy, wówczas klasa wewnętrzna może zostać ustawiona jako prywatna. Służy również do uzyskiwania dostępu do prywatnych członków klasy.

Klasy wewnętrzne dzielą się na trzy typy, w zależności od tego, jak i gdzie je zdefiniujesz. Oni są -

  • Klasa wewnętrzna
  • Metoda - lokalna klasa wewnętrzna
  • Anonimowa klasa wewnętrzna

Klasa wewnętrzna

Tworzenie klasy wewnętrznej jest dość proste. Wystarczy napisać klasę w ramach klasy. W przeciwieństwie do klasy, klasa wewnętrzna może być prywatna i po zadeklarowaniu klasy wewnętrznej jako prywatnej nie można uzyskać do niej dostępu z obiektu spoza klasy.

Poniżej znajduje się program do tworzenia klasy wewnętrznej i uzyskiwania do niej dostępu. W podanym przykładzie ustawiamy klasę wewnętrzną jako prywatną i uzyskujemy do niej dostęp za pomocą metody.

Example

class Outer_Demo {
   int num;
   
   // inner class
   private class Inner_Demo {
      public void print() {
         System.out.println("This is an inner class");
      }
   }
   
   // Accessing he inner class from the method within
   void display_Inner() {
      Inner_Demo inner = new Inner_Demo();
      inner.print();
   }
}
   
public class My_class {

   public static void main(String args[]) {
      // Instantiating the outer class 
      Outer_Demo outer = new Outer_Demo();
      
      // Accessing the display_Inner() method.
      outer.display_Inner();
   }
}

Tutaj możesz to zaobserwować Outer_Demo jest klasą zewnętrzną, Inner_Demo jest klasą wewnętrzną, display_Inner() jest metodą, wewnątrz której tworzymy instancję klasy wewnętrznej, a ta metoda jest wywoływana z main metoda.

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wynik -

Output

This is an inner class.

Dostęp do członków prywatnych

Jak wspomniano wcześniej, klasy wewnętrzne są również używane do uzyskiwania dostępu do prywatnych członków klasy. Załóżmy, że klasa ma prywatnych członków, którzy mają do nich dostęp. Napisz w nim klasę wewnętrzną, zwróć prywatne elementy członkowskie z metody w klasie wewnętrznej, powiedzmy,getValue(), a na koniec z innej klasy (z której chcesz uzyskać dostęp do prywatnych członków) wywołaj metodę getValue () klasy wewnętrznej.

Aby utworzyć instancję klasy wewnętrznej, najpierw musisz utworzyć instancję klasy zewnętrznej. Następnie, używając obiektu klasy zewnętrznej, następujący jest sposób, w jaki można utworzyć instancję klasy wewnętrznej.

Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();

Poniższy program pokazuje, jak uzyskać dostęp do prywatnych członków klasy przy użyciu klasy wewnętrznej.

Example

class Outer_Demo {
   // private variable of the outer class
   private int num = 175;  
   
   // inner class
   public class Inner_Demo {
      public int getNum() {
         System.out.println("This is the getnum method of the inner class");
         return num;
      }
   }
}

public class My_class2 {

   public static void main(String args[]) {
      // Instantiating the outer class
      Outer_Demo outer = new Outer_Demo();
      
      // Instantiating the inner class
      Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
      System.out.println(inner.getNum());
   }
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wynik -

Output

This is the getnum method of the inner class: 175

Metoda - lokalna klasa wewnętrzna

W Javie możemy napisać klasę w ramach metody i będzie to typ lokalny. Podobnie jak zmienne lokalne, zakres klasy wewnętrznej jest ograniczony w ramach metody.

Wystąpienie lokalnej klasy wewnętrznej metody można utworzyć tylko w ramach metody, w której zdefiniowano klasę wewnętrzną. Poniższy program pokazuje, jak używać lokalnej klasy wewnętrznej metody.

Example

public class Outerclass {
   // instance method of the outer class 
   void my_Method() {
      int num = 23;

      // method-local inner class
      class MethodInner_Demo {
         public void print() {
            System.out.println("This is method inner class "+num);	   
         }   
      } // end of inner class
	   
      // Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }
   
   public static void main(String args[]) {
      Outerclass outer = new Outerclass();
      outer.my_Method();	   	   
   }
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wynik -

Output

This is method inner class 23

Anonimowa klasa wewnętrzna

Klasa wewnętrzna zadeklarowana bez nazwy klasy jest znana jako anonymous inner class. W przypadku anonimowych klas wewnętrznych deklarujemy je i tworzymy w tym samym czasie. Ogólnie rzecz biorąc, są one używane, gdy zachodzi potrzeba zastąpienia metody klasy lub interfejsu. Składnia anonimowej klasy wewnętrznej jest następująca -

Syntax

AnonymousInner an_inner = new AnonymousInner() {
   public void my_method() {
      ........
      ........
   }   
};

Poniższy program pokazuje, jak przesłonić metodę klasy przy użyciu anonimowej klasy wewnętrznej.

Example

abstract class AnonymousInner {
   public abstract void mymethod();
}

public class Outer_class {

   public static void main(String args[]) {
      AnonymousInner inner = new AnonymousInner() {
         public void mymethod() {
            System.out.println("This is an example of anonymous inner class");
         }
      };
      inner.mymethod();	
   }
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wynik -

Output

This is an example of anonymous inner class

W ten sam sposób można przesłonić metody konkretnej klasy, a także interfejs, używając anonimowej klasy wewnętrznej.

Anonimowa klasa wewnętrzna jako argument

Generalnie, jeśli metoda akceptuje obiekt interfejsu, klasę abstrakcyjną lub klasę konkretną, możemy zaimplementować interfejs, rozszerzyć klasę abstrakcyjną i przekazać obiekt do metody. Jeśli jest to klasa, możemy bezpośrednio przekazać ją do metody.

Ale we wszystkich trzech przypadkach można przekazać do metody anonimową klasę wewnętrzną. Oto składnia przekazywania anonimowej klasy wewnętrznej jako argumentu metody -

obj.my_Method(new My_Class() {
   public void Do() {
      .....
      .....
   }
});

Poniższy program pokazuje, jak przekazać anonimową klasę wewnętrzną jako argument metody.

Example

// interface
interface Message {
   String greet();
}

public class My_class {
   // method which accepts the object of interface Message
   public void displayMessage(Message m) {
      System.out.println(m.greet() +
         ", This is an example of anonymous inner class as an argument");  
   }

   public static void main(String args[]) {
      // Instantiating the class
      My_class obj = new My_class();

      // Passing an anonymous inner class as an argument
      obj.displayMessage(new Message() {
         public String greet() {
            return "Hello";
         }
      });
   }
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wynik -

Output

Hello, This is an example of anonymous inner class as an argument

Statyczna klasa zagnieżdżona

Statyczna klasa wewnętrzna jest klasą zagnieżdżoną, która jest statycznym składnikiem klasy zewnętrznej. Można uzyskać do niego dostęp bez tworzenia wystąpienia klasy zewnętrznej, używając innych statycznych elementów członkowskich. Podobnie jak statyczne elementy członkowskie, statyczna klasa zagnieżdżona nie ma dostępu do zmiennych instancji i metod klasy zewnętrznej. Składnia statycznej klasy zagnieżdżonej jest następująca -

Syntax

class MyOuter {
   static class Nested_Demo {
   }
}

Tworzenie wystąpienia statycznej klasy zagnieżdżonej różni się nieco od tworzenia wystąpienia klasy wewnętrznej. Poniższy program pokazuje, jak używać statycznej klasy zagnieżdżonej.

Example

public class Outer {
   static class Nested_Demo {
      public void my_method() {
         System.out.println("This is my nested class");
      }
   }
   
   public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();	 
      nested.my_method();
   }
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujący wynik -

Output

This is my nested class

Dziedziczenie można zdefiniować jako proces, w którym jedna klasa uzyskuje właściwości (metody i pola) innej. Dziedziczenie umożliwia zarządzanie informacjami w porządku hierarchicznym.

Klasa, która dziedziczy właściwości innej, jest znana jako podklasa (klasa pochodna, klasa potomna), a klasa, której właściwości są dziedziczone, jest znana jako nadklasa (klasa bazowa, klasa nadrzędna).

rozszerza słowo kluczowe

extendsjest słowem kluczowym używanym do dziedziczenia właściwości klasy. Poniżej znajduje się składnia słowa kluczowego extends.

Syntax

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

Przykładowy kod

Poniżej znajduje się przykład demonstrujący dziedziczenie języka Java. W tym przykładzie można zaobserwować dwie klasy, mianowicie Obliczenia i Moje_Kalkulacje.

Używając słowa kluczowego extends, My_Calculation dziedziczy metody added () i Subtraction () z klasy Calculation.

Skopiuj i wklej następujący program do pliku o nazwie My_Calculation.java

Example

class Calculation {
   int z;
	
   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }
	
   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }
	
   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}

Skompiluj i wykonaj powyższy kod, jak pokazano poniżej.

javac My_Calculation.java
java My_Calculation

Po wykonaniu programu wygeneruje następujący wynik -

Output

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

W danym programie, gdy obiekt My_Calculationklasa jest tworzona, kopia zawartości nadklasy jest w niej tworzona. Dlatego używając obiektu podklasy można uzyskać dostęp do członków nadklasy.

Zmienna referencyjna nadklasy może zawierać obiekt podklasy, ale za pomocą tej zmiennej można uzyskać dostęp tylko do członków nadklasy, więc aby uzyskać dostęp do elementów obu klas, zaleca się zawsze tworzyć zmienną referencyjną dla podklasy.

Jeśli weźmiesz pod uwagę powyższy program, możesz utworzyć instancję klasy, jak podano poniżej. Ale używając zmiennej referencyjnej nadklasy (cal w tym przypadku) nie można wywołać metody multiplication(), który należy do podklasy My_Calculation.

Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);

Note- Podklasa dziedziczy wszystkie składowe (pola, metody i klasy zagnieżdżone) ze swojej nadklasy. Konstruktory nie są członkami, więc nie są dziedziczone przez podklasy, ale konstruktor nadklasy można wywołać z podklasy.

Super słowo kluczowe

Plik super słowo kluczowe jest podobne do thissłowo kluczowe. Poniżej przedstawiono scenariusze, w których używane jest słowo kluczowe super.

  • Jest do tego przyzwyczajony differentiate the members nadklasy od członków podklasy, jeśli mają takie same nazwy.

  • Jest do tego przyzwyczajony invoke the superclass konstruktor z podklasy.

Zróżnicowanie członków

Jeśli klasa dziedziczy właściwości innej klasy. A jeśli członkowie nadklasy mają takie same nazwy jak podklasa, do rozróżnienia tych zmiennych używamy słowa kluczowego super, jak pokazano poniżej.

super.variable
super.method();

Przykładowy kod

Ta sekcja zawiera program, który demonstruje użycie super słowo kluczowe.

W podanym programie masz dwie klasy, mianowicie Sub_class i Super_class , obie mają metodę o nazwie display () z różnymi implementacjami oraz zmienną o nazwie num z różnymi wartościami. Wywołujemy metodę display () obu klas i wypisujemy wartość zmiennej num obu klas. Tutaj możesz zauważyć, że użyliśmy słowa kluczowego super, aby odróżnić członków nadklasy od podklasy.

Skopiuj i wklej program do pliku o nazwie Sub_class.java.

Example

class Super_class {
   int num = 20;

   // display method of superclass
   public void display() {
      System.out.println("This is the display method of superclass");
   }
}

public class Sub_class extends Super_class {
   int num = 10;

   // display method of sub class
   public void display() {
      System.out.println("This is the display method of subclass");
   }

   public void my_method() {
      // Instantiating subclass
      Sub_class sub = new Sub_class();

      // Invoking the display() method of sub class
      sub.display();

      // Invoking the display() method of superclass
      super.display();

      // printing the value of variable num of subclass
      System.out.println("value of the variable named num in sub class:"+ sub.num);

      // printing the value of variable num of superclass
      System.out.println("value of the variable named num in super class:"+ super.num);
   }

   public static void main(String args[]) {
      Sub_class obj = new Sub_class();
      obj.my_method();
   }
}

Skompiluj i wykonaj powyższy kod, używając następującej składni.

javac Super_Demo
java Super

Po uruchomieniu programu otrzymasz następujący wynik -

Output

This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

Wywołanie konstruktora superklasy

Jeśli klasa dziedziczy właściwości innej klasy, podklasa automatycznie uzyskuje domyślny konstruktor nadklasy. Ale jeśli chcesz wywołać sparametryzowany konstruktor nadklasy, musisz użyć słowa kluczowego super, jak pokazano poniżej.

super(values);

Przykładowy kod

Program podany w tej sekcji demonstruje, jak używać słowa kluczowego super do wywołania sparametryzowanego konstruktora superklasy. Ten program zawiera nadklasę i podklasę, gdzie nadklasa zawiera sparametryzowany konstruktor, który akceptuje wartość całkowitą, a my użyliśmy słowa kluczowego super, aby wywołać sparametryzowany konstruktor nadklasy.

Skopiuj i wklej następujący program do pliku o nazwie Subclass.java

Example

class Superclass {
   int age;

   Superclass(int age) {
      this.age = age; 		 
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String args[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

Skompiluj i wykonaj powyższy kod, używając następującej składni.

javac Subclass
java Subclass

Po uruchomieniu programu otrzymasz następujący wynik -

Output

The value of the variable named age in super class is: 24

Związek IS-A

IS-A to sposób na powiedzenie: ten obiekt jest typem tego obiektu. Zobaczmy, jakextends słowo kluczowe służy do dziedziczenia.

public class Animal {
}

public class Mammal extends Animal {
}

public class Reptile extends Animal {
}

public class Dog extends Mammal {
}

Teraz, na podstawie powyższego przykładu, w kategoriach zorientowanych obiektowo, następujące są prawdziwe:

  • Zwierzę jest nadklasą klasy ssaków.
  • Zwierzę jest nadklasą klasy Reptile.
  • Ssaki i Gady są podklasami klasy Animal.
  • Pies jest podklasą klas ssaków i zwierząt.

Jeśli weźmiemy pod uwagę relację IS-A, możemy powiedzieć -

  • Ssak IS-A Zwierzę
  • Gad to zwierzę
  • Pies IS-A Mammal
  • Stąd: Pies JEST również Zwierzęciem

Używając słowa kluczowego extends, podklasy będą mogły dziedziczyć wszystkie właściwości nadklasy poza prywatnymi właściwościami nadklasy.

Dzięki operatorowi instancji możemy zapewnić, że Mammal to tak naprawdę Animal.

Example

class Animal {
}

class Mammal extends Animal {
}

class Reptile extends Animal {
}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

To da następujący wynik -

Output

true
true
true

Ponieważ dobrze rozumiemy extends słowo kluczowe, przyjrzyjmy się, jak implements słowo kluczowe jest używane do uzyskania relacji IS-A.

Ogólnie rzecz biorąc, plik implementssłowo kluczowe jest używane z klasami do dziedziczenia właściwości interfejsu. Interfejsy nigdy nie mogą być rozszerzone przez klasę.

Example

public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Instancja słowa kluczowego

Użyjmy instanceof operator, aby sprawdzić, czy Mammal jest rzeczywiście Zwierzęciem, a pies jest w rzeczywistości Zwierzęciem.

Example

interface Animal{}
class Mammal implements Animal{}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

To da następujący wynik -

Output

true
true
true

MA relację

Te relacje opierają się głównie na wykorzystaniu. To określa, czy dana klasaHAS-APewna rzecz. Ta relacja pomaga ograniczyć powielanie kodu, a także błędy.

Spójrzmy na przykład -

Example

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
}

To pokazuje, że klasa Van HAS-A Speed. Posiadając oddzielną klasę dla Speed, nie musimy umieszczać całego kodu należącego do speed wewnątrz klasy Van, co umożliwia ponowne użycie klasy Speed ​​w wielu aplikacjach.

W funkcji Object-Oriented użytkownicy nie muszą martwić się o to, który obiekt wykonuje rzeczywistą pracę. Aby to osiągnąć, klasa Van ukrywa szczegóły implementacji przed użytkownikami klasy Van. Tak więc zasadniczo użytkownicy proszą klasę Van o wykonanie określonej czynności, a klasa Van albo wykona to zadanie samodzielnie, albo poprosi inną klasę o wykonanie tej czynności.

Rodzaje dziedziczenia

Istnieją różne rodzaje dziedziczenia, jak pokazano poniżej.

Bardzo ważnym faktem do zapamiętania jest to, że Java nie obsługuje dziedziczenia wielokrotnego. Oznacza to, że klasa nie może rozszerzać więcej niż jedną klasę. Dlatego następujące jest nielegalne -

Example

public class extends Animal, Mammal{}

Jednak klasa może implementować jeden lub więcej interfejsów, co pomogło Javie pozbyć się niemożności wielokrotnego dziedziczenia.

W poprzednim rozdziale rozmawialiśmy o nadklasach i podklasach. Jeśli klasa dziedziczy metodę ze swojej nadklasy, istnieje szansa na przesłonięcie metody, pod warunkiem, że nie jest ona oznaczona jako ostateczna.

Zaletą przesłonięcia jest: możliwość zdefiniowania zachowania, które jest specyficzne dla typu podklasy, co oznacza, że ​​podklasa może implementować metodę klasy nadrzędnej na podstawie jej wymagań.

W kategoriach obiektowych przesłanianie oznacza przesłonięcie funkcjonalności istniejącej metody.

Przykład

Spójrzmy na przykład.

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}

To da następujący wynik -

Wynik

Animals can move
Dogs can walk and run

Mimo to w powyższym przykładzie widać to bjest typem Animal, uruchamia metodę move w klasie Dog. Powód jest następujący: w czasie kompilacji sprawdzany jest typ odniesienia. Jednak w środowisku wykonawczym maszyna JVM określa typ obiektu i uruchamia metodę należącą do tego konkretnego obiektu.

Dlatego w powyższym przykładzie program skompiluje się poprawnie, ponieważ klasa Animal ma metodę move. Następnie, w czasie wykonywania, uruchamia metodę specyficzną dla tego obiektu.

Rozważmy następujący przykład -

Przykład

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

To da następujący wynik -

Wynik

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

Ten program zgłosi błąd czasu kompilacji, ponieważ typ odniesienia b, Animal, nie ma metody o nazwie bark.

Reguły nadpisywania metod

  • Lista argumentów powinna być dokładnie taka sama, jak w przypadku przesłoniętej metody.

  • Zwracany typ powinien być taki sam lub powinien być podtypem typu zwracanego zadeklarowanego w pierwotnej nadpisanej metodzie w nadklasie.

  • Poziom dostępu nie może być bardziej restrykcyjny niż poziom dostępu metody zastępowanej. Na przykład: Jeśli metoda nadklasy jest zadeklarowana jako publiczna, metoda nadpisywania w podklasie nie może być ani prywatna, ani chroniona.

  • Metody instancji można przesłonić tylko wtedy, gdy są dziedziczone przez podklasę.

  • Metoda zadeklarowana jako ostateczna nie może zostać zastąpiona.

  • Metody zadeklarowanej jako statyczna nie można zastąpić, ale można ją ponownie zadeklarować.

  • Jeśli metody nie można dziedziczyć, nie można jej zastąpić.

  • Podklasa w tym samym pakiecie co nadklasa instancji może przesłonić każdą metodę nadklasy, która nie jest zadeklarowana jako prywatna lub ostateczna.

  • Podklasa w innym pakiecie może tylko przesłonić nie ostateczne metody zadeklarowane jako publiczne lub chronione.

  • Metoda przesłaniająca może zgłosić wszystkie wyjątki od zaznaczenia, niezależnie od tego, czy zastąpiona metoda zgłasza wyjątki, czy nie. Jednak metoda przesłaniająca nie powinna zgłaszać sprawdzonych wyjątków, które są nowe lub szersze niż te zadeklarowane przez zastąpioną metodę. Metoda przesłaniająca może zgłosić węższe lub mniej wyjątków niż metoda zastąpiona.

  • Konstruktorów nie można zastąpić.

Korzystanie z super słowa kluczowego

Podczas wywoływania wersji nadrzędnej metody zastępowanej metody super używane jest słowo kluczowe.

Przykład

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

To da następujący wynik -

Wynik

Animals can move
Dogs can walk and run

Polimorfizm to zdolność obiektu do przybierania wielu form. Najbardziej powszechne użycie polimorfizmu w OOP występuje, gdy odwołanie do klasy nadrzędnej jest używane w odniesieniu do obiektu klasy potomnej.

Każdy obiekt Java, który może przejść więcej niż jeden test IS-A, jest uważany za polimorficzny. W Javie wszystkie obiekty Java są polimorficzne, ponieważ każdy obiekt przejdzie test IS-A dla własnego typu i dla klasy Object.

Ważne jest, aby wiedzieć, że jedynym możliwym sposobem uzyskania dostępu do obiektu jest użycie zmiennej referencyjnej. Zmienna odwołania może być tylko jednego typu. Po zadeklarowaniu nie można zmienić typu zmiennej referencyjnej.

Zmienną referencyjną można ponownie przypisać do innych obiektów, pod warunkiem że nie zostanie zadeklarowana jako ostateczna. Typ zmiennej referencyjnej określałby metody, które może ona wywołać na obiekcie.

Zmienna referencyjna może odnosić się do dowolnego obiektu zadeklarowanego typu lub dowolnego podtypu zadeklarowanego typu. Zmienną referencyjną można zadeklarować jako klasę lub typ interfejsu.

Przykład

Spójrzmy na przykład.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

Teraz klasa Deer jest uważana za polimorficzną, ponieważ ma wielokrotne dziedziczenie. Poniższe są prawdziwe dla powyższych przykładów -

  • Jeleń jest zwierzęciem
  • Jeleń JEST - Wegetarianinem
  • Jeleń to jeleń
  • Jeleń to obiekt

Kiedy stosujemy faktyczne zmienne odniesienia do odniesienia do obiektu Deer, następujące deklaracje są legalne -

Przykład

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

Wszystkie zmienne odniesienia d, a, v, o odnoszą się do tego samego obiektu Deer w stercie.

Metody wirtualne

W tej sekcji pokażę, w jaki sposób zachowanie nadpisanych metod w Javie pozwala na wykorzystanie polimorfizmu podczas projektowania klas.

Omówiliśmy już przesłanianie metody, w której klasa potomna może przesłonić metodę w jej rodzicu. Przesłonięta metoda jest zasadniczo ukryta w klasie nadrzędnej i nie jest wywoływana, chyba że klasa potomna używa słowa kluczowego super w ramach metody przesłaniającej.

Przykład

/* File name : Employee.java */
public class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }

   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}

Załóżmy teraz, że rozszerzamy klasę pracownika w następujący sposób -

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary; // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName()
      + " with salary " + salary);
   }
   
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

Teraz dokładnie przestudiuj poniższy program i spróbuj określić jego wynik -

/* File name : VirtualDemo.java */
public class VirtualDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");   
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

To da następujący wynik -

Wynik

Constructing an Employee
Constructing an Employee

Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

Tutaj tworzymy wystąpienie dwóch obiektów Salary. Jeden z odniesieniem do wynagrodzeniasa drugi przy użyciu odwołania pracownika e.

Podczas wywoływania s.mailCheck () kompilator widzi mailCheck () w klasie Salary w czasie kompilacji, a maszyna JVM wywołuje mailCheck () w klasie Salary w czasie wykonywania.

mailCheck () włączony e jest zupełnie inna, ponieważ eto odniesienie do pracownika. Kiedy kompilator widzi e.mailCheck () , kompilator widzi metodę mailCheck () w klasie Employee.

Tutaj, w czasie kompilacji, kompilator użył mailCheck () w Employee do sprawdzenia poprawności tej instrukcji. Jednak w czasie wykonywania maszyna JVM wywołuje funkcję mailCheck () w klasie Salary.

To zachowanie jest określane jako wywołanie metody wirtualnej, a metody te są określane jako metody wirtualne. Zastąpiona metoda jest wywoływana w czasie wykonywania, bez względu na typ danych, do których odwołuje się odwołanie, który został użyty w kodzie źródłowym w czasie kompilacji.

Zgodnie ze słownikiem, abstractionto jakość radzenia sobie z pomysłami, a nie wydarzeniami. Na przykład, jeśli weźmiesz pod uwagę przypadek poczty e-mail, złożone szczegóły, takie jak to, co dzieje się zaraz po wysłaniu wiadomości e-mail, protokół używany przez serwer poczty e-mail jest ukryty przed użytkownikiem. Dlatego, aby wysłać wiadomość e-mail wystarczy wpisać treść, podać adres odbiorcy i kliknąć wyślij.

Podobnie w programowaniu zorientowanym obiektowo, abstrakcja jest procesem ukrywania szczegółów implementacji przed użytkownikiem, a użytkownikowi zostanie udostępniona tylko funkcjonalność. Innymi słowy, użytkownik będzie miał informacje o tym, co robi obiekt, zamiast o tym, jak to robi.

W Javie abstrakcję uzyskuje się za pomocą klas abstrakcyjnych i interfejsów.

Klasa abstrakcyjna

Klasa, która zawiera abstract słowo kluczowe w swojej deklaracji jest znane jako klasa abstrakcyjna.

  • Klasy abstrakcyjne mogą, ale nie muszą, zawierać metody abstrakcyjne , tj. Metody bez treści (public void get ();)

  • Ale jeśli klasa ma co najmniej jedną metodę abstrakcyjną, to klasa must być uznane za abstrakcyjne.

  • Jeśli klasa jest zadeklarowana jako abstrakcyjna, nie można jej utworzyć.

  • Aby użyć klasy abstrakcyjnej, musisz odziedziczyć ją z innej klasy, zapewnić implementacje jej metod abstrakcyjnych.

  • Jeśli dziedziczysz klasę abstrakcyjną, musisz zapewnić implementacje dla wszystkich metod abstrakcyjnych w niej zawartych.

Przykład

W tej sekcji przedstawiono przykład klasy abstrakcyjnej. Aby utworzyć klasę abstrakcyjną, po prostu użyjabstract słowo kluczowe przed słowem kluczowym class, w deklaracji klasy.

/* File name : Employee.java */
public abstract class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   
   public double computePay() {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }
 
   public String getAddress() {
      return address;
   }
   
   public void setAddress(String newAddress) {
      address = newAddress;
   }
 
   public int getNumber() {
      return number;
   }
}

Można zauważyć, że poza metodami abstrakcyjnymi klasa Employee jest taka sama, jak zwykła klasa w Javie. Klasa jest teraz abstrakcyjna, ale nadal ma trzy pola, siedem metod i jeden konstruktor.

Teraz możesz spróbować utworzyć instancję klasy Employee w następujący sposób -

/* File name : AbstractDemo.java */
public class AbstractDemo {

   public static void main(String [] args) {
      /* Following is not allowed and would raise error */
      Employee e = new Employee("George W.", "Houston, TX", 43);
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Kiedy kompilujesz powyższą klasę, daje to następujący błąd -

Employee.java:46: Employee is abstract; cannot be instantiated
      Employee e = new Employee("George W.", "Houston, TX", 43);
                   ^
1 error

Dziedziczenie klasy abstrakcyjnej

Możemy dziedziczyć właściwości klasy Employee tak jak klasę konkretną w następujący sposób -

Przykład

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary;   // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName() + " with salary " + salary);
   }
 
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

W tym miejscu nie można utworzyć wystąpienia klasy Employee, ale można utworzyć wystąpienie klasy Salary, a za pomocą tej instancji można uzyskać dostęp do wszystkich trzech pól i siedmiu metod klasy Employee, jak pokazano poniżej.

/* File name : AbstractDemo.java */
public class AbstractDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Daje to następujący wynik -

Wynik

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class 
Mailing check to Mohd Mohtashim with salary 3600.0

 Call mailCheck using Employee reference--
Within mailCheck of Salary class 
Mailing check to John Adams with salary 2400.0

Metody abstrakcyjne

Jeśli chcesz, aby klasa zawierała określoną metodę, ale chcesz, aby rzeczywista implementacja tej metody była określana przez klasy potomne, możesz zadeklarować metodę w klasie nadrzędnej jako abstrakcję.

  • abstract słowo kluczowe służy do zadeklarowania metody jako abstrakcyjnej.

  • Musisz umieścić plik abstract słowo kluczowe przed nazwą metody w deklaracji metody.

  • Metoda abstrakcyjna zawiera sygnaturę metody, ale nie zawiera treści metody.

  • Zamiast nawiasów klamrowych metoda abstrakcyjna będzie miała na końcu dwukropek (;).

Poniżej znajduje się przykład metody abstrakcyjnej.

Przykład

public abstract class Employee {
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   // Remainder of class definition
}

Zadeklarowanie metody jako abstrakcyjnej ma dwie konsekwencje -

  • Klasa zawierająca go musi być zadeklarowana jako abstrakcyjna.

  • Każda klasa dziedzicząca bieżącą klasę musi przesłonić metodę abstrakcyjną lub zadeklarować się jako abstrakcyjna.

Note- Ostatecznie klasa potomna musi implementować metodę abstrakcyjną; w przeciwnym razie powstałaby hierarchia klas abstrakcyjnych, których nie można utworzyć.

Załóżmy, że klasa Salary dziedziczy klasę Employee, a następnie powinna implementować computePay() metoda, jak pokazano poniżej -

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary;   // Annual salary
  
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
   // Remainder of class definition
}

Encapsulationjest jedną z czterech podstawowych koncepcji OOP. Pozostałe trzy to dziedziczenie, polimorfizm i abstrakcja.

Enkapsulacja w Javie to mechanizm opakowywania danych (zmiennych) i kodu działającego na dane (metody) razem jako pojedyncza jednostka. Podczas hermetyzacji zmienne klasy będą ukryte przed innymi klasami i będą dostępne tylko za pośrednictwem metod ich bieżącej klasy. Dlatego jest również znany jakodata hiding.

Aby osiągnąć hermetyzację w Javie -

  • Zadeklaruj zmienne klasy jako prywatne.

  • Zapewnij publiczne metody ustawiające i pobierające do modyfikowania i przeglądania wartości zmiennych.

Przykład

Poniżej znajduje się przykład pokazujący, jak osiągnąć enkapsulację w Javie -

/* File name : EncapTest.java */
public class EncapTest {
   private String name;
   private String idNum;
   private int age;

   public int getAge() {
      return age;
   }

   public String getName() {
      return name;
   }

   public String getIdNum() {
      return idNum;
   }

   public void setAge( int newAge) {
      age = newAge;
   }

   public void setName(String newName) {
      name = newName;
   }

   public void setIdNum( String newId) {
      idNum = newId;
   }
}

Metody public setXXX () i getXXX () są punktami dostępu do zmiennych instancji klasy EncapTest. Zwykle metody te są określane jako pobierające i ustawiające. Dlatego każda klasa, która chce uzyskać dostęp do zmiennych, powinna uzyskać do nich dostęp za pośrednictwem tych metod pobierających i ustawiających.

Dostęp do zmiennych klasy EncapTest można uzyskać za pomocą następującego programu -

/* File name : RunEncap.java */
public class RunEncap {

   public static void main(String args[]) {
      EncapTest encap = new EncapTest();
      encap.setName("James");
      encap.setAge(20);
      encap.setIdNum("12343ms");

      System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge());
   }
}

To da następujący wynik -

Wynik

Name : James Age : 20

Korzyści z kapsułkowania

  • Pola klasy mogą być tylko do odczytu lub tylko do zapisu.

  • Klasa może mieć całkowitą kontrolę nad tym, co jest przechowywane w jej polach.

Interfejs jest typem referencyjnym w Javie. Jest podobny do klasy. Jest to zbiór abstrakcyjnych metod. Klasa implementuje interfejs, dziedzicząc w ten sposób abstrakcyjne metody interfejsu.

Oprócz metod abstrakcyjnych interfejs może również zawierać stałe, metody domyślne, metody statyczne i typy zagnieżdżone. Treści metod istnieją tylko dla metod domyślnych i metod statycznych.

Pisanie interfejsu jest podobne do pisania klasy. Ale klasa opisuje atrybuty i zachowania obiektu. Interfejs zawiera zachowania, które implementuje klasa.

O ile klasa implementująca interfejs nie jest abstrakcyjna, wszystkie metody interfejsu muszą być zdefiniowane w klasie.

Interfejs jest podobny do klasy w następujący sposób -

  • Interfejs może zawierać dowolną liczbę metod.

  • Interfejs jest zapisany w pliku z rozszerzeniem .java rozszerzenie, z nazwą interfejsu zgodną z nazwą pliku.

  • Kod bajtowy interfejsu pojawia się w pliku .class plik.

  • Interfejsy pojawiają się w pakietach, a odpowiadający im plik kodu bajtowego musi znajdować się w strukturze katalogów zgodnej z nazwą pakietu.

Jednak interfejs różni się od klasy na kilka sposobów, w tym -

  • Nie można utworzyć wystąpienia interfejsu.

  • Interfejs nie zawiera żadnych konstruktorów.

  • Wszystkie metody w interfejsie są abstrakcyjne.

  • Interfejs nie może zawierać pól instancji. Jedyne pola, które mogą pojawić się w interfejsie, muszą być zadeklarowane jako statyczne i końcowe.

  • Interfejs nie jest rozszerzany przez klasę; jest implementowana przez klasę.

  • Interfejs może rozszerzyć wiele interfejsów.

Deklarowanie interfejsów

Plik interfacesłowo kluczowe służy do deklarowania interfejsu. Oto prosty przykład deklarowania interfejsu -

Przykład

Poniżej znajduje się przykład interfejsu -

/* File name : NameOfInterface.java */
import java.lang.*;
// Any number of import statements

public interface NameOfInterface {
   // Any number of final, static fields
   // Any number of abstract method declarations\
}

Interfejsy mają następujące właściwości -

  • Interfejs jest niejawnie abstrakcyjny. Nie musisz używać rozszerzeniaabstract słowo kluczowe podczas deklarowania interfejsu.

  • Każda metoda w interfejsie jest również niejawnie abstrakcyjna, więc słowo kluczowe abstract nie jest potrzebne.

  • Metody w interfejsie są niejawnie publiczne.

Przykład

/* File name : Animal.java */
interface Animal {
   public void eat();
   public void travel();
}

Implementowanie interfejsów

Kiedy klasa implementuje interfejs, możesz myśleć o klasie jako o podpisaniu kontraktu, wyrażeniu zgody na wykonanie określonych zachowań interfejsu. Jeśli klasa nie wykonuje wszystkich zachowań interfejsu, musi zadeklarować się jako abstrakcyjna.

Klasa używa implementssłowo kluczowe, aby zaimplementować interfejs. Słowo kluczowe implements pojawia się w deklaracji klasy po części extends w deklaracji.

Przykład

/* File name : MammalInt.java */
public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

To da następujący wynik -

Wynik

Mammal eats
Mammal travels

Podczas zastępowania metod zdefiniowanych w interfejsach należy przestrzegać kilku zasad -

  • Zaznaczone wyjątki nie powinny być deklarowane na metodach implementacji innych niż te zadeklarowane przez metodę interfejsu lub podklasy tych zadeklarowanych przez metodę interface.

  • Podczas zastępowania metod należy zachować podpis metody interfejsu i ten sam zwracany typ lub podtyp.

  • Sama klasa implementacji może być abstrakcyjna, a jeśli tak, to metody interfejsu nie muszą być implementowane.

W przypadku interfejsów implementacji istnieje kilka zasad -

  • Klasa może jednocześnie implementować więcej niż jeden interfejs.

  • Klasa może rozszerzać tylko jedną klasę, ale implementować wiele interfejsów.

  • Interfejs może rozszerzać inny interfejs, podobnie jak klasa może rozszerzać inną klasę.

Rozszerzanie interfejsów

Interfejs może rozszerzyć inny interfejs w taki sam sposób, w jaki klasa może rozszerzyć inną klasę. Plikextends słowo kluczowe jest używane do rozszerzania interfejsu, a interfejs potomny dziedziczy metody interfejsu nadrzędnego.

Poniższy interfejs sportowy jest rozszerzony o interfejsy hokejowe i piłkarskie.

Przykład

// Filename: Sports.java
public interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// Filename: Football.java
public interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// Filename: Hockey.java
public interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

Interfejs Hockey ma cztery metody, ale dwie dziedziczy po Sports; w związku z tym klasa implementująca Hockey musi implementować wszystkie sześć metod. Podobnie klasa, która implementuje Football, musi zdefiniować trzy metody z Football i dwie metody z Sports.

Rozszerzanie wielu interfejsów

Klasa Java może rozszerzać tylko jedną klasę nadrzędną. Dziedziczenie wielokrotne jest niedozwolone. Jednak interfejsy nie są klasami, a interfejs może rozszerzać więcej niż jeden interfejs nadrzędny.

Słowo kluczowe extends jest używane raz, a interfejsy nadrzędne są zadeklarowane w postaci listy oddzielonej przecinkami.

Na przykład, jeśli interfejs hokejowy obejmowałby zarówno sporty, jak i wydarzenia, zostałby zadeklarowany jako -

Przykład

public interface Hockey extends Sports, Event

Oznaczanie interfejsów

Najczęściej używane interfejsy rozszerzające występują, gdy interfejs nadrzędny nie zawiera żadnych metod. Na przykład interfejs MouseListener w pakiecie java.awt.event rozszerzony java.util.EventListener, który jest zdefiniowany jako -

Przykład

package java.util;
public interface EventListener
{}

Interfejs bez żadnych metod jest nazywany plikiem taggingberło. Istnieją dwa podstawowe cele projektowe oznaczania interfejsów -

Creates a common parent- Podobnie jak w przypadku interfejsu EventListener, który jest rozszerzony o dziesiątki innych interfejsów w Java API, możesz użyć interfejsu tagowania, aby utworzyć wspólny element nadrzędny wśród grupy interfejsów. Na przykład, gdy interfejs rozszerza EventListener, maszyna JVM wie, że ten konkretny interfejs będzie używany w scenariuszu delegowania zdarzeń.

Adds a data type to a class- To jest sytuacja, skąd pochodzi termin, tagowanie. Klasa, która implementuje interfejs znakowania nie musi definiować żadnych metod (ponieważ interfejs nie ma żadnych), ale klasa staje się typem interfejsu poprzez polimorfizm.

Pakiety są używane w Javie w celu zapobiegania konfliktom nazw, kontroli dostępu, ułatwienia wyszukiwania / lokalizowania i używania klas, interfejsów, wyliczeń i adnotacji itp.

ZA Package można zdefiniować jako grupę powiązanych typów (klas, interfejsów, wyliczeń i adnotacji) zapewniających ochronę dostępu i zarządzanie przestrzenią nazw.

Niektóre z istniejących pakietów w Javie to -

  • java.lang - zawiera podstawowe klasy

  • java.io - klasy dla wejścia, funkcje wyjściowe są zawarte w tym pakiecie

Programiści mogą definiować własne pakiety w celu spakowania grup klas / interfejsów itp. Dobrą praktyką jest grupowanie zaimplementowanych przez Ciebie powiązanych klas, tak aby programiści mogli łatwo określić, czy klasy, interfejsy, wyliczenia i adnotacje są powiązane.

Ponieważ pakiet tworzy nową przestrzeń nazw, nie będzie żadnych konfliktów nazw z nazwami w innych pakietach. Korzystając z pakietów, łatwiej jest zapewnić kontrolę dostępu, a także łatwiej jest zlokalizować powiązane klasy.

Tworzenie pakietu

Tworząc pakiet, należy wybrać nazwę pakietu i dołączyć plik package instrukcja wraz z tą nazwą u góry każdego pliku źródłowego, który zawiera klasy, interfejsy, wyliczenia i typy adnotacji, które chcesz dołączyć do pakietu.

Instrukcja pakietu powinna być pierwszym wierszem w pliku źródłowym. W każdym pliku źródłowym może znajdować się tylko jedna instrukcja pakietu i ma ona zastosowanie do wszystkich typów w pliku.

Jeśli instrukcja pakietu nie jest używana, klasa, interfejsy, wyliczenia i typy adnotacji zostaną umieszczone w bieżącym pakiecie domyślnym.

Aby skompilować programy Java z instrukcjami pakietu, musisz użyć opcji -d, jak pokazano poniżej.

javac -d Destination_folder file_name.java

Następnie w określonym miejscu docelowym tworzony jest folder o podanej nazwie pakietu, a skompilowane pliki klas zostaną umieszczone w tym folderze.

Przykład

Spójrzmy na przykład, który tworzy pakiet o nazwie animals. Dobrą praktyką jest używanie nazw pakietów z małymi literami, aby uniknąć konfliktów z nazwami klas i interfejsów.

Poniższy przykład pakietu zawiera interfejs o nazwie animals -

/* File name : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

Teraz zaimplementujmy powyższy interfejs w tym samym pakiecie animals -

package animals;
/* File name : MammalInt.java */

public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

Teraz skompiluj pliki java, jak pokazano poniżej -

$ javac -d . Animal.java $ javac -d . MammalInt.java

Teraz pakiet / folder z nazwą animals zostaną utworzone w bieżącym katalogu i te pliki klas zostaną w nim umieszczone, jak pokazano poniżej.

Możesz uruchomić plik klasy w pakiecie i uzyskać wynik, jak pokazano poniżej.

Mammal eats
Mammal travels

Import Keyword

Jeśli klasa chce użyć innej klasy w tym samym pakiecie, nie trzeba używać nazwy pakietu. Klasy w tym samym pakiecie znajdują się nawzajem bez żadnej specjalnej składni.

Przykład

W tym przypadku klasa o nazwie Boss jest dodawana do pakietu listy płac, który zawiera już pracownika. Szef może wtedy odwołać się do klasy Pracownik bez używania przedrostka listy płac, jak pokazano na poniższej klasie Szef.

package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}

Co się stanie, jeśli klasa pracownika nie znajduje się w liście płac? Klasa Boss musi następnie używać jednej z poniższych technik do odwoływania się do klasy w innym pakiecie.

  • Można użyć w pełni kwalifikowanej nazwy klasy. Na przykład -
payroll.Employee
  • Pakiet można zaimportować za pomocą słowa kluczowego import i symbolu wieloznacznego (*). Na przykład -

import payroll.*;
  • Samą klasę można zaimportować za pomocą słowa kluczowego import. Na przykład -
import payroll.Employee;

Note- Plik klasy może zawierać dowolną liczbę instrukcji importu. Instrukcje importu muszą pojawić się po instrukcji pakietu i przed deklaracją klasy.

Struktura katalogów pakietów

Dwa główne wyniki pojawiają się, gdy zajęcia są umieszczane w pakiecie -

  • Nazwa pakietu staje się częścią nazwy klasy, co omówiliśmy w poprzedniej sekcji.

  • Nazwa pakietu musi być zgodna ze strukturą katalogów, w której znajduje się odpowiedni kod bajtowy.

Oto prosty sposób zarządzania plikami w Javie -

Umieść kod źródłowy klasy, interfejsu, wyliczenia lub typu adnotacji w pliku tekstowym, którego nazwa jest prostą nazwą typu i którego rozszerzenie to .java.

Na przykład -

// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

Teraz umieść plik źródłowy w katalogu, którego nazwa odzwierciedla nazwę pakietu, do którego należy klasa -

....\vehicle\Car.java

Teraz kwalifikowana nazwa klasy i nazwa ścieżki wyglądałyby następująco -

  • Nazwa klasy → pojazd. Samochód
  • Nazwa ścieżki → pojazd \ Car.java (w systemie Windows)

Ogólnie firma używa odwróconej nazwy domeny internetowej do nazw swoich pakietów.

Example- Nazwa domeny internetowej firmy to apple.com, wszystkie nazwy jej pakietów zaczynałyby się od com.apple. Każdy składnik nazwy pakietu odpowiada podkatalogowi.

Example - Firma miała pakiet komputerów com.apple.com, który zawierał plik źródłowy Dell.java, byłby on zawarty w szeregu podkatalogów takich jak ten -

....\com\apple\computers\Dell.java

W momencie kompilacji kompilator tworzy inny plik wyjściowy dla każdej zdefiniowanej w nim klasy, interfejsu i wyliczenia. Podstawową nazwą pliku wyjściowego jest nazwa typu, a jego rozszerzenie to.class.

Na przykład -

// File Name: Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}

Teraz skompiluj ten plik w następujący sposób, używając opcji -d -

$javac -d . Dell.java

Pliki zostaną skompilowane w następujący sposób -

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

Możesz zaimportować wszystkie klasy lub interfejsy zdefiniowane w \ com \ apple \ computers \ w następujący sposób -

import com.apple.computers.*;

Podobnie jak pliki źródłowe .java, skompilowane pliki .class powinny znajdować się w szeregu katalogów odpowiadających nazwie pakietu. Jednak ścieżka do plików .class nie musi być taka sama, jak ścieżka do plików źródłowych .java. Możesz osobno uporządkować katalogi źródłowe i klasowe, ponieważ -

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

W ten sposób można udostępnić katalog klas innym programistom bez ujawniania źródeł. Musisz także zarządzać plikami źródłowymi i klasami w ten sposób, aby kompilator i wirtualna maszyna języka Java (JVM) mogły znaleźć wszystkie typy używane przez program.

Pełna ścieżka do katalogu klas, <ścieżka-two> \ classes, nazywana jest ścieżką klasy i jest ustawiana za pomocą zmiennej systemowej CLASSPATH. Zarówno kompilator, jak i maszyna JVM tworzą ścieżkę do plików .class, dodając nazwę pakietu do ścieżki klasy.

Powiedzmy, że <ścieżka-two> \ classes to ścieżka klasy, a nazwa pakietu to com.apple.computers, a kompilator i maszyna JVM będą szukać plików .class w lokalizacji <path-two> \ classes \ com \ apple \ computers.

Ścieżka klasy może zawierać kilka ścieżek. Wiele ścieżek należy oddzielić średnikiem (Windows) lub dwukropkiem (Unix). Domyślnie kompilator i maszyna JVM przeszukują bieżący katalog i plik JAR zawierający klasy platformy Java, tak aby katalogi te automatycznie znalazły się w ścieżce klas.

Ustaw zmienną systemową CLASSPATH

Aby wyświetlić bieżącą zmienną CLASSPATH, użyj następujących poleceń w systemach Windows i UNIX (powłoka Bourne'a) -

  • W Windows → C: \> ustaw CLASSPATH
  • W systemie UNIX →% echo $ CLASSPATH

Aby usunąć bieżącą zawartość zmiennej CLASSPATH, użyj -

  • W systemie Windows → C: \> ustaw CLASSPATH =
  • W UNIX →% unset CLASSPATH; eksportuj CLASSPATH

Aby ustawić zmienną CLASSPATH -

  • W systemie Windows → ustaw CLASSPATH = C: \ users \ jack \ java \ classes
  • W systemie UNIX →% CLASSPATH = / home / jack / java / classes; eksportuj CLASSPATH

Struktury danych dostarczane przez pakiet narzędziowy Java są bardzo wydajne i pełnią wiele funkcji. Te struktury danych składają się z następującego interfejsu i klas -

  • Enumeration
  • BitSet
  • Vector
  • Stack
  • Dictionary
  • Hashtable
  • Properties

Wszystkie te klasy są już starsze, a Java-2 wprowadziła nowy framework zwany Collection Framework, który zostanie omówiony w następnym rozdziale. -

Wyliczenie

Sam interfejs Enumeration nie jest strukturą danych, ale jest bardzo ważny w kontekście innych struktur danych. Interfejs Enumeration definiuje sposób pobierania kolejnych elementów ze struktury danych.

Na przykład Enumeration definiuje metodę o nazwie nextElement, która jest używana do pobierania następnego elementu w strukturze danych zawierającej wiele elementów.

Aby uzyskać więcej informacji na temat tego interfejsu, sprawdź wyliczenie .

BitSet

Klasa BitSet implementuje grupę bitów lub flag, które można ustawić i wyczyścić indywidualnie.

Ta klasa jest bardzo przydatna w przypadkach, gdy musisz nadążać za zestawem wartości logicznych; po prostu przypisujesz trochę do każdej wartości i odpowiednio ustawiasz lub usuwasz.

Aby uzyskać więcej informacji na temat tej klasy, sprawdź The BitSet .

Wektor

Klasa Vector jest podobna do tradycyjnej tablicy Java, z tym wyjątkiem, że w razie potrzeby może się rozwijać, aby pomieścić nowe elementy.

Podobnie jak tablica, do elementów obiektu Vector można uzyskać dostęp za pośrednictwem indeksu wektora.

Zaletą używania klasy Vector jest to, że nie musisz martwić się o ustawienie jej określonego rozmiaru podczas tworzenia; w razie potrzeby kurczy się i rośnie automatycznie.

Aby uzyskać więcej informacji o tej klasie, zobacz The Vector .

Stos

Klasa Stack implementuje stos elementów typu last-in-first-out (LIFO).

Możesz myśleć o stosie dosłownie jako o pionowym stosie obiektów; kiedy dodajesz nowy element, jest on nakładany na inne.

Kiedy wyciągasz element ze stosu, schodzi on z góry. Innymi słowy, ostatni element dodany do stosu jest pierwszym, który zejdzie.

Aby uzyskać więcej informacji na temat tej klasy, sprawdź Stos .

Słownik

Klasa Dictionary jest klasą abstrakcyjną, która definiuje strukturę danych służącą do odwzorowywania kluczy na wartości.

Jest to przydatne w przypadkach, gdy chcesz mieć dostęp do danych za pośrednictwem określonego klucza, a nie indeksu liczb całkowitych.

Ponieważ klasa Dictionary jest abstrakcyjna, zapewnia jedynie strukturę danych odwzorowaną na klucz, a nie określoną implementację.

Aby uzyskać więcej informacji na temat tej klasy, sprawdź słownik .

Hashtable

Klasa Hashtable umożliwia organizowanie danych w oparciu o strukturę kluczy zdefiniowaną przez użytkownika.

Na przykład w tabeli skrótów listy adresów można przechowywać i sortować dane na podstawie klucza, takiego jak kod pocztowy, a nie na podstawie nazwiska osoby.

Specyficzne znaczenie kluczy w odniesieniu do tabel skrótów jest całkowicie zależne od użycia tabeli skrótów i zawartych w niej danych.

Aby uzyskać więcej informacji o tej klasie, sprawdź The Hashtable .

Właściwości

Właściwości to podklasa Hashtable. Służy do utrzymywania list wartości, w których klucz jest ciągiem, a wartość jest również ciągiem.

Klasa Properties jest używana przez wiele innych klas Java. Na przykład jest to typ obiektu zwracany przez System.getProperties () podczas uzyskiwania wartości środowiskowych.

Aby uzyskać więcej informacji na temat tej klasy, sprawdź Właściwości .

Przed wersją Java 2 Java udostępniała klasy ad hoc, takie jak Dictionary, Vector, Stack, i Propertiesdo przechowywania i manipulowania grupami obiektów. Chociaż te zajęcia były całkiem przydatne, brakowało im centralnego, jednoczącego tematu. Tak więc sposób, w jaki użyłeś Vector, był inny niż sposób, w jaki użyłeś Właściwości.

Ramy kolekcji zostały zaprojektowane w celu spełnienia kilku celów, takich jak:

  • Ramy musiały być wydajne. Implementacje podstawowych kolekcji (tablice dynamiczne, listy połączone, drzewa i tabele skrótów) miały być bardzo wydajne.

  • Ramy musiały umożliwiać różnym typom kolekcji działanie w podobny sposób i przy wysokim stopniu interoperacyjności.

  • Framework musiał łatwo rozszerzać i / lub dostosowywać kolekcję.

W tym celu cała struktura kolekcji jest zaprojektowana wokół zestawu standardowych interfejsów. Kilka standardowych implementacji, takich jakLinkedList, HashSet, i TreeSet, z tych interfejsów można używać w takiej postaci, w jakiej są, a także zaimplementować własną kolekcję, jeśli zechcesz.

Struktura kolekcji to ujednolicona architektura do reprezentowania kolekcji i manipulowania nimi. Wszystkie struktury kolekcji zawierają następujące elementy -

  • Interfaces- Są to abstrakcyjne typy danych, które reprezentują kolekcje. Interfejsy pozwalają na manipulowanie kolekcjami niezależnie od szczegółów ich reprezentacji. W językach zorientowanych obiektowo interfejsy generalnie tworzą hierarchię.

  • Implementations, i.e., Classes- To są konkretne implementacje interfejsów kolekcji. Zasadniczo są to struktury danych wielokrotnego użytku.

  • Algorithms- Są to metody, które wykonują przydatne obliczenia, takie jak wyszukiwanie i sortowanie, na obiektach, które implementują interfejsy kolekcji. Mówi się, że algorytmy są polimorficzne: to znaczy ta sama metoda może być używana w wielu różnych implementacjach odpowiedniego interfejsu kolekcji.

Oprócz kolekcji struktura definiuje kilka interfejsów map i klas. Mapy przechowują pary klucz / wartość. Chociaż mapy nie są zbiorami we właściwym użyciu tego terminu, ale są w pełni zintegrowane z kolekcjami.

Interfejsy kolekcji

Struktura kolekcji definiuje kilka interfejsów. Ta sekcja zawiera przegląd każdego interfejsu -

Sr.No. Interfejs i opis
1 Interfejs kolekcji

Umożliwia to pracę z grupami obiektów; znajduje się na szczycie hierarchii kolekcji.

2 Interfejs listy

To się rozciąga Collection a wystąpienie List przechowuje uporządkowaną kolekcję elementów.

3 Zbiór

To rozszerza Collection o obsługę zestawów, które muszą zawierać unikalne elementy.

4 SortedSet

To rozszerza Set do obsługi posortowanych zestawów.

5 Mapa

To odwzorowuje unikalne klucze na wartości.

6 Map.Entry

Opisuje element (parę klucz / wartość) na mapie. To jest wewnętrzna klasa Map.

7 SortedMap

To rozszerza Mapę, dzięki czemu klucze są utrzymywane w porządku rosnącym.

8 Wyliczenie

To jest starszy interfejs definiuje metody, za pomocą których można wyliczać (pobierać pojedynczo) elementy w kolekcji obiektów. Ten starszy interfejs został zastąpiony przez Iterator.

Klasy kolekcji

Java udostępnia zestaw standardowych klas kolekcji, które implementują interfejsy Collection. Niektóre z klas zapewniają pełne implementacje, które mogą być używane w takiej postaci, w jakiej są, a inne są klasami abstrakcyjnymi, dostarczającymi szkieletowych implementacji, które są używane jako punkty wyjścia do tworzenia konkretnych kolekcji.

W poniższej tabeli podsumowano standardowe klasy kolekcji -

Sr.No. Klasa i opis
1

AbstractCollection

Implementuje większość interfejsu Collection.

2

AbstractList

Rozszerza AbstractCollection i implementuje większość interfejsu List.

3

AbstractSequentialList

Rozszerza AbstractList do użycia przez kolekcję, która używa sekwencyjnego, a nie losowego dostępu do jej elementów.

4 Połączona lista

Implementuje połączoną listę, rozszerzając AbstractSequentialList.

5 ArrayList

Implementuje tablicę dynamiczną, rozszerzając AbstractList.

6

AbstractSet

Rozszerza AbstractCollection i implementuje większość interfejsu Set.

7 HashSet

Rozszerza AbstractSet do użytku z tabelą skrótów.

8 LinkedHashSet

Rozszerza HashSet, aby umożliwić iteracje zamówienia reklamowego.

9 TreeSet

Implementuje zestaw przechowywany w drzewie. Rozszerza AbstractSet.

10

AbstractMap

Implementuje większość interfejsu Map.

11 HashMap

Rozszerza AbstractMap, aby używać tabeli skrótów.

12 TreeMap

Rozszerza AbstractMap, aby używała drzewa.

13 WeakHashMap

Rozszerza AbstractMap, aby używała tablicy mieszania ze słabymi klawiszami.

14 LinkedHashMap

Rozszerza HashMap, aby umożliwić iteracje zamówienia reklamowego.

15 IdentityHashMap

Rozszerza AbstractMap i używa równości odwołań podczas porównywania dokumentów.

W AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList i AbstractMap zajęcia dostarczają szkielet implementacje interfejsów zbierania podstawowych, w celu zminimalizowania wysiłku potrzebnego do ich realizacji.

Następujące starsze klasy zdefiniowane przez java.util zostały omówione w poprzednim rozdziale -

Sr.No. Klasa i opis
1 Wektor

To implementuje tablicę dynamiczną. Jest podobny do ArrayList, ale z pewnymi różnicami.

2 Stos

Stack jest podklasą klasy Vector, która implementuje standardowy stos ostatni na wejściu, pierwszy na wyjściu.

3 Słownik

Dictionary to abstrakcyjna klasa, która reprezentuje repozytorium przechowywania kluczy / wartości i działa podobnie jak Map.

4 Hashtable

Hashtable był częścią oryginalnego java.util i jest konkretną implementacją słownika.

5 Nieruchomości

Właściwości to podklasa Hashtable. Służy do utrzymywania list wartości, w których klucz jest ciągiem, a wartość jest również ciągiem.

6 BitSet

Klasa BitSet tworzy specjalny typ tablicy, która przechowuje wartości bitowe. Ta tablica może w razie potrzeby zwiększyć rozmiar.

Algorytmy zbierania

Struktura kolekcji definiuje kilka algorytmów, które można zastosować do kolekcji i map. Te algorytmy są zdefiniowane jako metody statyczne w klasie Collections.

Kilka metod może spowodować wyświetlenie pliku ClassCastException, który występuje, gdy podejmowana jest próba porównania niezgodnych typów lub UnsupportedOperationException, co ma miejsce, gdy podjęto próbę zmodyfikowania niezmodyfikowanej kolekcji.

Kolekcje definiują trzy zmienne statyczne: EMPTY_SET, EMPTY_LIST i EMPTY_MAP. Wszystkie są niezmienne.

Sr.No. Algorytm i opis
1 Algorytmy zbierania

Oto lista wszystkich implementacji algorytmów.

Jak korzystać z iteratora?

Często będziesz chciał przeglądać elementy kolekcji. Na przykład możesz chcieć wyświetlić każdy element.

Najłatwiejszym sposobem jest użycie iteratora, który jest obiektem implementującym interfejs Iterator lub ListIterator.

Iterator umożliwia przechodzenie przez kolekcję, pobieranie lub usuwanie elementów. ListIterator rozszerza Iterator, aby umożliwić dwukierunkowe przechodzenie po liście i modyfikację elementów.

Sr.No. Metoda i opis iteratora
1 Korzystanie z iteratora Java

Oto lista wszystkich metod z przykładami dostarczonymi przez interfejsy Iterator i ListIterator.

Jak korzystać z komparatora?

Zarówno TreeSet, jak i TreeMap przechowują elementy w posortowanej kolejności. Jednak to komparator dokładnie określa, co oznacza posortowana kolejność .

Ten interfejs pozwala nam sortować daną kolekcję na wiele różnych sposobów. Ten interfejs może również służyć do sortowania dowolnych instancji dowolnej klasy (nawet klas, których nie możemy modyfikować).

Sr.No. Metoda i opis iteratora
1 Korzystanie z komparatora Java

Oto lista wszystkich metod wraz z przykładami dostarczonymi przez interfejs komparatora.

Podsumowanie

Struktura kolekcji Java daje programiście dostęp do wstępnie spakowanych struktur danych, a także do algorytmów służących do manipulowania nimi.

Kolekcja to obiekt, który może zawierać odwołania do innych obiektów. Interfejsy kolekcji deklarują operacje, które można wykonać na każdym typie kolekcji.

Klasy i interfejsy struktury kolekcji znajdują się w pakiecie java.util.

Byłoby miło, gdybyśmy mogli napisać pojedynczą metodę sortowania, która mogłaby sortować elementy w tablicy Integer, tablicy String lub tablicy dowolnego typu, która obsługuje porządkowanie.

Jawa Generic metody i klasy generyczne umożliwiają programistom określanie, odpowiednio, za pomocą pojedynczej deklaracji metody, zestawu powiązanych metod lub za pomocą pojedynczej deklaracji klasy, zestawu powiązanych typów.

Typy generyczne zapewniają również bezpieczeństwo typu w czasie kompilacji, które umożliwia programistom wyłapywanie nieprawidłowych typów w czasie kompilacji.

Korzystając z koncepcji Java Generic, możemy napisać ogólną metodę sortowania tablicy obiektów, a następnie wywołać metodę ogólną z tablicami Integer, tablicami podwójnymi, tablicami String i tak dalej, aby posortować elementy tablicy.

Metody ogólne

Możesz napisać jedną ogólną deklarację metody, którą można wywołać z argumentami różnych typów. Na podstawie typów argumentów przekazanych do metody ogólnej kompilator odpowiednio obsługuje każde wywołanie metody. Poniżej przedstawiono zasady definiowania metod ogólnych -

  • Wszystkie deklaracje metod ogólnych mają sekcję parametru typu oddzieloną nawiasami ostrymi (<i>), która poprzedza zwracany typ metody (<E> w następnym przykładzie).

  • Każda sekcja parametru typu zawiera jeden lub więcej parametrów typu oddzielonych przecinkami. Parametr typu, znany również jako zmienna typu, jest identyfikatorem określającym nazwę typu ogólnego.

  • Parametry typu mogą służyć do deklarowania zwracanego typu i pełnić rolę symboli zastępczych dla typów argumentów przekazanych do metody ogólnej, które są znane jako argumenty typu rzeczywistego.

  • Treść metody ogólnej jest deklarowana jak każda inna metoda. Należy zauważyć, że parametry typu mogą reprezentować tylko typy referencyjne, a nie typy pierwotne (takie jak int, double i char).

Przykład

Poniższy przykład ilustruje, jak możemy wydrukować tablicę innego typu przy użyciu jednej metody Generic -

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }

   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

      System.out.println("Array integerArray contains:");
      printArray(intArray);   // pass an Integer array

      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray);   // pass a Double array

      System.out.println("\nArray characterArray contains:");
      printArray(charArray);   // pass a Character array
   }
}

To da następujący wynik -

Wynik

Array integerArray contains:
1 2 3 4 5 

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

Ograniczone parametry typu

Może się zdarzyć, że będziesz chciał ograniczyć rodzaje typów, które mogą być przekazywane do parametru typu. Na przykład metoda, która operuje na liczbach, może chcieć akceptować tylko wystąpienia Number lub jej podklasy. Do tego służą parametry typu ograniczonego.

Aby zadeklarować parametr typu ograniczonego, należy podać nazwę parametru typu, po którym następuje słowo kluczowe extends, a następnie jego górna granica.

Przykład

Poniższy przykład ilustruje, w jaki sposób extends jest używane w ogólnym sensie w znaczeniu „rozszerza” (jak w klasach) lub „implementuje” (jak w interfejsach). Ten przykład jest metodą Generic zwracającą największy z trzech porównywalnych obiektów -

public class MaximumTest {
   // determines the largest of three Comparable objects
   
   public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
      T max = x;   // assume x is initially the largest
      
      if(y.compareTo(max) > 0) {
         max = y;   // y is the largest so far
      }
      
      if(z.compareTo(max) > 0) {
         max = z;   // z is the largest now                 
      }
      return max;   // returns the largest object   
   }
   
   public static void main(String args[]) {
      System.out.printf("Max of %d, %d and %d is %d\n\n", 
         3, 4, 5, maximum( 3, 4, 5 ));

      System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
         6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));

      System.out.printf("Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum("pear", "apple", "orange"));
   }
}

To da następujący wynik -

Wynik

Max of 3, 4 and 5 is 5

Max of 6.6,8.8 and 7.7 is 8.8

Max of pear, apple and orange is pear

Klasy ogólne

Deklaracja klasy ogólnej wygląda jak deklaracja klasy nieogólnej, z tą różnicą, że po nazwie klasy następuje sekcja parametru typu.

Podobnie jak w przypadku metod ogólnych, sekcja parametru typu klasy ogólnej może mieć jeden lub więcej parametrów typu oddzielonych przecinkami. Te klasy są znane jako sparametryzowane klasy lub sparametryzowane typy, ponieważ akceptują jeden lub więcej parametrów.

Przykład

Poniższy przykład ilustruje, jak możemy zdefiniować klasę ogólną -

public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }

   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();
    
      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));

      System.out.printf("Integer Value :%d\n\n", integerBox.get());
      System.out.printf("String Value :%s\n", stringBox.get());
   }
}

To da następujący wynik -

Wynik

Integer Value :10
String Value :Hello World

Java udostępnia mechanizm zwany serializacją obiektu, w którym obiekt może być reprezentowany jako sekwencja bajtów, która zawiera dane obiektu, a także informacje o typie obiektu i typach danych przechowywanych w obiekcie.

Po zapisaniu zserializowanego obiektu do pliku można go odczytać z pliku i deserializować, co oznacza, że ​​informacje o typie i bajty reprezentujące obiekt i jego dane mogą zostać użyte do ponownego utworzenia obiektu w pamięci.

Najbardziej imponujące jest to, że cały proces jest niezależny od JVM, co oznacza, że ​​obiekt może być serializowany na jednej platformie i deserializowany na zupełnie innej platformie.

Zajęcia ObjectInputStream i ObjectOutputStream to strumienie wysokiego poziomu, które zawierają metody serializacji i deserializacji obiektu.

Klasa ObjectOutputStream zawiera wiele metod zapisu do pisania różnych typów danych, ale wyróżnia się jedna z nich -

public final void writeObject(Object x) throws IOException

Powyższa metoda serializuje Object i wysyła go do strumienia wyjściowego. Podobnie klasa ObjectInputStream zawiera następującą metodę deserializacji obiektu -

public final Object readObject() throws IOException, ClassNotFoundException

Ta metoda pobiera następny Object ze strumienia i deserializuje go. Wartość zwracana to Object, więc będziesz musiał rzutować ją na odpowiedni typ danych.

Aby zademonstrować, jak działa serializacja w Javie, użyję klasy Employee, którą omówiliśmy na początku książki. Załóżmy, że mamy następującą klasę Employee, która implementuje interfejs Serializable -

Przykład

public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

Zauważ, że aby klasa została pomyślnie serializowana, muszą być spełnione dwa warunki -

  • Klasa musi implementować interfejs java.io.Serializable.

  • Wszystkie pola w klasie muszą mieć możliwość serializacji. Jeśli pola nie można serializować, należy je zaznaczyćtransient.

Jeśli chcesz wiedzieć, czy klasa standardowa języka Java jest możliwa do serializacji, czy nie, zapoznaj się z dokumentacją tej klasy. Test jest prosty: jeśli klasa implementuje java.io.Serializable, to można ją serializować; w przeciwnym razie tak nie jest.

Serializacja obiektu

Klasa ObjectOutputStream służy do serializacji obiektu. Poniższy program SerializeDemo tworzy wystąpienie obiektu Employee i serializuje go do pliku.

Po zakończeniu działania programu tworzony jest plik o nazwie pracownik.ser. Program nie generuje żadnych danych wyjściowych, ale studiuje kod i próbuje określić, co robi program.

Note - Podczas serializacji obiektu do pliku, standardową konwencją w Javie jest nadanie plikowi rozszerzenia .ser rozbudowa.

Przykład

import java.io.*;
public class SerializeDemo {

   public static void main(String [] args) {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      
      try {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      } catch (IOException i) {
         i.printStackTrace();
      }
   }
}

Deserializacja obiektu

Poniższy program DeserializeDemo deserializuje obiekt Employee utworzony w programie SerializeDemo. Przestudiuj program i spróbuj określić jego wyniki -

Przykład

import java.io.*;
public class DeserializeDemo {

   public static void main(String [] args) {
      Employee e = null;
      try {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      } catch (IOException i) {
         i.printStackTrace();
         return;
      } catch (ClassNotFoundException c) {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
   }
}

To da następujący wynik -

Wynik

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Oto ważne punkty, na które należy zwrócić uwagę:

  • Blok try / catch próbuje przechwycić wyjątek ClassNotFoundException, który jest zadeklarowany przez metodę readObject (). Aby maszyna JVM mogła deserializować obiekt, musi być w stanie znaleźć kod bajtowy dla klasy. Jeśli maszyna JVM nie może znaleźć klasy podczas deserializacji obiektu, zgłasza wyjątek ClassNotFoundException.

  • Zauważ, że wartość zwracana przez readObject () jest rzutowana na odwołanie Employee.

  • Wartość pola SSN wynosiła 11122333, gdy obiekt był serializowany, ale ponieważ pole jest przejściowe, ta wartość nie została wysłana do strumienia wyjściowego. Pole numeru SSN deserializowanego obiektu pracownika ma wartość 0.

Termin programowanie sieciowe odnosi się do pisania programów, które są wykonywane na wielu urządzeniach (komputerach), w których wszystkie urządzenia są połączone ze sobą za pomocą sieci.

Pakiet java.net interfejsów API J2SE zawiera zbiór klas i interfejsów, które zapewniają szczegóły komunikacji niskiego poziomu, co pozwala na pisanie programów, które koncentrują się na rozwiązywaniu problemów.

Pakiet java.net zapewnia obsługę dwóch popularnych protokołów sieciowych -

  • TCP- TCP oznacza protokół kontroli transmisji, który umożliwia niezawodną komunikację między dwiema aplikacjami. Protokół TCP jest zwykle używany w protokole internetowym, który jest nazywany TCP / IP.

  • UDP - UDP to skrót od User Datagram Protocol, protokół bezpołączeniowy, który umożliwia przesyłanie pakietów danych między aplikacjami.

Ten rozdział daje dobre zrozumienie następujących dwóch tematów:

  • Socket Programming - Jest to najczęściej używana koncepcja w sieci i została bardzo szczegółowo wyjaśniona.

  • URL Processing- To byłoby omówione oddzielnie. Kliknij tutaj, aby dowiedzieć się więcej o przetwarzaniu adresów URL w języku Java.

Programowanie gniazd

Gniazda zapewniają mechanizm komunikacji między dwoma komputerami za pomocą protokołu TCP. Program klienta tworzy gniazdo na swoim końcu komunikacji i próbuje połączyć to gniazdo z serwerem.

Po nawiązaniu połączenia serwer tworzy obiekt gniazda na końcu komunikacji. Klient i serwer mogą teraz komunikować się poprzez zapisywanie i odczytywanie z gniazda.

Klasa java.net.Socket reprezentuje gniazdo, a klasa java.net.ServerSocket zapewnia programowi serwera mechanizm nasłuchiwania klientów i ustanawiania z nimi połączeń.

Podczas nawiązywania połączenia TCP między dwoma komputerami za pomocą gniazd występują następujące kroki -

  • Serwer tworzy instancję obiektu ServerSocket, wskazując numer portu, na którym ma się odbywać komunikacja.

  • Serwer wywołuje metodę accept () klasy ServerSocket. Ta metoda czeka, aż klient połączy się z serwerem na podanym porcie.

  • Gdy serwer czeka, klient tworzy instancję obiektu Socket, określając nazwę serwera i numer portu, z którym ma się połączyć.

  • Konstruktor klasy Socket próbuje połączyć klienta z określonym serwerem i numerem portu. Jeśli komunikacja zostanie nawiązana, klient ma teraz obiekt Socket, który może komunikować się z serwerem.

  • Po stronie serwera metoda accept () zwraca odniesienie do nowego gniazda na serwerze, które jest połączone z gniazdem klienta.

Po ustanowieniu połączeń komunikacja może odbywać się przy użyciu strumieni we / wy. Każde gniazdo ma zarówno OutputStream, jak i InputStream. OutputStream klienta jest połączony z InputStream serwera, a InputStream klienta jest połączony z OutputStream serwera.

TCP jest dwukierunkowym protokołem komunikacyjnym, dlatego dane mogą być przesyłane w obu strumieniach w tym samym czasie. Poniżej przedstawiono przydatne klasy zapewniające pełny zestaw metod implementacji gniazd.

Metody klasy ServerSocket

Plik java.net.ServerSocket klasa jest używana przez aplikacje serwera do uzyskiwania portu i nasłuchiwania żądań klientów.

Klasa ServerSocket ma cztery konstruktory -

Sr.No. Metoda i opis
1

public ServerSocket(int port) throws IOException

Próbuje utworzyć gniazdo serwera powiązane z określonym portem. Wyjątek występuje, jeśli port jest już powiązany z inną aplikacją.

2

public ServerSocket(int port, int backlog) throws IOException

Podobnie jak w poprzednim konstruktorze, parametr backlog określa, ile klientów przychodzących ma być przechowywanych w kolejce oczekiwania.

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

Podobnie jak w poprzednim konstruktorze, parametr InetAddress określa lokalny adres IP do powiązania. InetAddress jest używany w przypadku serwerów, które mogą mieć wiele adresów IP, umożliwiając serwerowi określenie, na których z jego adresów IP ma akceptować żądania klientów.

4

public ServerSocket() throws IOException

Tworzy niezwiązane gniazdo serwera. Korzystając z tego konstruktora, użyj metody bind (), gdy będziesz gotowy do powiązania gniazda serwera.

Jeśli konstruktor ServerSocket nie zgłasza wyjątku, oznacza to, że aplikacja została pomyślnie powiązana z określonym portem i jest gotowa na żądania klientów.

Poniżej przedstawiono niektóre typowe metody klasy ServerSocket -

Sr.No. Metoda i opis
1

public int getLocalPort()

Zwraca port, na którym nasłuchuje gniazdo serwera. Ta metoda jest przydatna, jeśli przekazałeś 0 jako numer portu w konstruktorze i pozwoliłeś serwerowi znaleźć port za Ciebie.

2

public Socket accept() throws IOException

Waits for an incoming client. This method blocks until either a client connects to the server on the specified port or the socket times out, assuming that the time-out value has been set using the setSoTimeout() method. Otherwise, this method blocks indefinitely.

3

public void setSoTimeout(int timeout)

Sets the time-out value for how long the server socket waits for a client during the accept().

4

public void bind(SocketAddress host, int backlog)

Binds the socket to the specified server and port in the SocketAddress object. Use this method if you have instantiated the ServerSocket using the no-argument constructor.

When the ServerSocket invokes accept(), the method does not return until a client connects. After a client does connect, the ServerSocket creates a new Socket on an unspecified port and returns a reference to this new Socket. A TCP connection now exists between the client and the server, and communication can begin.

Socket Class Methods

The java.net.Socket class represents the socket that both the client and the server use to communicate with each other. The client obtains a Socket object by instantiating one, whereas the server obtains a Socket object from the return value of the accept() method.

The Socket class has five constructors that a client uses to connect to a server −

Sr.No. Method & Description
1

public Socket(String host, int port) throws UnknownHostException, IOException.

This method attempts to connect to the specified server at the specified port. If this constructor does not throw an exception, the connection is successful and the client is connected to the server.

2

public Socket(InetAddress host, int port) throws IOException

This method is identical to the previous constructor, except that the host is denoted by an InetAddress object.

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

Connects to the specified host and port, creating a socket on the local host at the specified address and port.

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

This method is identical to the previous constructor, except that the host is denoted by an InetAddress object instead of a String.

5

public Socket()

Creates an unconnected socket. Use the connect() method to connect this socket to a server.

When the Socket constructor returns, it does not simply instantiate a Socket object but it actually attempts to connect to the specified server and port.

Some methods of interest in the Socket class are listed here. Notice that both the client and the server have a Socket object, so these methods can be invoked by both the client and the server.

Sr.No. Method & Description
1

public void connect(SocketAddress host, int timeout) throws IOException

This method connects the socket to the specified host. This method is needed only when you instantiate the Socket using the no-argument constructor.

2

public InetAddress getInetAddress()

This method returns the address of the other computer that this socket is connected to.

3

public int getPort()

Returns the port the socket is bound to on the remote machine.

4

public int getLocalPort()

Returns the port the socket is bound to on the local machine.

5

public SocketAddress getRemoteSocketAddress()

Returns the address of the remote socket.

6

public InputStream getInputStream() throws IOException

Returns the input stream of the socket. The input stream is connected to the output stream of the remote socket.

7

public OutputStream getOutputStream() throws IOException

Returns the output stream of the socket. The output stream is connected to the input stream of the remote socket.

8

public void close() throws IOException

Closes the socket, which makes this Socket object no longer capable of connecting again to any server.

InetAddress Class Methods

This class represents an Internet Protocol (IP) address. Here are following usefull methods which you would need while doing socket programming −

Sr.No. Method & Description
1

static InetAddress getByAddress(byte[] addr)

Returns an InetAddress object given the raw IP address.

2

static InetAddress getByAddress(String host, byte[] addr)

Creates an InetAddress based on the provided host name and IP address.

3

static InetAddress getByName(String host)

Determines the IP address of a host, given the host's name.

4

String getHostAddress()

Returns the IP address string in textual presentation.

5

String getHostName()

Gets the host name for this IP address.

6

static InetAddress InetAddress getLocalHost()

Returns the local host.

7

String toString()

Converts this IP address to a String.

Socket Client Example

The following GreetingClient is a client program that connects to a server by using a socket and sends a greeting, and then waits for a response.

Example

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Socket Server Example

The following GreetingServer program is an example of a server application that uses the Socket class to listen for clients on a port number specified by a command-line argument −

Example

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Compile the client and the server and then start the server as follows −

$ java GreetingServer 6066
Waiting for client on port 6066...

Check the client program as follows −

Output

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!

To send an e-mail using your Java Application is simple enough but to start with you should have JavaMail API and Java Activation Framework (JAF) installed on your machine.

  • You can download latest version of JavaMail (Version 1.2) from Java's standard website.

  • You can download latest version of JAF (Version 1.1.1) from Java's standard website.

Download and unzip these files, in the newly created top level directories you will find a number of jar files for both the applications. You need to add mail.jar and activation.jar files in your CLASSPATH.

Send a Simple E-mail

Here is an example to send a simple e-mail from your machine. It is assumed that your localhost is connected to the Internet and capable enough to send an e-mail.

Example

// File Name SendEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail {

   public static void main(String [] args) {    
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Compile and run this program to send a simple e-mail −

Output

$ java SendEmail
Sent message successfully....

If you want to send an e-mail to multiple recipients then the following methods would be used to specify multiple e-mail IDs −

void addRecipients(Message.RecipientType type, Address[] addresses)
   throws MessagingException

Here is the description of the parameters −

  • type − This would be set to TO, CC or BCC. Here CC represents Carbon Copy and BCC represents Black Carbon Copy. Example: Message.RecipientType.TO

  • addresses − This is an array of e-mail ID. You would need to use InternetAddress() method while specifying email IDs.

Send an HTML E-mail

Here is an example to send an HTML e-mail from your machine. Here it is assumed that your localhost is connected to the Internet and capable enough to send an e-mail.

Ten przykład jest bardzo podobny do poprzedniego, z tym że tutaj używamy metody setContent () do ustawienia treści, której drugim argumentem jest „text / html”, aby określić, że treść HTML jest zawarta w wiadomości.

Korzystając z tego przykładu, możesz wysyłać dowolną zawartość HTML.

Przykład

// File Name SendHTMLEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendHTMLEmail {

   public static void main(String [] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Send the actual HTML message, as big as you like
         message.setContent("<h1>This is actual message</h1>", "text/html");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Skompiluj i uruchom ten program, aby wysłać wiadomość e-mail w formacie HTML -

Wynik

$ java SendHTMLEmail
Sent message successfully....

Wyślij załącznik e-mailem

Oto przykład wysyłania wiadomości e-mail z załącznikiem z Twojego komputera. Tutaj zakłada się, że twójlocalhost jest podłączony do internetu i wystarczająco zdolny do wysyłania wiadomości e-mail.

Przykład

// File Name SendFileEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendFileEmail {

   public static void main(String [] args) {     
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Create the message part 
         BodyPart messageBodyPart = new MimeBodyPart();

         // Fill the message
         messageBodyPart.setText("This is message body");
         
         // Create a multipar message
         Multipart multipart = new MimeMultipart();

         // Set text message part
         multipart.addBodyPart(messageBodyPart);

         // Part two is attachment
         messageBodyPart = new MimeBodyPart();
         String filename = "file.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);

         // Send the complete message parts
         message.setContent(multipart );

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Skompiluj i uruchom ten program, aby wysłać wiadomość e-mail w formacie HTML -

Wynik

$ java SendFileEmail
Sent message successfully....

Część dotycząca uwierzytelniania użytkownika

Jeśli wymagane jest podanie identyfikatora użytkownika i hasła do serwera poczty e-mail w celu uwierzytelnienia, możesz ustawić te właściwości w następujący sposób -

props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");

Reszta mechanizmu wysyłania e-maili pozostałaby taka, jak wyjaśniono powyżej.

Java to wielowątkowy język programowania, co oznacza, że ​​możemy tworzyć wielowątkowe programy przy użyciu języka Java. Program wielowątkowy zawiera dwie lub więcej części, które mogą działać jednocześnie, a każda część może jednocześnie obsługiwać inne zadanie, optymalnie wykorzystując dostępne zasoby, szczególnie gdy komputer ma wiele procesorów.

Z definicji wielozadaniowość ma miejsce, gdy wiele procesów korzysta ze wspólnych zasobów przetwarzania, takich jak procesor. Wielowątkowość rozszerza ideę wielozadaniowości na aplikacje, w których można podzielić określone operacje w ramach jednej aplikacji na osobne wątki. Każdy z wątków może działać równolegle. System operacyjny dzieli czas przetwarzania nie tylko na różne aplikacje, ale także na każdy wątek w aplikacji.

Wielowątkowość umożliwia pisanie w taki sposób, że wiele działań może być wykonywanych jednocześnie w tym samym programie.

Cykl życia wątku

Wątek przechodzi przez różne etapy swojego cyklu życia. Na przykład wątek rodzi się, uruchamia, biegnie, a następnie umiera. Poniższy diagram przedstawia pełny cykl życia wątku.

Oto etapy cyklu życia -

  • New- Nowy wątek rozpoczyna swój cykl życia w nowym stanie. Pozostaje w tym stanie, dopóki program nie uruchomi wątku. Jest również określany jako plikborn thread.

  • Runnable- Po uruchomieniu nowo narodzonego wątku wątek staje się gotowy do uruchomienia. Uważa się, że wątek w tym stanie wykonuje swoje zadanie.

  • Waiting- Czasami wątek przechodzi w stan oczekiwania, podczas gdy wątek oczekuje na wykonanie zadania przez inny wątek. Wątek przechodzi z powrotem do stanu, który można uruchomić, tylko wtedy, gdy inny wątek sygnalizuje oczekującemu wątkowi kontynuowanie wykonywania.

  • Timed Waiting- Działający wątek może wejść w czasowy stan oczekiwania przez określony przedział czasu. Wątek w tym stanie przechodzi z powrotem do stanu, który można uruchomić, po wygaśnięciu tego przedziału czasu lub gdy wystąpi zdarzenie, na które oczekuje.

  • Terminated (Dead) - Wątek, który można uruchomić, przechodzi w stan zakończony po zakończeniu zadania lub w inny sposób.

Priorytety wątków

Każdy wątek Java ma priorytet, który pomaga systemowi operacyjnemu określić kolejność planowania wątków.

Priorytety wątków Java znajdują się w zakresie od MIN_PRIORITY (stała 1) do MAX_PRIORITY (stała 10). Domyślnie każdy wątek ma priorytet NORM_PRIORITY (stała 5).

Wątki o wyższym priorytecie są ważniejsze dla programu i powinny mieć przydzielony czas procesora przed wątkami o niższym priorytecie. Jednak priorytety wątków nie mogą zagwarantować kolejności wykonywania wątków i są bardzo zależne od platformy.

Utwórz wątek, implementując uruchamialny interfejs

Jeśli twoja klasa ma być wykonywana jako wątek, możesz to osiągnąć, implementując plik Runnableberło. Będziesz musiał wykonać trzy podstawowe kroki -

Krok 1

Pierwszym krokiem jest zaimplementowanie metody run () udostępnianej przez plik Runnableberło. Ta metoda zapewnia punkt wejścia dla wątku, a całą logikę biznesową umieścisz w tej metodzie. Poniżej znajduje się prosta składnia metody run () -

public void run( )

Krok 2

W drugim kroku utworzysz instancję Thread obiekt przy użyciu następującego konstruktora -

Thread(Runnable threadObj, String threadName);

Gdzie threadObj jest wystąpieniem klasy, która implementujeRunnable interfejs i threadName to nazwa nadana nowemu wątkowi.

Krok 3

Po utworzeniu obiektu Thread możesz go uruchomić, wywołując start()metoda, która wykonuje wywołanie metody run (). Poniżej znajduje się prosta składnia metody start () -

void start();

Przykład

Oto przykład, który tworzy nowy wątek i zaczyna go uruchamiać -

class RunnableDemo implements Runnable {
   private Thread t;
   private String threadName;
   
   RunnableDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo R1 = new RunnableDemo( "Thread-1");
      R1.start();
      
      RunnableDemo R2 = new RunnableDemo( "Thread-2");
      R2.start();
   }   
}

To da następujący wynik -

Wynik

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

Utwórz wątek, rozszerzając klasę wątku

Drugim sposobem utworzenia wątku jest utworzenie nowej klasy, która rozszerza Threadw dwóch prostych krokach. Takie podejście zapewnia większą elastyczność w obsłudze wielu wątków utworzonych przy użyciu metod dostępnych w klasie Thread.

Krok 1

Będziesz musiał zmienić run( )metoda dostępna w klasie Thread. Ta metoda zapewnia punkt wejścia dla wątku, a całą logikę biznesową umieścisz w tej metodzie. Poniżej znajduje się prosta składnia metody run () -

public void run( )

Krok 2

Po utworzeniu obiektu Thread możesz go uruchomić, wywołując start()metoda, która wykonuje wywołanie metody run (). Poniżej znajduje się prosta składnia metody start () -

void start( );

Przykład

Oto poprzedni program przepisany w celu rozszerzenia wątku -

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;
   
   ThreadDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      ThreadDemo T1 = new ThreadDemo( "Thread-1");
      T1.start();
      
      ThreadDemo T2 = new ThreadDemo( "Thread-2");
      T2.start();
   }   
}

To da następujący wynik -

Wynik

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

Metody wątku

Poniżej znajduje się lista ważnych metod dostępnych w klasie Thread.

Sr.No. Metoda i opis
1

public void start()

Uruchamia wątek w oddzielnej ścieżce wykonywania, a następnie wywołuje metodę run () w tym obiekcie Thread.

2

public void run()

Jeśli wystąpienie tego obiektu Thread zostało utworzone przy użyciu oddzielnego elementu docelowego Runnable, metoda run () jest wywoływana na tym obiekcie Runnable.

3

public final void setName(String name)

Zmienia nazwę obiektu Thread. Istnieje również metoda getName () do pobierania nazwy.

4

public final void setPriority(int priority)

Ustawia priorytet tego obiektu Thread. Możliwe wartości mieszczą się w przedziale od 1 do 10.

5

public final void setDaemon(boolean on)

Parametr true oznacza ten wątek jako wątek demona.

6

public final void join(long millisec)

Bieżący wątek wywołuje tę metodę w drugim wątku, powodując blokowanie bieżącego wątku do momentu zakończenia drugiego wątku lub przejścia określonej liczby milisekund.

7

public void interrupt()

Przerywa ten wątek, powodując kontynuację wykonywania, jeśli został zablokowany z jakiegokolwiek powodu.

8

public final boolean isAlive()

Zwraca wartość true, jeśli wątek żyje, czyli w dowolnym momencie po uruchomieniu wątku, ale przed zakończeniem.

Poprzednie metody są wywoływane na określonym obiekcie Thread. Następujące metody w klasie Thread są statyczne. Wywołanie jednej z metod statycznych wykonuje operację na aktualnie uruchomionym wątku.

Sr.No. Metoda i opis
1

public static void yield()

Powoduje, że aktualnie działający wątek podlega innym wątkom o tym samym priorytecie, które czekają na zaplanowanie.

2

public static void sleep(long millisec)

Powoduje, że aktualnie działający wątek blokuje się na co najmniej określoną liczbę milisekund.

3

public static boolean holdsLock(Object x)

Zwraca wartość true, jeśli bieżący wątek utrzymuje blokadę na danym Object.

4

public static Thread currentThread()

Zwraca odwołanie do aktualnie uruchomionego wątku, który jest wątkiem, który wywołuje tę metodę.

5

public static void dumpStack()

Wyświetla ślad stosu dla aktualnie uruchomionego wątku, co jest przydatne podczas debugowania aplikacji wielowątkowej.

Przykład

Poniższy program ThreadClassDemo przedstawia niektóre z tych metod klasy Thread. Rozważ klasęDisplayMessage które implementuje Runnable -

// File Name : DisplayMessage.java
// Create a thread to implement Runnable

public class DisplayMessage implements Runnable {
   private String message;
   
   public DisplayMessage(String message) {
      this.message = message;
   }
   
   public void run() {
      while(true) {
         System.out.println(message);
      }
   }
}

Poniżej znajduje się kolejna klasa, która rozszerza klasę Thread -

// File Name : GuessANumber.java
// Create a thread to extentd Thread

public class GuessANumber extends Thread {
   private int number;
   public GuessANumber(int number) {
      this.number = number;
   }
   
   public void run() {
      int counter = 0;
      int guess = 0;
      do {
         guess = (int) (Math.random() * 100 + 1);
         System.out.println(this.getName() + " guesses " + guess);
         counter++;
      } while(guess != number);
      System.out.println("** Correct!" + this.getName() + "in" + counter + "guesses.**");
   }
}

Poniżej znajduje się główny program, który wykorzystuje wyżej zdefiniowane klasy -

// File Name : ThreadClassDemo.java
public class ThreadClassDemo {

   public static void main(String [] args) {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
      
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();

      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try {
         thread3.join();
      } catch (InterruptedException e) {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
      
      thread4.start();
      System.out.println("main() is ending...");
   }
}

Spowoduje to następujący wynik. Możesz próbować tego przykładu wielokrotnie, a za każdym razem otrzymasz inny wynik.

Wynik

Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......

Główne koncepcje wielowątkowości w języku Java

Robiąc programowanie wielowątkowe w Javie, musisz mieć bardzo przydatne następujące pojęcia -

  • Co to jest synchronizacja wątków?

  • Obsługa komunikacji między wątkami

  • Obsługa zakleszczenia wątków

  • Główne operacje wątkowe

Na appletto program napisany w języku Java, który działa w przeglądarce internetowej. Aplet może być w pełni funkcjonalną aplikacją Java, ponieważ ma do dyspozycji całe Java API.

Istnieje kilka ważnych różnic między apletem a samodzielną aplikacją Java, w tym:

  • Aplet to klasa Java, która rozszerza klasę java.applet.Applet.

  • Metoda main () nie jest wywoływana w aplecie, a klasa apletu nie definiuje metody main ().

  • Aplety są przeznaczone do osadzania na stronie HTML.

  • Gdy użytkownik przegląda stronę HTML zawierającą aplet, kod apletu jest pobierany na komputer użytkownika.

  • Do wyświetlenia apletu wymagana jest maszyna JVM. JVM może być wtyczką przeglądarki internetowej lub oddzielnym środowiskiem wykonawczym.

  • JVM na komputerze użytkownika tworzy instancję klasy apletu i wywołuje różne metody w trakcie istnienia apletu.

  • Aplety mają ścisłe reguły bezpieczeństwa, które są wymuszane przez przeglądarkę internetową. Bezpieczeństwo apletu jest często nazywane zabezpieczeniem piaskownicy, porównując aplet do dziecka bawiącego się w piaskownicy z różnymi regułami, których należy przestrzegać.

  • Inne klasy, których potrzebuje aplet, można pobrać w jednym pliku Java Archive (JAR).

Cykl życia apletu

Cztery metody klasy Applet zapewniają strukturę, na której można zbudować każdy poważny aplet -

  • init- Ta metoda jest przeznaczona do jakiejkolwiek inicjalizacji potrzebnej dla twojego apletu. Jest wywoływana po przetworzeniu znaczników param wewnątrz znacznika apletu.

  • start- Ta metoda jest wywoływana automatycznie po wywołaniu przez przeglądarkę metody init. Jest również wywoływana za każdym razem, gdy użytkownik powraca do strony zawierającej aplet po wyjściu na inne strony.

  • stop- Ta metoda jest wywoływana automatycznie, gdy użytkownik opuści stronę, na której znajduje się aplet. Dlatego może być wywoływany wielokrotnie w tym samym aplecie.

  • destroy- Ta metoda jest wywoływana tylko wtedy, gdy przeglądarka zamyka się normalnie. Ponieważ aplety są przeznaczone do życia na stronie HTML, zwykle nie należy pozostawiać zasobów po opuszczeniu przez użytkownika strony zawierającej aplet.

  • paint- Wywoływane natychmiast po metodzie start (), a także za każdym razem, gdy aplet wymaga odświeżenia w przeglądarce. Metoda paint () jest w rzeczywistości dziedziczona z java.awt.

Aplet „Hello, World”

Poniżej znajduje się prosty aplet o nazwie HelloWorldApplet.java -

import java.applet.*;
import java.awt.*;

public class HelloWorldApplet extends Applet {
   public void paint (Graphics g) {
      g.drawString ("Hello World", 25, 50);
   }
}

Te instrukcje importu przenoszą klasy do zakresu naszej klasy apletów -

  • java.applet.Applet
  • java.awt.Graphics

Bez tych instrukcji importu kompilator języka Java nie rozpoznałby klas Applet i Graphics, do których odwołuje się klasa apletu.

Klasa apletów

Każdy aplet jest rozszerzeniem klasy java.applet.Applet . Podstawowa klasa Applet udostępnia metody, które może wywołać pochodna klasa Applet w celu uzyskania informacji i usług z kontekstu przeglądarki.

Obejmują one metody, które wykonują następujące czynności -

  • Pobierz parametry apletu
  • Uzyskaj lokalizację sieciową pliku HTML zawierającego aplet
  • Uzyskaj lokalizację sieciową katalogu klas apletów
  • Wydrukuj komunikat o stanie w przeglądarce
  • Pobierz obraz
  • Pobierz klip audio
  • Odtwórz klip audio
  • Zmień rozmiar apletu

Ponadto klasa Applet zapewnia interfejs, za pomocą którego przeglądarka lub przeglądarka uzyskuje informacje o aplecie i kontroluje jego wykonanie. Widz może -

  • Poproś o informacje o autorze, wersji i prawach autorskich apletu
  • Poproś o opis parametrów rozpoznawanych przez aplet
  • Zainicjuj aplet
  • Zniszcz aplet
  • Rozpocznij wykonywanie apletu
  • Zatrzymaj wykonywanie apletu

Klasa Applet zapewnia domyślne implementacje każdej z tych metod. W razie potrzeby te implementacje mogą zostać zastąpione.

Aplet „Hello, World” jest kompletny w obecnej postaci. Jedyną nadpisywaną metodą jest metoda malowania.

Wywołanie apletu

Aplet można wywołać poprzez osadzenie dyrektyw w pliku HTML i wyświetlenie pliku za pomocą przeglądarki apletów lub przeglądarki obsługującej język Java.

Znacznik <applet> jest podstawą osadzania apletu w pliku HTML. Poniżej znajduje się przykład wywołujący aplet „Hello, World” -

<html>
   <title>The Hello, World Applet</title>
   <hr>
   <applet code = "HelloWorldApplet.class" width = "320" height = "120">
      If your browser was Java-enabled, a "Hello, World"
      message would appear here.
   </applet>
   <hr>
</html>

Note- Możesz zapoznać się z tagiem apletu HTML, aby dowiedzieć się więcej o wywoływaniu apletu z HTML.

Atrybut code tagu <applet> jest wymagany. Określa klasę apletu do uruchomienia. Szerokość i wysokość są również wymagane do określenia początkowego rozmiaru panelu, w którym działa aplet. Dyrektywa apletu musi być zamknięta znacznikiem </applet>.

Jeśli aplet przyjmuje parametry, wartości parametrów można przekazać, dodając znaczniki <param> między <applet> i </applet>. Przeglądarka ignoruje tekst i inne znaczniki między tagami apletów.

Przeglądarki bez obsługi języka Java nie przetwarzają <applet> i </applet>. Dlatego wszystko, co pojawia się między tagami, niezwiązane z apletem, jest widoczne w przeglądarkach bez obsługi języka Java.

Przeglądarka lub przeglądarka szuka skompilowanego kodu Java w lokalizacji dokumentu. Aby określić inaczej, użyj atrybutu codebase tagu <applet>, jak pokazano -

<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class"
   width = "320" height = "120">

Jeśli aplet znajduje się w pakiecie innym niż domyślny, pakiet wstrzymujący musi być określony w atrybucie kodu przy użyciu znaku kropki (.), Aby oddzielić komponenty pakietu / klasy. Na przykład -

<applet  = "mypackage.subpackage.TestApplet.class" 
   width = "320" height = "120">

Pobieranie parametrów apletu

Poniższy przykład ilustruje sposób, w jaki aplet reaguje na parametry konfiguracji określone w dokumencie. Ten aplet wyświetla wzór szachownicy w kolorze czarnym i drugim kolorze.

Drugi kolor i rozmiar każdego kwadratu można określić jako parametry apletu w dokumencie.

CheckerApplet pobiera swoje parametry w metodzie init (). Swoje parametry może również pobrać w metodzie paint (). Jednak pobieranie wartości i zapisywanie ustawień raz na początku apletu, zamiast przy każdym odświeżaniu, jest wygodne i wydajne.

Przeglądarka lub przeglądarka apletów wywołuje metodę init () każdego uruchamianego apletu. Przeglądarka wywołuje init () raz, natychmiast po załadowaniu apletu. (Applet.init () nie robi nic.) Zastąp domyślną implementację, aby wstawić niestandardowy kod inicjujący.

Metoda Applet.getParameter () pobiera parametr o podanej nazwie parametru (wartością parametru jest zawsze łańcuch). Jeśli wartość jest danymi liczbowymi lub innymi danymi niebędącymi znakami, ciąg musi zostać przeanalizowany.

Poniżej znajduje się szkielet CheckerApplet.java -

import java.applet.*;
import java.awt.*;

public class CheckerApplet extends Applet {
   int squareSize = 50;   // initialized to default size
   public void init() {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

Oto metody init () i private parseSquareSize () CheckerApplet -

public void init () {
   String squareSizeParam = getParameter ("squareSize");
   parseSquareSize (squareSizeParam);
   
   String colorParam = getParameter ("color");
   Color fg = parseColor (colorParam);
   
   setBackground (Color.black);
   setForeground (fg);
}

private void parseSquareSize (String param) {
   if (param == null) return;
   try {
      squareSize = Integer.parseInt (param);
   } catch (Exception e) {
      // Let default value remain
   }
}

Aplet wywołuje parseSquareSize (), aby przeanalizować parametr squareSize. parseSquareSize () wywołuje metodę biblioteczną Integer.parseInt (), która analizuje ciąg znaków i zwraca liczbę całkowitą. Integer.parseInt () zgłasza wyjątek, gdy jego argument jest nieprawidłowy.

Dlatego parseSquareSize () wychwytuje wyjątki, zamiast pozwalać apletowi na niepowodzenie przy złym wejściu.

Aplet wywołuje parseColor (), aby przeanalizować parametr koloru na wartość Color. parseColor () wykonuje serię porównań ciągów, aby dopasować wartość parametru do nazwy wstępnie zdefiniowanego koloru. Musisz zaimplementować te metody, aby ten aplet działał.

Określanie parametrów apletu

Poniżej znajduje się przykład pliku HTML z osadzonym w nim CheckerApplet. Plik HTML określa oba parametry apletu za pomocą znacznika <param>.

<html>
   <title>Checkerboard Applet</title>
   <hr>
   <applet code = "CheckerApplet.class" width = "480" height = "320">
      <param name = "color" value = "blue">
      <param name = "squaresize" value = "30">
   </applet>
   <hr>
</html>

Note - W nazwach parametrów nie jest rozróżniana wielkość liter.

Konwersja aplikacji do apletów

Graficzną aplikację Java (to znaczy aplikację korzystającą z AWT i którą można uruchomić za pomocą programu uruchamiającego w języku Java) można łatwo przekonwertować na aplet, który można osadzić na stronie internetowej.

Poniżej przedstawiono konkretne kroki konwersji aplikacji do apletu.

  • Utwórz stronę HTML z odpowiednim tagiem, aby załadować kod apletu.

  • Podaj podklasę klasy JApplet. Upublicznij te zajęcia. W przeciwnym razie aplet nie może zostać załadowany.

  • Wyeliminuj główną metodę w aplikacji. Nie twórz okna ramowego dla aplikacji. Twoja aplikacja zostanie wyświetlona w przeglądarce.

  • Przenieś kod inicjujący z konstruktora okna ramki do metody init apletu. Nie musisz jawnie konstruować obiektu apletu. Przeglądarka tworzy go za Ciebie i wywołuje metodę init.

  • Usuń wywołanie setSize; w przypadku apletów ustalanie rozmiaru odbywa się za pomocą parametrów szerokości i wysokości w pliku HTML.

  • Usuń wywołanie setDefaultCloseOperation. Nie można zamknąć apletu; kończy się po zamknięciu przeglądarki.

  • Jeśli aplikacja wywołuje setTitle, wyeliminuj wywołanie metody. Aplety nie mogą mieć pasków tytułu. (Oczywiście możesz zatytułować samą stronę internetową, używając znacznika tytułu HTML).

  • Nie wywołuj metody setVisible (true). Aplet zostanie wyświetlony automatycznie.

Obsługa zdarzeń

Aplety dziedziczą grupę metod obsługi zdarzeń z klasy Container. Klasa Container definiuje kilka metod, takich jak processKeyEvent i processMouseEvent, do obsługi określonych typów zdarzeń, a następnie jedną metodę typu catch-all o nazwie processEvent.

Aby zareagować na zdarzenie, aplet musi przesłonić odpowiednią metodę specyficzną dla zdarzenia.

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;

public class ExampleEventHandling extends Applet implements MouseListener {
   StringBuffer strBuffer;

   public void init() {
      addMouseListener(this);
      strBuffer = new StringBuffer();
      addItem("initializing the apple ");
   }

   public void start() {
      addItem("starting the applet ");
   }

   public void stop() {
      addItem("stopping the applet ");
   }

   public void destroy() {
      addItem("unloading the applet");
   }

   void addItem(String word) {
      System.out.println(word);
      strBuffer.append(word);
      repaint();
   }

   public void paint(Graphics g) {
      // Draw a Rectangle around the applet's display area.
      g.drawRect(0, 0, 
      getWidth() - 1,
      getHeight() - 1);

      // display the string inside the rectangle.
      g.drawString(strBuffer.toString(), 10, 20);
   }

   
   public void mouseEntered(MouseEvent event) {
   }
   public void mouseExited(MouseEvent event) {
   }
   public void mousePressed(MouseEvent event) {
   }
   public void mouseReleased(MouseEvent event) {
   }
   public void mouseClicked(MouseEvent event) {
      addItem("mouse clicked! ");
   }
}

Teraz nazwijmy ten aplet w następujący sposób -

<html>
   <title>Event Handling</title>
   <hr>
   <applet code = "ExampleEventHandling.class" 
      width = "300" height = "300">
   </applet>
   <hr>
</html>

Początkowo aplet wyświetli komunikat „Inicjalizacja apletu. Uruchamianie apletu”. Następnie po kliknięciu wewnątrz prostokąta zostanie również wyświetlony komunikat „kliknięcie myszą”.

Wyświetlanie obrazów

Aplet może wyświetlać obrazy w formacie GIF, JPEG, BMP i innych. Aby wyświetlić obraz w aplecie, należy użyć metody drawImage () znajdującej się w klasie java.awt.Graphics.

Poniżej znajduje się przykład ilustrujący wszystkie kroki, aby wyświetlić obrazy -

import java.applet.*;
import java.awt.*;
import java.net.*;

public class ImageDemo extends Applet {
   private Image image;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String imageURL = this.getParameter("image");
      if(imageURL == null) {
         imageURL = "java.jpg";
      }
      try {
         URL url = new URL(this.getDocumentBase(), imageURL);
         image = context.getImage(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         // Display in browser status bar
         context.showStatus("Could not load image!");
      }
   }
   
   public void paint(Graphics g) {
      context.showStatus("Displaying image");
      g.drawImage(image, 0, 0, 200, 84, null);
      g.drawString("www.javalicense.com", 35, 100);
   }  
}

Teraz nazwijmy ten aplet w następujący sposób -

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "300" height = "200">
      <param name = "image" value = "java.jpg">
   </applet>
   <hr>
</html>

Odtwarzam dźwięk

Aplet może odtwarzać plik audio reprezentowany przez interfejs AudioClip w pakiecie java.applet. Interfejs AudioClip ma trzy metody, w tym -

  • public void play() - Odtwarza klip audio jeden raz, od początku.

  • public void loop() - Powoduje ciągłe odtwarzanie klipu audio.

  • public void stop() - Zatrzymuje odtwarzanie klipu audio.

Aby uzyskać obiekt AudioClip, należy wywołać metodę getAudioClip () klasy Applet. Metoda getAudioClip () zwraca natychmiastowy wynik, niezależnie od tego, czy adres URL jest tłumaczony na rzeczywisty plik audio, czy nie. Plik audio nie jest pobierany, dopóki nie zostanie podjęta próba odtworzenia klipu audio.

Poniżej znajduje się przykład ilustrujący wszystkie kroki, aby odtworzyć dźwięk -

import java.applet.*;
import java.awt.*;
import java.net.*;

public class AudioDemo extends Applet {
   private AudioClip clip;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String audioURL = this.getParameter("audio");
      if(audioURL == null) {
         audioURL = "default.au";
      }
      try {
         URL url = new URL(this.getDocumentBase(), audioURL);
         clip = context.getAudioClip(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         context.showStatus("Could not load audio file!");
      }
   }
   
   public void start() {
      if(clip != null) {
         clip.loop();
      }
   }
   
   public void stop() {
      if(clip != null) {
         clip.stop();
      }
   }
}

Teraz nazwijmy ten aplet w następujący sposób -

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "0" height = "0">
      <param name = "audio" value = "test.wav">
   </applet>
   <hr>
</html>

Możesz użyć test.wav na swoim komputerze, aby przetestować powyższy przykład.

Język Java obsługuje trzy typy komentarzy -

Sr.No. Komentarz i opis
1

/* text */

Kompilator ignoruje wszystko od / * do * /.

2

//text

Kompilator ignoruje wszystko od // do końca wiersza.

3

/** documentation */

This is a documentation comment and in general its called doc comment. The JDK javadoc tool uses doc comments when preparing automatically generated documentation.

This chapter is all about explaining Javadoc. We will see how we can make use of Javadoc to generate useful documentation for Java code.

What is Javadoc?

Javadoc is a tool which comes with JDK and it is used for generating Java code documentation in HTML format from Java source code, which requires documentation in a predefined format.

Following is a simple example where the lines inside /*….*/ are Java multi-line comments. Similarly, the line which preceeds // is Java single-line comment.

Example

/**
* The HelloWorld program implements an application that
* simply displays "Hello World!" to the standard output.
*
* @author  Zara Ali
* @version 1.0
* @since   2014-03-31 
*/
public class HelloWorld {

   public static void main(String[] args) {
      // Prints Hello, World! on standard output.
      System.out.println("Hello World!");
   }
}

You can include required HTML tags inside the description part. For instance, the following example makes use of <h1>....</h1> for heading and <p> has been used for creating paragraph break −

Example

/**
* <h1>Hello, World!</h1>
* The HelloWorld program implements an application that
* simply displays "Hello World!" to the standard output.
* <p>
* Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
* 
*
* @author  Zara Ali
* @version 1.0
* @since   2014-03-31 
*/
public class HelloWorld {

   public static void main(String[] args) {
      // Prints Hello, World! on standard output.
      System.out.println("Hello World!");
   }
}

The javadoc Tags

The javadoc tool recognizes the following tags −

Tag Description Syntax
@author Adds the author of a class. @author name-text
{@code} Displays text in code font without interpreting the text as HTML markup or nested javadoc tags. {@code text}
{@docRoot} Represents the relative path to the generated document's root directory from any generated page. {@docRoot}
@deprecated Adds a comment indicating that this API should no longer be used. @deprecated deprecatedtext
@exception Adds a Throws subheading to the generated documentation, with the classname and description text. @exception class-name description
{@inheritDoc} Inherits a comment from the nearest inheritable class or implementable interface. Inherits a comment from the immediate surperclass.
{@link} Inserts an in-line link with the visible text label that points to the documentation for the specified package, class, or member name of a referenced class. {@link package.class#member label}
{@linkplain} Identical to {@link}, except the link's label is displayed in plain text than code font. {@linkplain package.class#member label}
@param Adds a parameter with the specified parameter-name followed by the specified description to the "Parameters" section. @param parameter-name description
@return Adds a "Returns" section with the description text. @return description
@see Adds a "See Also" heading with a link or text entry that points to reference. @see reference
@serial Used in the doc comment for a default serializable field. @serial field-description | include | exclude
@serialData Documents the data written by the writeObject( ) or writeExternal( ) methods. @serialData data-description
@serialField Documents an ObjectStreamField component. @serialField field-name field-type field-description
@since Adds a "Since" heading with the specified since-text to the generated documentation. @since release
@throws The @throws and @exception tags are synonyms. @throws class-name description
{@value} When {@value} is used in the doc comment of a static field, it displays the value of that constant. {@value package.class#field}
@version Adds a "Version" subheading with the specified version-text to the generated docs when the -version option is used. @version version-text

Example

Following program uses few of the important tags available for documentation comments. You can make use of other tags based on your requirements.

The documentation about the AddNum class will be produced in HTML file AddNum.html but at the same time a master file with a name index.html will also be created.

import java.io.*;

/**
* <h1>Add Two Numbers!</h1>
* The AddNum program implements an application that
* simply adds two given integer numbers and Prints
* the output on the screen.
* <p>
* <b>Note:</b> Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
*
* @author  Zara Ali
* @version 1.0
* @since   2014-03-31
*/
public class AddNum {
   /**
   * This method is used to add two integers. This is
   * a the simplest form of a class method, just to
   * show the usage of various javadoc Tags.
   * @param numA This is the first paramter to addNum method
   * @param numB  This is the second parameter to addNum method
   * @return int This returns sum of numA and numB.
   */
   public int addNum(int numA, int numB) {
      return numA + numB;
   }

   /**
   * This is the main method which makes use of addNum method.
   * @param args Unused.
   * @return Nothing.
   * @exception IOException On input error.
   * @see IOException
   */

   public static void main(String args[]) throws IOException {
      AddNum obj = new AddNum();
      int sum = obj.addNum(10, 20);

      System.out.println("Sum of 10 and 20 is :" + sum);
   }
}

Now, process the above AddNum.java file using javadoc utility as follows −

$ javadoc AddNum.java
Loading source file AddNum.java...
Constructing Javadoc information...
Standard Doclet version 1.7.0_51
Building tree for all the packages and classes...
Generating /AddNum.html...
AddNum.java:36: warning - @return tag cannot be used in method with void return type.
Generating /package-frame.html...
Generating /package-summary.html...
Generating /package-tree.html...
Generating /constant-values.html...
Building index for all the packages and classes...
Generating /overview-tree.html...
Generating /index-all.html...
Generating /deprecated-list.html...
Building index for all classes...
Generating /allclasses-frame.html...
Generating /allclasses-noframe.html...
Generating /index.html...
Generating /help-doc.html...
1 warning
$

You can check all the generated documentation here − AddNum. If you are using JDK 1.7 then javadoc does not generate a great stylesheet.css, so we suggest to download and use standard stylesheet from https://docs.oracle.com/javase/7/docs/api/stylesheet.css