Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

11.2. Поля объектов

Поле "поле" – это член объявления класса, представляющий переменные,

связанные с классом или его объектом. Поля классов или статические поля

"поле:статическое поле"

мы уже рассмотрели. Сосредоточимся на особенностях

нестатических полей

"поле:нестатическое поле" , т.е. полей объектов. Как уже

сказан, объявление поля

"поле:объявление поля"

вводит одну или несколько

переменных одного типа. Его формат:

модификаторы_поляopt

тип_поля объявление_переменных;

Обратите внимание, что обязательными элементами объявления поля

являются его тип и объявление переменных.

Тип_поля "поле:тип_поля" определяет тип вводимых этим полем переменных.

Объявление_переменных

это

либо

одно

объявление,

либо

список

объявлений, разделенных запятыми. Каждое объявление имеет один из следующих

двух форматов:

идентификатор

идентификатор = инициализатор_переменной

В свою очередь инициализатор переменной

"переменная:инициализатор

переменной"

может быть либо выражением, в том числе и выражением,

содержащим обращение к конструктору объектов, либо инициализатором массива.

Инициализация переменных нестатических полей выполняется при создании

объекта класса. Если в объявлении переменной инициализатор отсутствует, то

переменная инициализируется по умолчанию значением, соответствующим ее типу.

В определении поля могут присутствовать в допустимых сочетаниях

несколько модификаторов, которые в этом случае отделяются друг от друга

пробелами. Мы уже использовали поля с модификатором static.

Кроме модификатора static уже рассмотрены модификаторы, определяющие

доступность членов класса вне объявления класса (public – открытый, protected

защищенный, private – закрытый, internal – внутренний). Статус закрытого доступ

а

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

отсутствует.

Как и для статических полей для полей объектов могут применяться

модификаторы: readonly – только для чтения; volatile – подвержен внешним

воздействиям; new – применяется при наследовании (см. главу 13).

Некоторый опыт применения библиотечных классов у нас уже имеется,

поэтому следующий пример мини-программы с двумя классами, которые определил

программист, не вызовет затруднений.

// 11_01.cs - поля объектов и класса

using System;

class Person {

public static int year = 2009; // текущий год

public int age; // возраст

public string name; // имя

}

class Program {

static void Main() {

Person who; // ссылка на объект класса

who = new Person(); // объект класса

who.name = "Юджин";// имя

who.age = 19; // возраст

Console.WriteLine("Имя: {0}, Год рождения: {1}",

who.name, Person.year - who.age);

}

}

Результат выполнения программы:

Имя: Юджин, Год рождения: 1990

Класс Person включает одно статическое поле year (сегодняшний год) и два

поля объектов age (возраст) и name (имя). В методе Main( ) класса Program создана

ссылка с именем who типа Person и связанный с ней объект. Так как поля класса

Person открытые, то ссылка who даёт возможность присваивать полям объекта

значения и получать их.

Важной особенностью (значение которой в дальнейшем будет показано,

например, при создании связных списков, см. §11.5) является возможность объявить

в классе поле, имеющее тип ссылки на объекты того же класса. Класс с таким

полем приведён в следующей программе:

// 11_02.cs - ссылка с типом класса как поле объекта

using System;

class A

{

public int a = 2;

public int b = 3;

public A memb; // ссылка на объект класса А

}

class Program

{

static void Main()

{

A one = new A();

one.a = 12;

one.b = one.a / one.b;

Console.WriteLine("one.a={0}", one.a);

Console.WriteLine("one.b={0}", one.b);

A two = new A();

two.memb = one;

Console.WriteLine("two.memb.a={0}", two.memb.a);

Console.WriteLine("two.memb.b={0}", two.memb.b);

}

}

Результат выполнения программы:

one.a=12

one.b=4

two.memb.a=12

two.memb.b=4

В классе А декларировано и по умолчанию инициализировано значением null

поле memb – ссылка типа A. В методе Main( ) определены две ссылки на объекты

класса А и ассоциированные с ними объекты. Полям one.a и one.b явно присвоены

значения. Полю two.memb присвоено значение ссылки one и тем самым поле

two.memb "настроено" на объект, адресуемый ссылкой one. Квалифицированные

имена two.memb.a и two.memb.b позволяют получить полный доступ к полям one.a и

one.b. Это подтверждают результаты выполнения программы.

Ссылка на объект класса может быть объявлена как статическое поле этого

же класса. Следующая программа иллюстрирует эту возможность.

// 11_03.cs - статическое поле с типом класса

using System;

class A

{

public int a = 2;

public int b = 3;

static public A smemb; // ссылка на объект класса А

}

class Program

{

static void Main()

{

A two = new A();

A.smemb = two;

Console.WriteLine("A.smemb.a={0}", A.smemb.a);

Console.WriteLine("A.smemb.b={0}", A.smemb.b);

}

}

Результат выполнения программы:

A.smemb.a=2

A.smemb.b=3

Программа очень похожа на предыдущую – отличие заключается в том, что

поле

s m e m b

статическое ,

поэтому

для

обращений

используются

квалифицированные имена с префиксом "А.".

Соседние файлы в папке CSBasicCourse2ndedPodbelsky