Funkcje Ogólna postać definicji funkcji



Pobieranie 180,38 Kb.
Strona1/4
Data18.03.2018
Rozmiar180,38 Kb.
  1   2   3   4

18-03-18 Java

  1. Funkcje




    1. Ogólna postać definicji funkcji

Funkcje to opisy czynności do wykonania. Generalnie, z punktu widzenia programu, funkcja jest definicją swego rodzaju instrukcji która na podstawie danych wejściowych (argumentów) dostarcza w miejscu jej użycia (wywołania) wartość określonego typu.


Definicja funkcji składa się z nagłówka i ciała (czyli treści funkcji, podanej jako sekwencja deklaracji i instrukcji do wykonania).
Nagłówek określa zewnętrzne własności funkcji:


  • ogólne własności funkcji wyrażone poprzez modyfikatory określające

    • dostępność (public, private, protected); jeśli nie ma żadnego z tych modyfikatorów to oznacza to dostępność pakietową

    • rodzaj funkcji: klasowa (statyczna, modyfikator static) lub obiektowa (niestatyczna, bez modyfikatora static): od rodzaju funkcji zależy sposób jej wywoływania

    • inne cechy funkcji (modyfikatory final, abstract, native, strictfp, synchronized)

  • typ dostarczanej w miejscu wywołania wartości (np. double, JButton, void); void oznacza, że w miejscu wywołania nie będzie w ogóle dostarczana żadna wartość, czyli że funkcja jest bezrezultatowa

  • nazwę funkcji

  • liczbę i typy parametrów (danych „wejściowych”)

  • typy wyjątków sprawdzanych, jakie mogą zostać wysłane podczas wykonywania kodu funkcji i które nie są wewnątrz tej funkcji obsłużone

Ciało funkcji określa czynności do wykonania przez funkcję: musi być ujęte w nawiasy klamrowe nawet jeśli ciało funkcji jest puste (wyjątkiem są funkcje abstrakcyjne, które w ogóle nie mają ciała – mówimy wtedy o deklaracji funkcji a nie definicji).


Tak więc ogólna postać definicji funkcji nieabstrakcyjnej (tylko takimi na razie będziemy się zajmować) ma postać
modyfikatory typ nazwa lista_parametrów wyjątki ciało
gdzie modyfikatory i wyjątki są opcjonalne, a dla konstruktorów nie występuje typ.


  • modyfikatory to lista modyfikatorów oddzielonych spacjami (dowolną ilością „białych znaków”), np.

    public static


    protected strictfp
    public final



  • typ to nazwa typu dostarczanej przez funkcję wartości. Wartość dostarczana przez funkcję rezultatową jest zawsze typu prostego, a więc może to być wartość typu pierwotnego (int, boolean, itd.) albo odnośnikowego gdy wartością dostarczaną jest odniesienie do obiektu (ale nie może to być sam obiekt, co byłoby możliwe np. w C/C++). Jeśli funkcja jest bezrezultatowa, tzn. nie dostarcza żadnej wartości, to jej typ określa się jako void. Przykłady:

    double
    JButton


    String[ ]
    void

    Typu (żadnego, nawet void) nie podaje się dla konstruktorów





  • nazwa jest identyfikatorem spełniającym wymagania dotyczące nazw o których mówiliśmy w jednym z poprzednich wykładów



  • lista_parametrów jest ujętą w nawiasy okrągłe listą oddzielonych przecinkami specyfikatorów parametrów funkcji (tzw. parametrów formalnych). Każdy specyfikator składa się z nazwy typu parametru i, po spacji, nazwy samego parametru. Nazwy wszystkich parametrów formalnych danej funkcji muszą być różne. Przed nazwą typu może, opcjonalnie, wystąpić modyfikator final. Oznacza on, że przekazana do tego parametru wartość nie będzie wewnątrz funkcji zmieniana.

    Funkcja może nie mieć żadnych parametrów – para nawiasów okrągłych jest jednak wymagana nawet w takim przypadku. Przykłady:

    ( )
    (double x, double y)
    (final boolean b, String[ ] args)



  • fraza wyjątki ma postać

    throws lista_klas

    gdzie lista_klas jest listą oddzielonych przecinkami nazw typów nieobsłużonych sprawdzanych wyjątków jakie dana funkcja może wysłać, np.

    throws java.io.IOException

    Jeśli fraza wyjątki jest opuszczona to funkcja nie może wysyłać żadnych sprawdzanych wyjątków



  • ciało jest sekwencją instrukcji – być może pustą – ujętą w nawiasy klamrowe. Ciało nie występuje tylko dla funkcji abstrakcyjnych (np. w definicji interfejsów). W ciele funkcji mogą występować również instrukcje deklaracyjne.

    Jeśli funkcja jest rezultatowa, to musi zawierać przynajmniej instrukcję return zwracającą wartość odpowiedniego typu (przypisywalnego do typu typ). Jeśli jest bezrezultatowa, to instrukcja return może (choć nie musi) w niej występować – jeśli występuje to nie może zawierać żadnego wyrażenia którego wartość miałaby być zwrócona. Dla funkcji bezrezultatowych domniemywa się instrukcję return tuż przed nawiasem kończącym definicję ciała.

    Ciało funkcji może być traktowane jak wnętrze instrukcji grupującej do której należą też deklaracje zmiennych lokalnych opisane przez specyfikacje parametrów. Zatem zmienne deklarowane w ciele funkcji będą w czasie jej wykonywania lokalne – po wykonaniu funkcji funkcji są one usuwane. Zmiennymi lokalnymi są więc również zmienne wyspecyfikowane jako parametry formalne funkcji: będą one zainicjowane wartościami argumentów wywołania, a po zakończeniu wykonywania funkcji – usunięte.

    Zmienne lokalne funkcji (w tym te deklarowane przez specyfikacje parametrów) w żaden sposób nie kolidują ze zmiennymi o tej samej nazwie w innych funkcjach danej klasy. Mogą natomiast przesłaniać nazwy zmiennych obiektowych lub klasowych. Jeśli tak jest, to niekwalifikowana nazwa występująca w ciele funkcji odnosi się do zmiennej lokalnej, natomiast dostęp do zmiennej obiektowej o tej nazwie, dla metod, zapewnia kwalifikowanie nazwy odnośnikiem this. Jeśli nazwa przesłania zmienną klasową (statyczną) to dostęp do tej zmiennej klasowej zapewnia kwalifikowanie jej nazwy nazwą klasy.





Przykład na przesłanianie zmiennych:


public class Hiding {
String ns = "Nonstatic element";

static String st = "Static element";


public static void main(String[ ] args)

{

new Hiding( );



}
Hiding( )

{

fun("zmienna ns", "zmienna st");



}
private void fun(String a, String st)

{

String ns = a;



pr(" ns = " + ns);

pr(" This.ns = " + this.ns);

pr(" st = " + st);

pr("Hiding.st = " + Hiding.st);

}

void pr(String s)



{

System.out.println(s);

}

}

Definicje funkcji muszą być zawarte w definicji klasy (nie ma, znanych z C/C++, funkcji globalnych). Nie wolno definicji funkcji zagnieżdżać, to znaczy nie można w ciele jednej funkcji definiować innej funkcji.


Funkcje dzielimy na metody (funkcje niestatyczne, zadeklarowane bez modyfikatora static) i sposoby (funkcje statyczne, zadeklarowane z modyfikatorem static). Szczególnym rodzajem funkcji są konstruktory.



  1   2   3   4


©operacji.org 2017
wyślij wiadomość

    Strona główna