учебники, программирование, основы, введение в,

 

Java: члены класса, статические переменные и методы

Объявление переменных и методов класса
Объявление переменных
В языке Java при объявлении переменной - указании ее типа и имени - одновременно можно выполнить ее инициализацию.
Для переменной могут быть указаны следующие модификаторы доступа:

  • public или protected, или private, - определяющие область видимости переменной;
  • static - указывает, что переменная является переменной класса, а не переменной экземпляра класса;
  • final - запрещает присвоение значений переменной вне тела класса, в котором она объявлена;
  • transient - указывает, что переменная не является частью постоянного состояния объекта;
  • volatile - определяет возможность асинхронного изменения переменной.

Переменная, не имеющая модификатора static, называется переменной экземпляра. Переменная экземпляра создается для каждого нового экземпляра класса.
Переменная, имеющая модификатор static, называется переменной класса. Для всех экземпляров класса существует только одна переменная класса. Эта переменная доступна и до создания экземпляра класса.
Переменная, имеющая модификатор final, должна быть инициализирована внутри тела класса, так как вне тела класса final-переменная является константой и ее изменение или инициализация запрещены.
Модификатор transient нельзя использовать совместно с модификаторами final или static.
Любая переменная может иметь модификатор доступа public (общедоступный), protected (защищенный) или private (скрытый).
Для этих модификаторов определены следующие правила доступа:

  • public указывает, что данная переменная будет доступна везде, где доступен класс, в котором она объявлена;
  • protected указывает, что данная переменная будет доступна как внутри пакета, содержащего объявление класса, в котором она определена, так и внутри любого подкласса данного класса;
  • private указывает, что данная переменная не будет доступна нигде кроме тела класса, в котором она объявлена.

По умолчанию переменная считается доступной везде внутри пакета, содержащего класс, в котором она объявлена, и не недоступна ни в каком другом подклассе указанного класса в том случае, если подкласс содержится в другом пакете.
Инициализация переменной означает присвоение этой переменной некоторого значения. В качестве значения инициализации могут выступать:

  • выражение;
  • массив, указываемый в фигурных скобках.

Если переменная объявлена с модификатором static, то инициализация выполнятся сразу при загрузке класса.
Если объявляемая переменная является переменной экземпляра, то инициализация выполняется при выполнении метода-конструктора класса.
Если объявляемая переменная является локальной переменной, то ее инициализация происходит при выполнении оператора объявления этой переменной.
Например:
int i1,i2;
float f1 = 3.0;
float dArray1 [] = new float [14];
java.lang.String str1 = "no?iea";
Object oObj = str1 ;
Exception e = new Exception ( ) ;

http://localhost:3232/img/empty.gifОпределение методов

В языке Java определение метода включает его объявление и реализацию. Определение метода всегда указывается в теле класса.
Метод может иметь модификаторы доступа, возвращать значение и получать параметры.
Метод может иметь следующие модификаторы:

  • public, protected или private -модификаторы доступа;
  • static - модификатор метода класса.
  • abstract, final, native или synchronized.

Для модификаторов доступа метода определены следующие правила:

  • public указывает, что данный метод будет доступен везде, где доступен класс, в котором он определен;
  • protected указывает, что данный метод будет доступен как внутри пакета, содержащего объявление класса, в котором он определен, так и внутри любого подкласса данного класса;
  • private указывает, что данный метод не будет доступен нигде кроме тела класса, в котором он определен.

По умолчанию метод считается доступным везде внутри пакета, содержащего класс, в котором он определен, и недоступным ни в каком другом подклассе указанного класса в том случае, если подкласс содержится в другом пакете.
Метод, не имеющий модификатора static, называется методом экземпляра. Метод экземпляра может быть вызван только для созданного экземпляра класса или подкласса. Такой метод нельзя вызывать непосредственно, квалифицируя его именем класса.
Метод, объявленный с модификатором static, называется статическим методом (или методом класса) и может быть вызван без создания экземпляра класса. Этот метод всегда вызывается непосредственно из класса. Статический метод имеет доступ к другим статическим переменным и методам данного класса.
Если статический метод определен как final-метод, то он не может быть переопределен.
Например:
// Файл A.java
package classa;
public class A  implements B {
public A() {  }
static int b=1;
public int Metod1(){return a;}
public static int Metod2(){
return 0;}  //Статический метод
}
interface B {
final public static int a=1; 
// Статическая переменная
int Metod1();
}

// Файл C.java
package classa;
public class C extends A {
public C() {  }
static int b=3;
public int Metod1(){return a;}
public static int Metod2(){return 77;}
public static void main(String[] args) {
System.out.println(A.Metod2());
System.out.println(C.Metod2());
}
}
При переопределении методов их модификаторы доступа должны совпадать. Так, нельзя переопределить метод, имеющий модификатор доступа public, методом с модификатором доступа private.
Абстрактный метод указывается модификатором abstract. Такой метод никогда не имеет тела метода: вместо фигурных скобок, ограничивающих тело метода, объявление метода завершается точкой с запятой.
Абстрактные методы можно объявлять только в абстрактных классах или интерфейсах. Объявление абстрактного метода в классе, не имеющем модификатора abstract, приводит к ошибке компиляции. Любой подкласс абстрактного класса, который сам не является абстрактным классом, должен определять реализацию всех наследуемых не реализованных абстрактных методов.
Например:
public class A extends AA  implements B {
public A() {  }
public int Metod1(){return 0;}
public static int Metod2(){return 0;}
int Metod3(){return 0;}
public int Metod4(){return 0;}
}
interface B {
int Metod1();
abstract  int Metod4();
}
abstract class AA{
abstract  int Metod3();
}
Методы, объявленные с модификатором private, не могут быть абстрактными методами, так как они недоступны вне тела класса. Статические методы также не могут выступать в качестве абстрактных методов, так как считаются конечными и не могут быть переопределены.
Объявление метода с модификатором final запрещает его последующее переопределение. Такие методы называются конечными методами, и по умолчанию считается, что private-метод всегда является конечным методом.
Методы, объявленные с модификатором native, могут иметь реализацию на другом языке программирования. Эти методы используются для написания машинно-зависимого кода. native-методы в Java-программе не имеют тела метода.
Synchronized-методы выполняются с блокировкой:

  • для метода класса выполняется блокировка класса,
  • для метода экземпляра - блокировка объекта.

Это позволяет предотвратить параллельный доступ к данным из различных потоков в многопоточном приложении.
Метод может возвращать значение заданного типа. В этом случае:

  • перед именем метода указывается тип возвращаемого значения;
  • в теле метода присутствует оператор return, определяющий возвращаемое значение.

Если метод не имеет возвращаемого значения, то он должен быть объявлен с ключевым словом void, указывающим на отсутствие возвращаемого значения.
Если в качестве возвращаемого значения должен быть использован массив, то после имени метода может быть указана пара квадратных скобок или список параметров и пара квадратных скобок.

http://localhost:3232/img/empty.gifПередача параметров

Список формальных параметров содержит упорядоченные и разделенные запятой описания параметров (тип параметра и идентификатор параметра). Если метод не имеет параметров, передаваемых ему при вызове, то после имени метода указывается пара пустых скобок.
В языке Java все параметры передаются по значению. При передаче параметра ссылочного типа его значением является ссылка на объект, поэтому в метод передается ссылка на экземпляр класса.
Параметры в языке Java рассматриваются как локальные переменные метода, специфицированные вне тела метода. При вызове метода перед его выполнением происходит вычисление выражений, представляющих фактические передаваемые методу параметры, и присвоение вычисленных значений соответствующим локальным переменным (формальным параметрам).
Ссылка на текущий объект
При вызове метода экземпляра ключевое слово this

  • указывает ссылку на текущий объект. Это может быть использовано для передачи самого объекта в качестве аргумента методу самого экземпляра класса;
  • используется для указания квалифицированной ссылки на поля (переменные и методы) экземпляра класса.

