Опубликован: 18.09.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 11:

Основные конструкции языков Java и C# (продолжение)

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

public class A
{
  static 
  { 
    System.out.println
      ("Static initializer of A"); 
  }
  
  { 
    System.out.println
      ("Initializer of A"); 
  }
  
  static int sinit()
  {
    System.out.println
    ("Static field initializer of A");
    return 0;
  }
  
  static int init()
  {
    System.out.println
      ("Field initializer of A");
    return 0;
  }
  
  static int sf = sinit();
  int f = init();
  
  public A()
  {
    System.out.println
      ("Constructor of A");
  }
}

public class B extends A
{
  static int sf = sinit();
  int f = init();
  
  static 
  { 
    System.out.println
      ("Static initializer of B"); 
  }
  
  { 
    System.out.println
      ("Initializer of B"); 
  }
  
  static int sinit()
  {
    System.out.println
    ("Static field initializer of B");
    return 0;
  }
  
  static int init()
  {
    System.out.println
      ("Field initializer of B");
    return 0;
  }
  
  public B()
  {
    System.out.println
      ("Constructor of B");
  }
}

public class C
{
  public static void main(String[] args)
  {
    B b = new B();
  }
}
using System;

public class A
{
  static A()
  { 
    Console.WriteLine
      ("Static constructor of A"); 
  }
  
  static int sinit()
  {
    Console.WriteLine
    ("Static field initializer of A");
    return 0;
  }
  
  static int init()
  {
    Console.WriteLine
      ("Field initializer of A");
    return 0;
  }
  
  static int sf = sinit();
  int f = init();
  
  public A()
  {
    Console.WriteLine
      ("Constructor of A");
  }
}

public class B : A
{
  static int sf = sinit();
  int f = init();
  
  static B()
  { 
    Console.WriteLine
      ("Static constructor of B"); 
  }
   
  static int sinit()
  {
    Console.WriteLine
    ("Static field initializer of B");
    return 0;
  }
  
  static int init()
  {
    Console.WriteLine
      ("Field initializer of B");
    return 0;
  }
  
  public B()
  {
    Console.WriteLine
      ("Constructor of B");
  }
}

public class C
{
  public static void Main()
  {
    B b = new B();
  }
}

Результат работы приведенного примера такой.

Static initializer of A
Static field initializer of A
Static field initializer of B
Static initializer of B
Initializer of A
Field initializer of A
Constructor of A
Field initializer of B
Initializer of B
Constructor of B

Результат работы приведенного примера такой.

Static field initializer of B
Static constructor of B
Field initializer of B
Static field initializer of A
Static constructor of A
Field initializer of A
Constructor of A
Constructor of B

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

Именно пакетная доступность используется в Java по умолчанию.

protected элементы в Java также доступны из типов того пакета, в котором находится содержащий эти элементы тип, т.е. protected -доступность шире пакетной.

Типы, не вложенные в другие, могут быть либо public (должно быть не более одного такого типа в файле), либо иметь пакетную доступность.

В C# доступность элемента типа по умолчанию — private.

Имеется дополнительный модификатор доступности — internal. Элемент, имеющий такую доступность, может быть использован всюду в рамках того же файла, где находится определение этого элемента.

Кроме того, в C# можно использовать комбинированный модификатор protected internal для указания того, что к данному элементу имеют доступ как наследники содержащего его типа, так и типы в рамках содержащего его файла.

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

В C# все элементы типов могут быть помечены модификатором new для точного указания на то, что такой элемент — новый и никак не соотносится с элементами предков данного типа с тем же именем или той же сигнатурой.

В Java для полей классов дополнительно к модификаторам доступности и контекста могут использоваться модификаторы final, transient и volatile.

Поля классов или структурных типов в C# могут иметь в качестве дополнительных модификаторов readonly и volatile.

Модификатор final обозначает, что такое поле не может быть изменено во время работы, но сначала должно быть инициализировано: статическое — в одном из статических инициализаторов, нестатическое — к концу работы каждого из конструкторов. В инициализаторах или конструкторах такое поле может модифицироваться несколько раз.

Модификатор final у локальных переменных и параметров методов может использоваться примерно в том же значении — невозможность модификации их значений после инициализации.

Модификатор readonly по своему значению аналогичен модификатору final в Java. readonly поля должны инициализироваться к концу работы конструкторов и дальше не могут быть изменены.

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

Поля, помеченные модификатором transient, считаются не входящими в состояние объекта или класса, подлежащее хранению или передаче по сети.

В Java имеются соглашения о том, как должен быть оформлен интерфейс класса, объекты которого могут быть сохранены или переданы по сети — эти соглашения можно найти в документации по интерфейсу java.io.Serializable, который должен реализовываться таким классом. Имеются и другие подобные наборы соглашений, привязанные к определенным библиотекам или технологиям в рамках Java.

Стандартный механизм Java, обеспечивающий сохранение и восстановление объектов, реализующих интерфейс java.io.Serializable, по умолчанию сохраняет значения всех полей, кроме помеченных модификатором transient.

Методы классов в Java могут быть дополнительно помечены модификаторами strictfp (такой же модификатор могут иметь инициализаторы ) и synchronized.

Значение модификатора strictfp описано в Лекции 10, в разделе о типах с плавающей точкой.

Значение модификатора synchronized описывается ниже, в разделе, посвященном многопоточным приложениям.

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Андрей Швецов
Андрей Швецов
Россия, Александровск, школа-гимназия №2 им. Островского, 2005
Анна Оганян
Анна Оганян
Россия, Москва, МГОУ