![](/user_photo/2706_HbeT2.jpg)
Book_5_Java
.pdfВведение в Java: быстрый старт
Т.В. Гурьянова
Минск, 2015
Предисловие
Основу данного учебного пособия составили программы из книги по Java 2 П.Ноутона и Г.Шильтда [1], а также теория и задания 30-часового курса по основам Java, который читался Т.В. Гурьяновой школьникам 6-8 классов «Юни-центра XXI» ФПМИ БГУ в 2014/2015 учебном году.
Первая простая программа
Теперь, когда объектно-ориентированные основы языка Java были обсуждены, посмотрим на
некоторые реальные программы. Начнем с компиляции и выполнения короткой программы, представленной ниже. Как вы увидите, она включает немного больше работы, чем можно
было бы представить.
/* Это простая Jаvа-программа.
Назовите этот файл “Example.java” . */ class Example {
// Программа начинается с вызова main(). public static void main(String[ ] args) {
System.out.println (“Это простая Jаvа-программа.”); }}
После выполнения программы на экран выводится строка:
Это простая Jаvа-программа.
Рассмотрим поближе каждую часть программы.
/* Это простая Jаvа-программа. Назовите этот файл “Example.java”. */
Это комментарий. Как и большинство других языков программирования, Java позволяет
вводить замечания в исходный программный файл. Содержимое комментария игнорируется
компилятором. Комментарий описывает и объясняет работу программы всем, кто читает исходный код. Такой тип комментария называют многострочным комментарием. Этот тип комментария должен начинаться символами /* и заканчиваться */. Все символы, находящиеся между этими парами, игнорируются компилятором.
Следующая строка кода программы: class Example {
Эта строка использует ключевое слово class для объявления, что определен новый класс.
Полноеопределениекласса,включающеевсеегочлены,размещаетсямеждуоткрывающей({)
и закрывающей (}) фигурными скобками. Использование фигурных скобок в Java аналогично
способу их использования в С и С++ (begin и end в Паскале).
Следующая строка в программе — однострочный комментарий:
// Программа начинается с вызова main( ).
Это второй тип комментариев, поддерживаемых в Java. Однострочный комментарий начинается символами // и завершается в конце строки. Программисты используют многострочные комментарии для длинных заметок, а однострочные — для кратких,
построчных описаний.
public static void main(String[ ] args) { — строка заголовка метода (функции) main ( ). Как
подсказывает предшествующий комментарий, отсюда начнется выполнение программы. Все
приложения Java начинают выполнение с вызова main ( ). (Точно так же, как в C/C++.)
Итак, main ( ) — это метод, вызываемый, когда Jаvа-приложение начинает выполняться. Имейте в виду, что Java чувствителен к регистру. Таким образом, Main отличается от main.
Следующая строка кода (заметим, она находится внутри main ( ):
System.out.println (“Это простая Jаvа-программа.”) ;
выводит на экран строку “Это простая Jаvа-программа.”,
Вот еще один пример программы: мы определяем целочисленную переменную num, затем увеличиваем ее значение вдвоер результаты выводим на экран (в консоль):
//отладку сделал Борис Комаров, 5 класс public class Example2 {
public static void main(String[] args) { int num;
num=100;
System.out.println(“Znachenie num: “ +num ); num = num * 2; System.out.println(“Znachenie num: “ +num );
}
}
Оператор if
Формат if:
if (condition) statement;
Здесь condition представляет собой логическое выражение. Если оно истинно (true), то statement исполняется. Если condition ложно (false), то statement пропускается.
Пример программы, иллюстрирующей оператор if:
//отладку сделал Илья Бохон, 7 класс public class IfSample {
public static void main(String[] args) {
int x, y; x=10; y=20;
if(x < y) System.out.println(“x menshe chem y”);
x = x * 2;
if(x == y) System.out.println(“x ravno y”);
x = x * 2;
if(x > y) System.out.println(“x bolshe chem y”);
// следующий оператор не выводит свое сообщение if(x == y) System.out.println(“vy nichego ne uvidite”);
}
}
Следующая строка кода:
Вывод, генерируемый этой программой:
хx menshe chem у
хravno у
хbolshe chem у
Обратите внимание на строку: int х, у;
В ней объявлены две переменные, х и y, разделенные запятой.
Сокращенный if
Ниже показана программа, которая демонстрирует условную операцию. Она используется для получения абсолютного значения переменной.
//отладку сделала Анастасия Станкевич, 8 класс public class ExampleIf2 {
public static void main(String[] args) { int i, k;
i = 10;
k = i < 0 ? -i: i; //получить абсолютное значение i System.out.print(“Абсолютное значение “); System.out.println(i + “ равно” + k);
i = -10;
k = i < 0 ? -i: i; //получить абсолютное значение i System.out.print(“Абсолютное значение “); System.out.println(i + “ равно” + k);
}
}
Вывод, генерируемый программой:
Абсолютное значение 10 равно 10 Абсолютное значение -10 равно 10
Пояснение. Строка
k = i < 0 ? -i: i;
аналогична выполнению двух строк: if (i < 0) k=-i;
if (i >= 0) k=i;
Цикл for
Формат цикла for:
for (initialization; condition; iteration) statement;
Логическоевыражениеconditionпроверяетэтупеременную.Еслирезультатпроверки —истина
(true), цикл for продолжает итерации, если — ложь (false), цикл завершается. Выражение iteration определяет, как переменная цикла изменяется на каждом шаге выполнения цикла.
Пример программы, иллюстрирующей цикл for:
//отладку сделал Роман Климаков, 6 класс public class ForTest {
public static void main(String[] args) {
int x;
for(x = 0; x<10; x = x+1) System.out.println(“Значение x: “ + x);
}
}
Программа генерирует следующий вывод:: ..
Значение х: 0 Значение х: 1
…
Если вы знакомы с С/С++, то знаете, что на этих языках запятая — это оператор, который
можно использовать в любом правильном выражении. В Java, однако, дело обстоит не так. В
Java запятая — это разделитель, который применяется только в цикле for:
/* Два разделенных запятыми оператора в итерационной части выполняются каждый раз, когда цикл повторяется.*/ //отладку сделал Егор Безмен
public class CiklFor {
public static void main(String[] args) { int a , b;
for(a=1, b=4; a<b; a++, b--) { System.out.println(“a = “ + a); System.out.println(“b = “ +b);
}
}
}
Программа генерирует следующий вывод:
а= 1 b = 4
а= 2 b = 3
Оператор switch
Модифицируйте программу, введя номер месяца с клавиатуры:
//отладку сделал Иван Королев, 7 класс public class SwitchSample {
public static void main(String[] args) { int month = 13;
String season; switch (month){ case 2:
case 1: case 13:
season =”Зима”; break;
case 5: case 4: case 12:
season =”Весна”; break;
case 9: case 7: case 8:
season =”Лето”; break;
case 3: case 44: case 6:
season =”Осень”; break;
default:
season = “Непонятный месяц”;} System.out.println(“ это “ + season + “.”);}}
Оператор switch может быть вложенным: switch(count) {
case 1:
switch(target){ // вложенный switch case 0:
System.out.println (“target равен нулю”) ; break;
case 1: // нет конфликтов с внешним switch System.out.println(“target равен единице”); break;
}
break; case 2:
...
Оператор цикла while
while(условие) { // тело цикла
}
//отладку сделал Егор Безмен public class _While {
public static void main(String[] args) {
int n=10; while (n>0){
System.out.println(“тик “ + n); n--;
}
}
}
Программа при выполнении “тикнет” ровно десять раз:
тик 10 тик 9 тик 8
...
тик 1
Цикл do while
Цикл do while особенно полезен, когда вы обрабатываете выбор из меню, потому что обычно требуется, чтобы тело цикла меню выполнялось по крайней мере один раз. Рассмотрим
следующую программу, которая реализует очень простую справочную систему для Jаvа-
операторов выбора и повторения (полужирным шрифтом выделен консольный ввод
символа):
//Пример программы-викторины, написанной Даниилом Селиным, 6 класс public class viktorina {
public static void main(String[] args)
//операторы, выделенные полужирным обеспечивают консольный ввод символа
throws java.io.IOException { char x,r,tmp;
int y = 0; do{
System.out.println(“Гаттерия — это:”); System.out.println(“1. бабочка огромных размеров”); System.out.println(“2. Мелкий крокодил”);
System.out.println(“3. единственная рептилия, у которой есть третий глаз на темени”); x = (char) System.in.read();
tmp= (char) System.in.read();
//это считывание в tmp необходимо, поскольку завершение консольный ввод завершается
//нажатием клавиши Enter, что, в свою очередь, воспринимается, как ввод символа
if (x == ‘3’) {System.out.println(“Вы правы плюс очко”); y = y + 1;}
if (x != ‘3’) System.out.println(“Вы не правы “);
}
while(x<’1’||x>’3’);
do{
System.out.println(“Сколько обычно весит сама крупная рептилия — кожистая черепаха:
”);
System.out.println(“1.до 700 кг “); System.out.println(“2. до 1000 кг “); System.out.println(“3. до 2000 кг “); x = (char) System.in.read(); tmp=(char) System.in.read();
if (x == ‘1’) {System.out.println(“Вы правы плюс очко”); y = y + 1;}
if (x != ‘3’) System.out.println(“Вы не правы “);
}
while(x<’1’||x>’3’);
do{
System.out.println(“Самый крупный динозавр (длинна до 36 м и вес до 88 тонн):”); System.out.println(“1. диплодок “);
System.out.println(“2. сейсмозавр “); System.out.println(“3. бронтозавр”); x = (char) System.in.read();
if (x == ‘2’) {System.out.println(“Вы правы плюс очко”); y = y + 1;}
if (x != ‘3’) System.out.println(“Вы не правы “);
}
while(x<’1’||x>’3’);
System.out.println(“Вы получили “+y+” очко”);
}
}
Упражнения
1. Поменяйте между собой значения двух переменных a и b:
(a)воспользовавшись третьей переменной r для временного хранения значений;
(b)не используя других переменных.
2.Найдите сумму членов арифметической прогрессии a, a+d, a+2*d,… , a+n*d по заданным значениям a, d, n
3.Вычислите расстояние между двумя точками с координатами X1, Y1 и X2, Y2.
4.Переменная X содержит трехзначное целое число. Поместите в переменную
S сумму цифр этого числа.
5.Возведите число А в пятую степень, в шестнадцатую степень.
6.Введите число. Напечатайте 1, если число четное, и 0, если число нечетное.
7.Ввести два числа и напечатать сначала меньшее, затем большее.
8.Решить предыдущую задачу, использовав только один оператор вывода.
9.Ввести три числа. Выбрать и напечатать наибольшее из них.
10.Напишите программу, которая вводит целые числа с клавиатуры и складывает их, пока не будет введено число 0.
11.Введите с клавиатуры n чисел и определите их среднее арифметическое.
12.Сосчитайте, сколько шестизначных чисел имеют одинаковые суммы трех первых и трех
последних цифр.
13.Составьте программу, печатающую квадраты всех натуральных чисел от 0 до заданного натурального n.
14.Разбейте заданное число на два слагаемых всеми различными способами. Способы,
отличающиеся лишь порядком слагаемых, разными не считать!
15.Распечатайте квадраты чисел от 1 до n, используя из арифметических операций лишь
сложение.
16.Вычислите произведение чисел от n до m, где n<m; n, m — натуральные числа, пользуясь циклом for.
17.Напишите программу, которая находит и печатает все совершенные числа от 2 до x.
Совершенное число — это число, равное сумме всех своих делителей, включая единицу, но
исключая само число. (Например, 28=1+2+4+7+14, 6=1+2+3- совершенные числа
18.Вычислите сумму чисел от 1 до n, возведенных в степень m.
19.Введите число и определите, простое оно или составное. Распечатайте первую сотню
простых чисел.
Один из вариантов выполнения 1 (а) упражнения (программа написана Егором Безменом):
public class Upr_1 {
public static void main(String[] args) { int a=5;
int b=10; int r;
System.out.println(“a=”+a);
System.out.println(“b=”+b);
r=a;
a=b;
b=r;
System.out.println(“Меняем величины переменных”); System.out.println(“a=”+a); System.out.println(“b=”+b);
}
}
Один из вариантов выполнения 2 упражнения (программа написана Анастасией Станкевич):
import java.io.IOException;
public class Program2 {
public static void main(String[] args) throws IOException { int a, d, n, i, k;
System.out.println(“Введите 3 числа”);
a=(int)System.in.read();//Чтобы вы зря не радовались — эта строка не работает d=(int)System.in.read();//И эта
n=(int)System.in.read();//И эта тоже. Да. Вы попали. for(i=0; i<n; i++)
{
k=a+d*i;
System.out.println(a+”+”+d+”*”+i+”=”+k);
}
}
}
Массивы
Следующая программа создает трехмерный массив Зх4х5, затем заполняет каждый элемент
произведением его индексов и отображает эти значения на экран.
// Демонстрирует трехмерный массив. //отладку сделал Никита Капитанов, 9 класс: public class Example {
public static void main(String[] args) { int theeD[][][] = new int[3][4][5]; int i, j, k;
for(i=0; i<3; i++) for( j=0; j<4; j++)
for( k=0; k<5; k++) theeD[i][j][k] = i *j * k;
for( i=0; i<3; i++){ for( j=0; j<4; j++){
for( k=0; k<5; k++) System.out.print(theeD[i][j][k] + “ “);
System.out.println();
}
System.out.println();
}
}
Упражнение. Напишите программу, в которой элементы 2-мерного массива вводятся с
клавиатуры (консольный ввод), а затем выводятся на экран: for(i=0; i<4; i++){
for(j=0; j<4; j++) Sytem.out.print(m[i] [j] + “ “); System.out.println( );}
Упражнение. Вставьте код в java-проект, допишите его, чтобы получить следующую
таблицу:
0 0 0 0
0 1 2 3
0 2 4 6
0 3 6 9
// Демонстрирует двумерный массив. //отладку сделала Анастасия Станкевич:
public class Example2 {
public static void main(String[] args) { int m[][]= new int [4][4];
int i, j;
for(i=0; i<4; i++) for(j=0;j<4; j++) m[i][j]=i*j;
for(i=0; i<4; i++){ for(j=0;j<4; j++)
System.out.print(m[i][j]+”.0 “); System.out.println();
}
}
}
Упражнения
1.Подсчитайте произведение элементов массива.
2.Вычислите значения функции Y=X*X для X=2,4,6,8,… ,28 и разместите их в одномерном массиве Y.
3.Измените порядок следования значений элементов массива на обратный.
4.“Сожмите”’ числовой массив, выбросив из него отрицательные числа. (Сдвиньте все элементы массива после удаления отрицательных чисел, пустые места в конце массива заполните нулями.)
5.Определите, является ли заданный массив упорядоченным. (Упорядоченным (по
неубыванию) считается тот массив, у которого каждый следующий элемент не меньше предыдущего.)
6.Задан массив и некоторое число. Найти, на каком месте расположено число в массиве.
7.В массиве целых чисел найдите самую длинную неубывающую последовательность.
8.Поверните квадратный (количество строк равно количеству столбцов) массив
на 90, 180, 270 градусов по часовой стрелке. (В этой задаче требуется не положить все цифры “на бок” или поставить на голову, а передвинуть элементы в указанном порядке.)
9.Выясните, есть ли одинаковые числа:
(a) в одномерном массиве;
(b) в двумерном массиве;
10.Подсчитайте количество уникальных (неповторяющихся) чисел в массиве.
11.В массиве содержатся числа 0, 1, 2 и ничего кроме них. Упорядочить массив по неубыванию.
12.Взяв за основу предыдущую задачу, упорядочить массив по убыванию. Можно менять
местами лишь соседние элементы.
13.Задан массив чисел. Заменить каждое число суммой предыдущих:
(a)включая заменяемое
(b)исключая заменяемое.
Введение в классы
Вот пример описания класса — нового типа, описанного пользователем, в нашем примере — класс Boxсостоит из трех переменных типа double (width, height, depth). При инициализации переменной вновь созданного типа-класса вызывается конструктор с таким же именем, как и
класс (new Box()).
//отладку сделал Антон Силебин, 9 класс public class Box{
double width; double height; double depth;
}
public class BoxDemo {
public static void main(String[] args) {
//выделяется место в памяти под переменную mybox типа Box: Box mybox = new Box();
mybox.width = 10; mybox.height = 20; mybox.depth = 15;
double vol;
vol = mybox.width*mybox.height*mybox.depth; System.out.println(“Obyem raven “ + vol);
}
}
Каждый объект имеет свои собственные копии переменных экземпляра. Если вы имеете
два Bох-объекта (объявление класса Box, хранящих характеристики прямоугольного параллелепипеда, см. ниже), каждый из них обладает своей собственной копией depth
(длина основания), width (ширина основания) и height (высота). Важно понять, что изменения переменных экземпляра одного объекта не имеют никакого влияния на переменные экземпляра другого.
Следующая программа объявляет два Bох-объекта:
//отладку сделал Егор Кресик import java.util.Scanner; class Box {
int width; int height; int depth;
};
class BoxDemo2{
public static void main(String[] args) throws java.io.IOException{ Box mybox1 = new Box();
Box mybox2 = new Box(); double vol;
Scanner in = new Scanner(System.in);
System.out.println(“Напишите параметры первого параллелепипеда”);
//присвоить значения переменным экземпляра объекта mуbох1 класса Box (водятся с клавиатуры):
mybox1.width = in.nextInt(); mybox1.height = in.nextInt(); mybox1.depth = in.nextInt(); System.out.println(“Теперь второго”); mybox2.width = in.nextInt(); mybox2.height = in.nextInt(); mybox2.depth = in.nextInt();
//вычислить объем первого параллелепипеда:
vol = mybox1.width * mybox1.height * mybox1.depth; System.out.println(“Объем равен “ + vol);
vol = mybox2.width * mybox2.height * mybox2.depth; System.out.println(“Объем равен “ + vol);
}
}
Для объявления объектов myboxl и mybox2 типа Вoх использовались строки вида:
Bох mybox1= new Bох(); Bох mуbох2 = new Bох();
Оператор Bох mybox = new Bох(); комбинирует два шага:
Вох mybox; // объявить ссылку на объект
mуbох = new Bох(); // распределить память для Вох-объекта
Давайте теперь вычисление объема параллелепипеда (mybox2.width * mybox2.height * mybox2.depth) сделаем функцией, описанной в самом классе Box:
//Эта программа включает метод внутрь класса Вох. class Вох {
double width; double height; double depth;
//вычислить и вывести на экран объем параллелепипеда: void volume () {
System.out.print (“Объем равен “); System.out.println(width * height * depth); class ВохDеmоЗ {
public static void main(String args[]) { Bох mуbох1 = new Bох();
Bох mуbох2 = new Bох();
//присвоить значения переменным экземпляра rnуbох1 mybox1.width = 10;
mybox1.height = 20; mybox1.depth = 15;
//присвоить другие значения переменным экземпляра rnуЬох2 mybox2.width = 3;
mybox2.height = 6; mybox2.depth = 8;
//показать объем первого параллелепипеда:
mybox1.volume();
// показать объем второго параллелепипеда: mybox2.volume();
}}
Перегрузка конструкторов
Опишем класс Box следующим образом: class Вох {
double width; double height; double depth;
// Это новый вид конструктора класса Вох (с параметрами!): Box(double w, double h, double d) {
width = w; height = h; depth = d;}
double volume(){return width * height * depth};
Здесь конструктор Вох() имеет три параметра. Это означает, что все объявления Вoх-
объектов должны переслать в конструктор Вох() три аргумента. Например, объявление в
этом случае
Box mуbох2 = new Box(3,6,8);
будет равнозначным выполнению нескольких строчек из предыдущей программы: Bох mуbох2 = new Bох();
mybox2.width = 3; mybox2.height = 6; mybox2.depth = 8;
что экономит время и упрощает запись.
Но!
Например, следующий оператор Вох оb = new Вох(); в новом варианте описания объекта
Box будет недопустим: Вох () требует трех параметров, и его вызов без них — ошибка.
Это поднимает несколько важных вопросов. Что, если вы просто хотели построить трехмерный блок и не знаете (не хотите знать), каковы его размеры? А можно ли сократить запись, если вы хотите инициапизировать куб: тогда достаточно задать лишь одно значение,
и оно будет использоваться для всех трех размеров.
Все эти проблемы решаются с помощью перегрузки конструктора Вох().
//Класс Bох: три конструктора для разных способов инициализации размеров блока. class Bох {
double width; double height; double depth;
//конструктор для инициализации всех размеров
Bох(dоublе w, double h, double d) { width = w;
height = h; depth = d;
//конструктор для инициализации без указания размеров
//по ряду причин удобно использовать -l для указания блока с незаданными значениями размеров
Bох () { width = -1; height = -1; depth = -1;
//конструктор для создания куба
Box(doub1e 1еn) {
width = height = depth = len;
// вычислить и возвратить объем
double volume() {return width * height * depth;} с1аss OverloadCons {
public static void rnain(String args[]) {
//создать блоки, используя различные конструкторы
Bох mуbох1 new bох(10, 20, 15); Bох mуbох2 = new bох();
Bох mуcube new bох(7); double vol;
//получить объем первого блока
vol = myboxl.volume(); Sуstem.оut.рrintln(“Объем mуbох1 равен” + vol);
//получить объем второго блока vo1 = mybox2.vo1ume();
Sуstem.оut.рriпtln(“Объем mуbох2 равен” + vo1);
//получить объем куба
vo1 = mycube.vo1ume(); Sуstеm.оut.рriпt1n(“Объем mусubе равен” + vo1);
}}
Рекурсия
Java поддерживает рекурсию. Рекурсия — это процесс определения чего-то в терминах самого себя. Что касается Jаvа-программирования, то рекурсия — это атрибут, который позволяет методу вызвать самого себя. Такой метод называют рекурсивным.
Классический при мер рекурсии — вычисление факториала числа. Факториал числа N есть
произведение всех целых чисел между 1 и N. Например, факториал 3 равен lx2x3 или 6. Ниже показано, как факториал может быть вычислен при помощи рекурсивного метода:
// Простой пример рекурсии //Отладка сделана Иваном Гужевым и Алексеем Гусаром
class Factorial {
int fact(int n){ int result;
if (n==1)return 1; result=fact(n-1)*n; return result;}
}
public class Recursion {
public static void main(String[] args) {
Factorial f = new Factorial();
System.out.println(“факториал 3 =”+ f.fact(3)); System.out.println(“факториал 4 =”+ f.fact(4)); System.out.println(“факториал 5 =”+ f.fact(5));
}}
Вывод этой программы:
Факториал 3 равен 6 Факториал 4 равен 24 Факториал 5 равен 120
Упражнение. Вычислите n! без использования рекурсии.
Вот один из вариантов выполнения этого упражнения (сделал Егор Кресик, 9 класс): public class Recursion {
public static void main(String[] args) { int a,b,s;
a=9;
b=1;
s=1;
for(b = 1; b<=a; s = s*b, b++); System.out.println(s);
}
}
Передача аргументов
Вообще, существует два способа, с помощью которых машинный язык может передавать
аргумент подпрограмме. Первый способ — передача аргумента по значению. Этот метод
копирует значение аргумента в формальный параметр подпрограммы. Поэтому любые
изменения этого параметра подпрограммой не имеют никакого влияния на соответствующий аргумент вызова.
Второй способ — передача аргумента по ссылке. В этом методе ссылка на параметр (а не его
значение) передается параметру. Внутри подпрограммы она используется, чтобы обратиться
к фактическому параметру, указанному в вызове. Это означает, что изменения параметра будут влиять на аргумент, использованный для вызова подпрограммы. Java использует оба метода, в зависимости от того, что передается во время вызова подпрограмме. Когда методу
передается простой тип, он передается по значению. Таким образом, то, что происходит с
параметром, который принимает аргумент, никак не влияет на сам аргумент (Т. е. аргумент при этом не изменяется).
Рассмотрим следующую программу:
// Простые типы передаются по значению. class Test (
void meth(int i, int j) { i *= 2;
j /= 2;
class CallByValue {
public static void main(String args[]) (. Test оb = new Test();
int а = 15, b = 20;
System.out.println(“a и b перед вызовом: “ + а + “ “ + b); ob.meth(a, b);
System.out.print1n(“a и b после вызова: “ + а + “ “ + b);
Вывод этой программы:
аи b перед вызовом: 15 20
аи b после вызова: 15 20
Как видите, операции, которые происходят внутри meth (), никак не влияют на значения a и b, используемые в вызове (их значения здесь не изменялись до 30 и 10, хотя метод meth() И
выполнил соответствующие вычисления над своими параметрами).
Когда вы передаете методу объект, ситуация драматически изменяется, потому что объекты передаются по ссылке. Имейте в виду, что при создании переменной типа “класс”, вы создаете толькоссылкунаобъект.Такимобразом,когдавыпередаетеэтуссылкуметоду,принимающий
ее параметр будет ссылаться на тот же самый объект, что и аргумент. Это и означает, что
объекты передаются методам по ссылке. Все изменения объекта внутри метода затрагивают объект, используемый как аргумент. Например, рассмотрим следующую программу:
//Объекты передаются по ссылке. class Test {
int а, b;
Test (int i, int j) { а = i
b = j;
//передать объект
void meth(Test о) { o.а *= 2;
о.b /= 2;
class CallByRef {
public static void main(String args[]) { Test оb = new Test(15, 20);
System.out.println(“ob.a и оb.b перед вызовом: “ + оb.а + “ “ + оb.b); ob.meth(ob);
System.out.println(“ob.a и оb.b после вызова: “ + оb.а + “ “ + оb.b);
Эта про грамма генерирует следующий вывод:
оb.а и оb.b перед вызовом: 15 20 оb.a и оb.b после вызова: 30 10
Не трудно заметить, что в этом случае действия внутри meth() воздействовали на объект,
используемый как аргумент.
Интересно отметить, что при передаче объектной ссылки методу сама ссылка передается по
значению. Однако, т. к. передаваемое значение ссылается на объект, копия этого значения
будет ссылаться на тот же объект, что и соответствующий аргумент.
Замечание. Простые типы передаются методу по значению, а объекты — по ссылке.
Возврат объектов
Метод может возвращать любой тип данных, включая типы классов, которые вы создаете.
Например, в следующей программе метод incrByTen() возвращает объект, в котором значение
ана десять больше, чем в вызывающем объекте.
// Возврат объекта сlаss Test
int а;
Test (int i) (
а= i;
Test incrByTen() {
Test temp = new Test(a+l0); return temp;
class RetOb {
public static void main(String args[]) ( Test оb1 = new Test(2);
Test оb2;
оb2 = ob1.incrByTen(); System.out.println(“obl.a: “ + оb1.а); System.out.println(“ob2.a: “ + оb2.а); ob2 = оb2. inсrВуТеn () ;
System.out.print1n(“ob2.a после повторного увеличения: “ + оb2.а);
Вывод, сгенерированный этой программой:
оb1.а: 2 оb2.а: 12
оb2.а после повторного увеличения: 22
Каждый раз, когда incrByTen() вызывается, создается новый объект, и ссылка на него возвращается вызывающей подпрограмме.
Пример программы, считывающий строки текста из консоли
//Отладку выполнил Бохон Илья, 7 класс : import java.io.BufferedReader;
import java.io.InputStreamReader; public class example {
public static void main(String[] args) throws java.io.IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str[] = new String[100];
System.out.println(“ВведиТе строки текста.”); System.out.println(“Введите ‘stop’для завершения.”); for (int i=0; i<100; i++) {
str[i] = br.readLine(); if(str[i].equals(“stop”)) break;
}
System.out.println(“\n Boт ваши строки:”); for(int i=0; i<100; i++) {
if(str[i].equals(“stop”)) break; System.out.println(str[i]);
}
}
}
Чтение данных из текстового файла
Программа выполняющая чтение из текстового файла text.txt (должен находиться в
основной папке проекта)
//программу отладил Егор Кресик import java.io.*;
class ShowFile {
public static void main(String args[]) throws IOException{
int i; FileInputStream fin; try {
fin = new FileInputStream(“text.txt”);
}
catch(FileNotFoundException е) { System.out.print(“ФаЙл не найден”);
return;} catch(ArrayIndexOutOfBoundsException е){ return;}
do{
i = fin.read () ;
if(i != -1) System.out.print( (char) i); }while (i != -1);
fin.close();
}}
Работаем со строками
//Отладку выполнил Бохон Илья class example{
public static void main(String args[]){ char с[] = {‘J’,’а’, ‘v’, ‘а’};
String s = new String(с); String s2 = new String(s); System.out.println(s); System.out.println(s2);
}
}
package proj;
class example{
public static void main(String args[]) { byte ascii[] = {65, 66, 67, 68, 69, 70 }; String sl = new String(ascii); System.out.println(sl);
String s2 = new String(ascii, 2, 3); System.out.println(s2);
}
}
Система Swing
Отсюда скачиваем ПО: https://netbeans.org/downloads/
Вводный урок (Лабораторная 1) можно найти тут: https://www.youtube.com/watch?v=2IZebtJuh3s
Попробуем, опираясь на то, что было рассказано выше, преобразовать строку в число
String str = new String(jTextField1.getText()); int n=str.length();
char str_mass[]= str.toCharArray(); // преобразуем строку в массив символов int a,b=0;
for(int i=0;i<=n+1;i++) { a=str_mass[i]-48; b=b*10+a;
System.out.print(“i=”+i+’\t’+”b=”+b+” a=”+a+’\t’+”n=”+n+’\n’);
Лабороторная 2
Сложение двух чисел по щелчку кнопки. Программа считывает значение переменных из двух текстовых полей и выводит их сумму в элемент управления Swing “метка” (jLabel).
String str1 = jTextField1.getText(); String str2 = jTextField2.getText(); int n1=str1.length();
int n2=str2.length();
char str_mass1[]= str1.toCharArray(); char str_mass2[]= str2.toCharArray(); int a1,a2,b1=0;
int b2=0;
for(int i=0;i<n1;i++) { a1=str_mass1[i]-48; b1=b1*10+a1;