Передача параметров на java

Исходный текст

Ответ 6,00000

На java вызов методов точно такой же.

import java.lang.Math. *;

public class Treug

{

private double P()

{

return a+b+c;

}

private double a,b,c;

public void Init(double aa, double bb, double cc)

{

a=aa;

b=bb;

c=cc;

}

public double S()

{

double p,s;

p=P()/2;

s=Math. sqrt (p*(p-a)*(p-b)*(p-c));

return s;

}

public static void main (String args[])

{

Treug Z = new Treug();

double y;

Z.Init(3,4,5);

y=Z.S();

System. out. printf("ответ %f",y);

y=Z.P(); // нетошибки, хотя private

}

}

вывод на консоли:

4) Константы на C++ и Java

В Си константы определялись:

#define MaxTime 80

int main(int argc, char* argv[])

{

Record a[MaxTime];

.......

}

В C++ можно использовать:

const MaxTime=80;

.......

int main(int argc, char* argv[])

{

Record a[MaxTime];

.......

}

На java константа записывается:

final static MaxTime=80;

.......

Record b[] = new Record[MaxTime];

5) Передача параметров методов на C++ и Java и перегрузка функций

Вариант метода Numbersec класса Record результат получается через параметр.

class Record

{

public:

void Init(int m,int s);

int Numbersec();

private:

int min;

int sec;

};

void Record::Init(int m,int s)

{

min=m;

sec=s;

}

int Record::Numbersec()

{

return min*60+sec;

}

int main(int argc, char* argv[])

{

Record a;

int k;

a.Init(2,20);

k=a.Numbersec(); // k=2*60+20=140

return 0;

}

Вариант Numbersec с параметром (пример с ошибкой!!)

public:

void Init(int m,int s);

void Numbersec(int Rez); // в Rez – результат вычисления числа секунд

int Record::Numbersec(int Rez)

{

Rez=min*60+sec;

return;

}

int main(int argc, char* argv[])

{

Record a;

int k;

a.Init(2,20);

k=5;

a.Numbersec(k); // ошибка!! ожидалось k=140, но k=5!!

return 0;

}

В Си и C++ параметр передается по значению, значение не возвращается.

Исправление на Си (работает и на С++)

public:

void Init(int m,int s);

void Numbersec(int *Rez); // параметр – указатель

int Record::Numbersec(int *Rez)

{

*Rez=min*60+sec;

return;

}

int main(int argc, char* argv[])

{

Record a;

int k;

a.Init(2,20);

k=5;

a.Numbersec(&k); // правильно k=140 передача адреса

return 0;

}

На С++ можно использовать более удобный параметр – ссылку.

public:

void Init(int m,int s);

void Numbersec(int &Rez); // параметр – указатель

int Record::Numbersec(int &Rez)

{

Rez=min*60+sec;

return;

}

int main(int argc, char* argv[])

{

Record a;

int k;

a.Init(2,20);

k=5;

a.Numbersec(k); // правильно k=140 обычная передача

return 0;

}

Ссылка - аналог var в списке параметров Паскаля.

Примитивные типы (int, double) передаются только по значению и не возвращают изменение значений

public class Record

{

private int min;

private int sec;

public void Numbersec(int k)

{

k=min*60+sec; // здесьk=124

return;

}

public void Init(int m, int s)

{

min=m;

sec=s;

}

public static void main (String args[])

{

Record a;

int k;

a= new Record();

a.Init(2, 4);

k=5;

a.Numbersec(k);

System. out. printf("ответ %d", k); // k=5 не изменился

}

}

ответ 5

Параметры – объекты передаются по ссылке, при изменении после выхода, меняется значение фактического параметра

class Rezult // вспомогательный класс

{

public int param; // поле для возврата результата

}

public class Record

{

private int min;

private int sec;

public void Numbersec(Rezult k) // аргумент - объект

{

k.param=min*60+sec;

return;

}

public void Init(int m, int s)

{

min=m;

sec=s;

}

public static void main (String args[])

{

Record a;

Rezult c= new Rezult();

a= new Record();

a.Init(2, 4);

c.param=6; //

a.Numbersec(c);

System. out. printf("ответ %d", c.param); // 124 у c param изменился

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: