С. Сухов - Основы программирования на Java
- Название:Основы программирования на Java
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
С. Сухов - Основы программирования на Java краткое содержание
Учебное пособие разработано в соответствии с программой курса «Информатика» и предназначено для студентов радиотехнического факультета, но может использоваться и студентами других специальностей. Рассматриваются вопросы программирования на языке Java.
Направлено на закрепление знаний по курсу «Информатика», читаемого по специальности 210406 «Сети связи и системы коммутации». Учебное пособие подготовлено на кафедре «САПР».
Основы программирования на Java - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
double distance(Point p) {
return distance(p.x, p.y);
} }
class PointDist {
public static void main(String args[]) {
Point p1 = new Point(0,0);
Point p2 = new Point(30,40);
System.out.println("p1 = " + p1.x + ", " + p1.y);
System.out.println("p2 = " + p2.x + " + p2.y);
System.out.println("p1.distance(p2) =” + p1.distance(p2));
System.out.println("p1.distance(60, 80) = " + pl.distance(60, 80));
}}
Обратите внимание на то, как во второй форме метода distance для получения результата вызывается его первая форма. Ниже приведен результат работы этой программы:
p1 = 0,0
р2 = 30,40
p1.distance(p2) = 50.0
pl.distance(60, 80) = 100.0
Основным фундаментальным свойством объектно-ориентированного подхода является наследование. Классы-потомки имеют возможность не только создавать свои собственные переменные и методы, но и наследовать переменные и методы классов-предков. Классы-потомки принято называть подклассами. Непосредственного предка данного класса называют его суперклассом. В очередном примере показано, как расширить класс Point таким образом, чтобы включить в него третью координату z.
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
Point3D() {
this(-1,-1,-1);
}
}
В этом примере ключевое слово extends используется для того, чтобы сообщить транслятору о намерении создать подкласс класса Point. Как видите, в этом классе не понадобилось объявлять переменные х и у, поскольку Point3D унаследовал их от своего суперкласса Point.
В примере с классом Point3D частично повторялся код, уже имевшийся в суперклассе. Вспомните, как во втором конструкторе мы использовали thisдля вызова первого конструктора того же класса. Аналогичным образом ключевое слово superпозволяет обратиться непосредственно к конструктору суперкласса.
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
super(x, у); // Здесь мы вызываем конструктор суперкласса
this.z=z;
public static void main(String args[]) {
Point3D p = new Point3D(10, 20, 30);
System.out.println(“ x =” + p.x + ” у =” + p.y + " z =” + p.z);
}
}
Вот результат работы этой программы:
x = 10
y = 20
z = 30
Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса. Проблема заключается в том, что в классе Point уже определена версия метода distance(int х, int у), которая возвращает обычное расстояние между точками на плоскости. Мы должны заместить(override) это определение метода новым, пригодным для случая трехмерного пространства. В следующем примере проиллюстрировано и совмещение(overloading), и замещение(overriding) метода distance.
class Point {
int x, у;
Point(int x, int у) {
this.x = x;
this.y = y;
}
double distance(int x, int y) {
int dx = this.x – x;
int dy = this.y - y:
return Math,sqrt(dx*dx + dy*dy);
}
double distance(Point p) {
return distance(p.x, p.y);
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
super(x, y);
this.z = z;
}
double distance(int x, int y, int z) {
int dx = this.x - x;
int dy = this.y - y;
int dz = this.z - z;
return Math.sqrt(dx*dx + dy*dy + dz*dz);
}
double distance(Point3D other) {
return distance(other.x, other.y, other.z);
}
double distance(int x, int y) {
double dx = (this.x / z) - x; double dy = (this.y / z) - y;
return Math.sqrt(dx*dx + dy*dy);
}
}
class Point3DDist {
public static void main(String args[]) {
Point3D p1 = new Point3D(30,40,10);
Point3D p2 = new Point3D(0,0,0);
Point p = new Point(4,6);
System.out.println("p1 = " + p1.x + "," + p1.y + " + p1.z);
System.out.println("p2 = " + p2.x + ", " + p2.y + " + p2.z);
System.out.println("p = " + p.x + " + p.y);
System.out.println("p1.distance(p2) =” +p1.distance(p2));
System.out.println("p1.distance(4,6) = " + p1.distance(4,6));
System.out.println("p1.distance(p) =” + p1.distance(p));
}
}
Результат работы этой программы:
p1 =30,40,10
р2 = 0,0,0
р = 4,6
p1.distance(p2) = 50.9902
pl.distance(4,6) = 2.23607
p1.distance(p) = 2.23607
Давайте в качестве примера рассмотрим два класса, у которых имеют простое родство подкласс/суперкласс, причем единственный метод суперкласса замещен в подклассе.
class А {
void callme() {
System.out.println("Вызван callme метод класса А");
}
}
class В extends А {
void callme() {
System.out.println("Вызван callme метод класса В");
}
}
class Dispatch {
public static void main(String args[]) {
A a = new B();
a.callme();
}
}
Обратите внимание — внутри метода main мы объявили переменную «а» класса А и проинициализировали ее ссылкой на объект класса В. В следующей строке мы вызвали метод callme. При этом транслятор проверил наличие метода callme у класса А, а исполняющая система, увидев, что на самом деле в переменной хранится представитель класса В, вызвала не метод класса A, a callme класса В. Ниже приведен результат работы этой программы:
Вызван callme метод класса В
Рассмотренная форма динамического полиморфизма времени выполнения представляет собой один из наиболее мощных механизмов объектно-ориентированного программирования, позволяющих писать надежный, многократно используемый код.
Все методы и переменные объектов могут быть замещены по умолчанию. Если же вы хотите объявить, что подклассы не имеют права замещать какие- либо переменные и методы вашего класса, вам нужно объявить их как final: final int FILE NEW = 1;
По общепринятому соглашению при выборе имен переменных типа final используются только символы верхнего регистра. Использование final-методов порой приводит к выигрышу в скорости выполнения кода — поскольку они не могут быть замещены, транслятору ничто не мешает заменять их вызовы встроенным (in-line) кодом (байт-код копируется непосредственно в код вызывающего метода).
В Java существует возможность объявлять методы с именем finalize. Методы finalize - это деструкторы - методы, которые уничтожают объект. Исполняющая среда Java будет вызывать его каждый раз, когда сборщик мусора соберется уничтожить объект этого класса.
Иногда требуется создать метод, который можно было бы использовать вне контекста какого-либо объекта его класса. Так же, как в случае main, все, что требуется для создания такого метода — указать при его объявлении модификатор типа static. Статические методы могут непосредственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок thisи super.Переменные также могут иметь тип static, они подобны глобальным переменным, то есть доступны из любого места кода. Внутри статических методов недопустимы ссылки на переменные представителей. Ниже приведен пример класса, у которого есть статические переменные, статический метод и статический блок инициализации.
Читать дальшеИнтервал:
Закладка: