Добавлен: 04.04.2023
Просмотров: 74
Скачиваний: 1
Если требуется получить указатели на примитивные типы, то используются классы-обёртки примитивных типов: Boolean, Character, Byte, Short, Integer, Float, Long, Double.
Для наследования классов в Java используют ключевое слово extends - расширять. Для интерфейсов используют ключевое слово implements – реализовывать. Классы могут наследовать другие классы или реализовывать интерфейсы. Интерфейсы так же могут наследовать или расширять другие интерфейсы.
В Java классы не могут наследовать более чем одному классу, но могут реализовывать несколько интерфейсов. Множественное наследование интерфейсов в Java не запрещается, то есть от нескольких интерфейсов может наследоваться один.
Пример наследования класса:
public class MyThread extends Thread{
...
}
Все методы классов в Java являются виртуальными, если не указано специально обратное. Пример полиморфизма в Java представлен ниже.
class OnePoint {
public void draw() {
System.out.println(".");
}
}
class TwoPoint extends OnePoint {
public void draw() {
System.out.println("..");
}
}
В Java отсутствуют дружественные классы, но особые права доступа к каким-то членам класса, можно определить для классов, входящих в один пакет, если для таких членов класса не определять модификатор доступа.
Ниже приведен пример доступа к членам класса только из классов данного пакета.
package points;
class OnePoint {
void draw() {
System.out.print(".");
}
}
class TwoPoint {
public void draw() {
OnePoint p = new OnePoint();
for(int i = 0; i < 2; i ++){
p.draw();
}
}
}
В Java основой инкапсуляции является класс.
При определении доступа к членам классов, для них определяются модификаторы доступа:protected, public, private.
Таблица 2. Модификаторы доступа в Java
Модификатор доступа |
Область доступа |
public |
Без ограничений |
private |
Только для данного класса |
protected |
Для данного класса и его потомков |
Без модификатора |
Для всех классов данного пакета |
В Java классы могут иметь неограниченное количество конструкторов, с разным количеством и типами аргументов. Деструкторы в языке Java не предусмотрены. Удаляет объекты из памяти Java – машина.
Ниже приведен пример применения в Java нескольких конструкторов класса.
class OnePoint {
private int count;
public OnePoint() {
count = 1;
}
public OnePoint(int n) {
count = n;
}
}
В Java не поддерживается перегрузка операторов.
Исходный код приложения для тестирования работы с классами в Java набран в редакторе Notepad++ и приведен в приложении Б.
Скомпилировано тестовое приложение Java компилятором javaс. Результат представлен на рисунке 3.
Рисунок 3 - Результат компиляции Java – приложения
Результат работы тестового Java – приложения изображен на рисунке 4.
Рисунок 4 - Результат выполнения Java – приложения
2.3. C#
Объектно-ориентированный язык программирования C# (произносится «си шарп») в 1998—2001 годах создала группа инженеров под руководством Андерса Хейлсберга, в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework.
C# был в дальнейшем стандартизирован по ISO/IEC 23270 и ECMA-334 [3].
Название «Си шарп» (от англ. sharp — диез) произошло от музыкальной нотации, где знаком диез, обозначается повышение на полутон соответствующего ноте звука. В этом прослеживается аналогия с названием языка C++, где символы «++» обозначают операцию инкремента переменной. Название так же можно рассматривать как игру с цепочкой символов C→C++→C++++(C#), так как символ «#» может быть составлен из 4х знаков «+».
В языке C# все типы являются классами и связаны отношениями наследования. Базовым родительским классом служит класс Object [10].
Ниже представлен пример объявления нового класса в C#, который наследует другой класс.
class OnePoint
{
...
}
class TwoPoint : OnePoint
{
...
}
Если в базовом классе и в классе наследника определены конструкторы, то при вызове конструктора базового класса используют ключевое слово base. Ниже приведен пример вызова конструктора базового класса из класса наследника.
class OnePoint
{
public OnePoint(string color){};
}
class TwoPoint : OnePoint
{
public TwoPoint(int count):base(string color) {};
}
Если производный класс является наследником базового класса, то он получает все методы, свойства, поля и события базового класса[13]. При создании производного класса может быть выбрана одна из следующих возможностей:
- переопределить виртуальные члены базового класса;
- наследовать наиболее подходящий метод базового класса без переопределения;
- заново определить не виртуальную реализацию необходимых членов, которая скроет реализацию базового класса.
Ниже привен пример переопределения метода в C#.
public class OnePont
{
public virtual void Draw() { }
}
public class TwoPoint : OnePoint
{
public override void Draw() { }
}
В C# модификатором доступа для типов и членов типов является ключевое слово «internal». Внутренние члены и типы, объявленные как internal, доступны только в файлах, входящих в одну и ту же сборку.
Ниже приведен пример использования ключевого слова «internal».
// Assembly1.cs
// Сборка выполнялась с параметром: /target:library
internal class ClassBase
{
public static int intM = 0;
}
class CheckAccess
{
static void Main()
{
ClassBase myBase = new ClassBase(); // ошибки нет
}
}
Если CheckAccess находится в другой сборке:
// Assembly1_a.cs
// Сборка выполнялась с параметром: /reference:Assembly1.dll
class CheckAccess
{
static void Main()
{
ClassBase myBase = new ClassBase (); // CS 0122 ошибка
}
}
Инкапсуляция в C# реализуется с использованием модификаторов доступа. Ниже представлен список модификаторов доступа в C#:
- public – доступ возможен из любого места в одной сборке, либо из другой сборки, на которую присутствует ссылка;
- protected – доступ возможен только внутри класса или при наследовании в классе-наследнике;
- internal – доступ возможен только из сборки, в которой выполнено объявление;
- private – доступ возможен только внутри класса;
- protected internal - доступ возможен из одной сборки или из класса-наследника в другой сборке.
Каждый раз при создании экземпляров класса или структур, вызываются конструкторы. Классы или структуры могут иметь по несколько конструкторов, которые принимают разные аргументы. В конструкторах можно задавать значения по умолчанию, писать гибкий и удобный для чтения код.
Если в коде не представлены конструкторы для объектов, то C# создает конструкторы по умолчанию, которые создают экземпляры объектов и задают переменным - членам класса значения по умолчанию.
Ниже приведен пример определения конструктора для класса.
public class OnePoint
{
public OnePoint()
{
...
}
}
Как было сказано выше, классы в C# могут иметь произвольное количество конструкторов.
В C# деструкторы применяются для уничтожения экземпляров классов. Для класса может быть определен только один деструктор. Деструкторы нельзя наследовать или перегружать. Деструкторы вызвать невозможно. Они выполняются автоматически. Деструкторы не принимают модификаторы и не имеют параметров.
Пример определения деструктора представлен ниже.
class OnePoint
{
~OnePoint() // деструктор
{
...
}
}
Для перегрузки оператора в C#, нужно написать функцию с указанием имени, а затем символа оператора, для которого выполняется перегрузка.
Ниже приведен пример перегрузки оператора + для класса боьших чисел:
public static HugeNumber operator+( HugeNumber a, HugeNumber b)
{
return new HugeNumber (a + b);
}
Для тестирования приведенных выше теоретических аспектов создано приложение на языке C# в среде Microsoft Visual Studio 2010 Express.
Окно Microsoft Visual Studio 2010 Express изображено на рисунке 5. Исходный код разработанной программы представлен в приложении В.
Рисунок 5 - Окно Microsoft Visual Studio 2010 Express
На рисунке 6 представлен результат выполнения разработанного приложения.
Рисунок 6 - Результат выполнения приложения на языке C#
Таким образом, проведенное исследование показало, что наиболее популярные современные языки программирования разработаны с приоритетом объектно-ориентированного подхода, а в языках Java и C# невозможен иной принцип разработки приложений.
Синтаксически все рассмотренные языки программирования имеют свои особенности, но программисту, владеющему любым из этих языков, не составит большого труда освоить и остальные.
Заключение
В ходе проведенного исследования были проанализированы история развития, классификация, достоинства и недостатки современных языков программирования. За сравнительно небольшой срок, в несколько десятилетий, языки программирования эволюционировали от машинно-зависимых, в которых программный код набирался машинными символами, до объектно-ориентированных. Исходный код программ, написанных на современных языках, может быть перенесен межу различными вычислительными платформами..
Во второй главе были исследованы принципы объектно-ориентированного программирования, реализованные в C++, Java, C#.
Были исследованы способы создания и уничтожения объектов, для каждого языка была исследована поддержка следующих объектно– ориентированных принципов:
- типы данных;
- наследование;
- полиморфизм;
- инкапсуляция;
- дружественные функции и классы;
- конструкторы и деструкторы;
- перегрузка операторов.
Поддержка перегрузки методов не исследовалась, т.к. она поддерживается всеми рассмотренными языками программирования.
Результаты исследования могут быть кратко сформулированы следующим образом:
-
- Всеми рассмотренными языками поддерживается создание объектов на базе описанных классов, для этого используются конструкторы класса;
- Всеми рассмотренными языками поддерживается наследование классов;
- Всеми рассмотренными языками поддерживается полиморфизм;
- Дружественные классы и функции рассмотренные языки программирования поддерживают, но C# имеет синтаксис отличный от общепринятого, ключевое слово friend в нем отсутствует;
- Всеми рассмотренными языками поддерживается инкапсуляция;
- В языке Java не поддерживаются деструкторы. В языке C# деструктор не может быть явно вызван, его вызывает среда выполнения при уничтожении объекта;
- Перегрузку операторов не поддерживает Java.
По результатам проведенного исследования можно сделать вывод, что в основе наиболее популярных современных языков программирования лежат принципы объектно–ориентированного программирования.
При уничтожении объекта в C# вызывается описанный деструктор, несмотря на то, что явный вызов деструктора не предусмотрен.
В целом общие принципы объектно– ориентированного программирования являются универсальными наиболее популярные современные языки программирования их поддерживают..
Список литературы
-
-
- Блох Дж. - Java. Эффективное программирование—М.: Издательство"Лори", 2008.— 220 с.
- Ватсон Б. - С# 4.0 на примерах, Пер. с англ. – Спб.: Издательский дом «БХВ-Петербург», 2011. – 608 с.: ил
- Гросс К. - С# 2008. – Спб.: Издательский дом «БХВ-Петербург», 2009. – 576 с.: ил
- Литвиненко Н. А. - Технология программирования на C++. Win32 API-приложения – М.: Издательство «БХВ-Петербург», 2010. – 288 с.: ил.
- Нейгел К., Ивьен Б, Глин Дж., Уотсон К., Скиннер М. - C# 4.0 и платформа .NET 4 для профессионалов, Пер. с англ. – М.: Издательский дом «Вильямс», 2011. – 1440 с.: ил.
- Перроун П., Венката С., Чаганти Р. Создание корпоративных систем на основе Java 2 Enterprise Edition. Руководство разработчика, Пер. с англ. – М.: Издательский дом «Вильямс», 2001. – 1184 с.: ил.
- Солтер Н., Клепер С. Дж. - C++ для профессионалов, Пер. с англ. – М.: Издательский дом «Вильямс», 2006. – 912 с.: ил.
- Страуструп Б - Язык программирования С++, Пер. с англ. – М.: Издательство «Бином», 2011. – 1136 с.: ил.
- Физерс М. К. - Эффективная работа с унаследованным кодом, Пер. с англ. – М.: Издательский дом «Вильямс», 2009. – 393 с.: ил.
- Фленов М. - Библия C#. – Спб.: Издательский дом «БХВ-Петербург», 2011. – 560 с.: ил
- Хорстманн С., Корнелл Г. - Core Java 2, 7th Edition / Java 2. Библиотека профессионала, Пер. с англ. – М.: Издательский дом «Вильямс», 2007. – 896 с.: ил.
- Шилдт Г. - С++ Базовый курс, Пер. с англ. – М.: Издательский дом «Вильямс», 2010. – 624 с.: ил.
- Шилдт Г. - C# 4.0 полное руководство, Пер. с англ. – М.: Издательский дом «Вильямс», 2011. – 1056 с.: ил.
- Шилдт Г. - Полный справочник по Java. Java SE™ 6 Edition — 7-е изд. — М.: Вильямс, 2007. — 1040 с.
- Эккель Б. - Философия Java, Пер. с англ. – Спб.: Издательский дом «Питер», 2009. – 638 с.: ил.
-