Параметры типа класса (ссылки).
1.В переменной типа класса хранится не объект этого класса, а адрес области(ссылка – reference) памяти, в которой расположен объект
2.Все типы классов являются ссылочными типами, но существуют ссылочные типы, которые не являются типами классов (массивы)
--Формальные параметры типа класса обрабатываются на основе другого механизма замены (call by reference).
--Формальный параметр типа класса –
локальная переменная , в которой хранится адрес объекта этого класса.
--При обращении к методу параметр инициализируется адресом соответствующего фактического параметра, задаваемого в вызове метода,т.е.Формальный параметр служит в качестве альтернативного имени для объекта, заданного аргументом в вызове метода
Следствие:
Метод способен менять значения переменных реализации аргумента, имеющего тип класса.
Example.
Class Point { // описание класса
public double x,y;
public double distance (Point that) {
double xdiff, ydiff;
xdiff = x-that.x;
ydiff = y – that.y;
return Math.sqrt(xdif^2 + ydiff^2);}}
Class MyClass {
public static void main …{
Point lowerLeft = new Point ( );
Point upperRight = new Point ( );
lowerLeft.x = 0.0;
lowerLeft.y = 0.0;
upperRight.x = 1280.0;
upperRight.y = 1024.0;
double dist = lowerLeft.distance(upperRight);
....} }
Параметр this.
При определении метода в качестве имени вызывающего объекта можно использоваться ссылка на текущий объект (имя вызывающего объекта) - this.
Оно будет заменено именем объекта, вызывающего метод: (для класса Point)
public void move(double x, double y){
this.x = х;//имена параметров скрывают
this.y = y;//имена полей}
--this чаще всего используется для передачи ссылки на текущий объект в качестве параметра для других методов. Предположим в методе необходимо пополнить список объектов, ожидающих обслуживания. Service.add(this);
--this неявно добавляется в начало каждой ссылки на поле или метод, если программист не указал ссылку на другой объект. Пример: class Name{
Public String str;
Name(){
str= “ ”;}}равносильно следующему: this.str=“ ” ;
Акцессоры и мутаторы
Методы класса могут быть объявлены с использованием модификатора private
В таком случае их нельзя вызывать за пределами определения класса, но можно вызывать в любом методе того же класса.
Обычно все переменные реализации используются с модификатором private
Для доступа к таким переменным за пределами класса должны быть использованы специальные public методы:
-Аксессорный метод для чтения
(accessor method) – get…
-Мутаторный метод для записи (mutator method) – set…
т.е. сам программист планирует и управляет доступом к закрытым переменным
Пример
public class MyClass{
private String name; //Определение //переменных реализации
private int age;
private String address;
// мутатор
public void setNewFields (String newName,
int newAge, String newAddress){
name = newName;
if (newAge >0)
age = newAge;
else {System.out.printin("ОШИБКА:
использование отрицательного
возраста”);
System.exit(0); }
address = newAddress;}
// аксессоры
public String getName ( ) {
return name; }
public int getAge( ) {
return age; }
public String getAddress( ) {
return address;}}
Обращение к методам:
public class DemoClass {
…public static void main …{
MyClass cl1= new MyClass ( );
сl1.setNewFields (“A.Шварценеггер’’, 50,
“Los Angeles,California”);
…
System.out.println (cl1.getName (),cl1.getAge(),
cl1.getAddress() );
…}
Статические методы
-Иногда возникает потребность в методе, которому не нужно задавать какой-нибудь объект. Например, все математические методы не нуждаются в объектах. В таких случаях можно определить метод как статический (static).
Статический метод определяется в классе, поэтому он является членом класса, но его можно вызвать, не используя никакого объекта. В вызове статического метода вместо использования имени объекта обычно используется имя класса, в котором этот метод определен.
Статические методы иногда называются методами класса (class methods), они вызываются для целого класса, а не для каждого конкретного объекта, созданного на его основе.
Example.
/*Класс, содержащий статические методы для выполнения вычислений, связанных с окружностями.*/
public class CircleFirstTry {
public static final double PI = 3.14159;
public static double area (double radius){
return (PI*radius*radius) ; }
public static double circumference(double
radius){
return (PI*(radius + radius)); }}
public class CircleDemo{
public static void main(String[] args){
double radius;
System.out.println ("Введите радиус
круга в cм:");
radius =System.In.readLineDouble();
System.out.println ("Круг радиусом "
+ radius + " см");
System.out.println ("имеет площадь " +
CircleFirstTry.area(radius) +
" квадратных см");
System.out.println ("и длину окружности"
+
CircleFirstTry.circumference(radius)
+ " см.") }}