Ключевое слово super используется для указания квалифицированной ссылки на поля (переменные и методы) суперкласса.
По умолчанию любой метод первоначально ссылается на свои собственные переменные и методы и только в случае их отсутствия выполняется поиск этих полей вверх по иерархии суперклассов. При этом, если метод не переопределяется, то его имя не обязательно квалифицировать.
Например:
class A {
public int a;
}
class B extends A {
public  int a, b;
public void Metod1 ( ) {
b=a;         // Ссылка на this.a
b=super.a;           
}
}
Имя суперкласса может быть использовано для квалифицированного доступа к статическим переменным или методам.
Переопределение метода
Переопределением метода называется объявление в подклассе метода, у которого имя, тип и список параметров, в точности совпадают с соответствующими атрибутами метода, ранее объявленного в суперклассе.
При переопределении метода использование модификаторов доступа должно удовлетворять следующим условиям:

  • если переопределяемый метод суперкласса не содержит ни одного из модификаторов доступа public, protected или private, то переопределяющий метод не должен иметь модификатора private.
  • если переопределяемый метод суперкласса имеет модификатор доступа protected, то переопределяющий метод должен иметь модификатор доступа public или protected.
  • если переопределяемый метод суперкласса имеет модификатор доступа public, то переопределяющий метод должен также иметь модификатор доступа public.

Тип возвращаемого значения переопределяющего метода должен совпадать или преобразовываться присвоением к типу возвращаемого значения переопределяемого метода.
Если класс содержит переопределяющий метод, то переопределенный метод можно вызвать только с квалификацией ссылки ключевым словом super или именем суперкласса (для статических членов).
Например:
class A  {
public void Metod1() { }
public static void Metod2() { }

 }
class B extends A {
public Metod1() {    } 
...
Metod1();       // Вызов метода из класса B
super.Metod1(); // Вызов метода из класса A
A.Metod2();
}
Перегружаемые методы
Перегружаемыми методами называется группа методов с одинаковым именем, но различными списками параметров. Язык Java позволяет определять в классах перегружаемые методы.

http://localhost:3232/img/empty.gifКонструкторы

Конструктором называется метод, вызываемый для инициализации объекта при его создании.
Имя конструктора всегда совпадает с именем класса. Конструктор не может использовать оператор return и для него не указывается никакого типа возвращаемого значения. При объявлении конструктора можно указать модификаторы доступа public, protected или private.
Наличие явно описанного конструктора в классе не является обязательным. В этом случае при создании объекта используется конструктор по умолчанию. Такой конструктор не получает параметров и вызывает непосредственно конструктор суперкласса: super().
При этом, если суперкласс не имеет конструктора без списка параметров, то происходит ошибка компиляции.
Конструкторы не наследуются подклассами.
Тело конструктора заключается в фигурные скобки.
При этом первыми операторами должны быть указаны, если они используются, операторы вызова конструкторов данного класса или суперкласса.
Конструктор может иметь следующее формальное описание:
ИмяКласса (СписокПараметров)  { 
ВызовКонструкторов 
БлокОператоров 
}
Вызов конструкторов выполняется операторами this и super с указанием в скобках списка параметров.
Например:
public class C extends A {
public C() {this(1,20);  } 
// Вызов конструктора данного класса
public C(int i, int j) { }
}
Вызов конструкторов подчиняется следующим правилам:

  • при создании объекта любого заданного класса будет неявно выполнена цепочка вызовов всех конструкторов его суперклассов;
  • первым будет выполнено тело конструктора для Object;
  • каждый последующий конструктор в цепочке будет выполняться только после выполнения конструктора своего непосредственного суперкласса;
  • при создании объекта будут инициализированы все переменные экземпляра.

Создание объекта
При создании объекта последовательно выполняются следующие действия: вызывается конструктор, создается новый объект указанного типа, и все переменные экземпляра инициализируются своими значениями по умолчанию, затем формируется ссылка на созданный и инициализированный объект. Эта ссылка и является значением выражения, создающего объект.
Объект может быть создан вызовом метода newInstance. В этом случае используется конструктор без списка параметров.
Статические переменные
Для каждого класса создается только один экземпляр статической переменной (переменой класса).
При описании статических переменных должны быть выполнены следующие правила:

  • статические переменные должны быть объявлены вне всякого метода;
  • статические переменные могут быть инициализированы при их объявлении или блоком кода, отмеченного ключевым словом static, и также расположенным вне метода.

Инициализация статических переменных выполняется при загрузке класса. Инициализация переменных выполняется в порядке их следования в объявлении класса.
Например:
public class C {
public C() {  }
static int b=3;
static int c;
static  { b++; c = 10; } 
// Инициализация статической переменной
}
При инициализации статических переменных можно вызывать статические методы.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика