Этот пост является частью серии Заметок по объектно-ориентированному программированию, которые я все еще пишу. Он предназначен для краткого руководства для людей, которые нуждаются или хотят получить обзор языка и узнать, как писать некоторый код.
В конце поста есть работающий пример.
Если вам нужен полный удивительный учебник/курс/руководство по Java, пожалуйста, посетите эту страницу, которую я нашел, когда изучал модификаторы доступа:
http://tutorials.jenkov.com/java/index.html 🚀
На данный момент вы не найдете здесь, как что-либо установить или как настроить среду разработки, но вы можете протестировать код, используя replit.com чтобы начать кодировать Java онлайн 😉
☕ Обзор Java
В этом разделе вы найдете некоторую информацию о языке Java. Но если вы хотите более глубокого понимания, пожалуйста, прочтите книгу Мышление на Java автора Брюс Экель если вы уже знаете некоторые основы программирования.
📓 Что такое Java?
Java – это Язык программирования , предназначенный для программирования в рамках Парадигмы объектной ориентации .
Как и любой другой язык, он предлагает набор специальных слов и некоторые правила для формирования логических предложений, понятных другим. Основная цель Языка программирования состоит в том, чтобы позволить вам писать предложения, понятные компьютеру, для выполнения действий .
Вы можете написать группу инструкций для создания процессов, затем создать группу процессов для создания программ, а затем создать группу программ для создания системы.
Есть несколько слов для определенного употребления. Эти слова известны как зарезервированные слова . Кроме того, существует два основных набора правил: синтаксис и семантика . Синтаксис определяет, как правильно писать предложения, а семантика определяет структуру кода правильным образом, чтобы компьютер мог понять ваши инструкции.
🤖 Строго типизированный язык
Java – это строго типизированный язык. Это означает, что Java нуждается в том, чтобы вы определяли тип всех объявляемых вами данных.
Потому что способ работы компьютера заключается в считывании данных из памяти (с жесткого диска или оперативной памяти), чтобы использовать его в процессах, запущенных в CPU , нам нужно выделить место в памяти для каждой переменной и временных данных, чтобы убедиться, что наша программа работает нормально.
Каждый тип данных имеет размер в битах (физические слоты в памяти). Так, например, когда мы объявляем тип данных переменной, мы говорим компьютеру обеспечить правильное пространство для хранения наших данных в памяти, чтобы избежать ошибок, таких как недостаточное пространство памяти.
Существует набор типов данных : числа, строки символов (текст), одиночные символы, логические значения (true или false), объекты (структуры данных) и т.д.
Вы можете прочитать больше о сильных и слабых типизированных языках здесь .
🔮 Волшебство
И еще кое-что. Компьютер просто понимает двоичные инструкции (0 и 1, машинный язык ). Это называется низкоуровневый язык. Низкий уровень близок к машинному языку, а высокий – к человеческому языку.
Java – это язык высокого уровня ,
Эта программа называется “компилятор” . Он переводит язык высокого уровня на язык низкого уровня .
Существуют другие программы, называемые “транспиляторы” , которые переводят язык на другой язык того же уровня.
Однако в этом случае нам нужен “компилятор” для компиляции (перевода на низкий уровень) нашего кода Java на машинный язык.
Компиляторы и транспиляторы имеют внутренние механизмы, которые позволяют проверять если код синтаксис в порядке и он соблюдает семантические правила . Таким образом, компилятор не оставит для компиляции или запуска код с синтаксическими и семантическими ошибками. Но помните, что вы можете писать код с логическими ошибками с помощью хорошо написанных инструкций.
В этом разделе вы найдете справочную информацию об основах написания кода Java. Не стесняйтесь возвращаться к нему, когда вам это нужно.
Комментарии
Комментарии – это способ написать в коде то, что будет игнорироваться компьютером. Комментарии не имеют никакой функциональности.
Рекомендуется писать комментарии , чтобы объяснить что-то о коде при необходимости . Обычно мы используем комментарии к “document” коду, чтобы помочь другим программистам быстро понять процесс или объяснить некоторые специфические концепции, которые не являются общими.
Когда вы учитесь, нормально писать много комментариев для добавления заметок, но когда вы работаете над более серьезным проектом, вам следует избегать злоупотребления этим ресурсом . Чтобы избежать ненужных комментариев, старайтесь писать код как можно более простым и понятным. Если вы хотите узнать больше, загуглите о чистом коде и передовой практике.
/** * ✅ This is a multiline comment * so you can write a very long comment. * This format is used to document your code. */ /* ✅ This is a valid multiline comment */ /* ✅ as well as this one*/ // ✅ This is an inline comment. You can't use multiline because this line won't be interpreted as a comment ❌
Точка с запятой и фигурные скобки
Это символ точки с запятой ;
, а это фигурные скобки {}
.
Точки с запятой используются для указания конца инструкции , а фигурные скобки используются для указания области действия .
Примеры использования точки с запятой:
// ✅ method execution ends until the semi-colon appears sendAnEmail("hey@well.com"); // ✅ declaration ends until the semi-colon appears String thisWillStoreMyDogName = "Pulgas"; /** * ❌ In this line I forget to write a semicolon after "Florencio" * so the Java compiler will understand that these two lines are the same * instruction, so the instruction: * * String myFishName = "Florencio"String myDogAge = 4; * * doesn't make sense to the compiler and will be marked * as an error */ String myFishName = "Florencio" String myDogAge = 4; public String sendAnEmail(String email) { // ✅ return statement ends until semi-colon appears return "Message sent to: " + email; } public String sendAnSMS(String phone) { // ❌ Java will read the sentence as: // return "Message sent to: " + phone } // so it doesn't make sense to the compiler // if a curly brace } appears at the end of a return // statement. So don't forget the semicolons never! return "Message sent to: " + phone }
Фигурные скобки также заключают ваши фрагменты кода, чтобы позволить повторно использовать вашу логику и создавать именованные процессы, называемые методами . Вы будете использовать {}
для написания определения ваших классов и методов внутри, а также для некоторых операторов, таких как циклы и сравнения.
{}
определяет область действия , так что вы можете получить доступ ко всему, что находится внутри | {} , но если там что-то есть, вы не сможете получить к нему доступ.
Примеры использования фигурных скобок:
public class Cellphone { // your class scope starts here // ✅ These variable will be available for all the methods // inside the class curly braces {} public String myCatName = "Bigotes"; public String getCatName() { // method scope starts here // ✅ You can access to the variable at class level from the // method using the special word `this` only if the // method is under the class scope defined by the class // curly braces return this.myCatName; } // method scope ends here public String getDogName() { // method scope starts here // ✅ You can access to the variables inside the {} of the method String myDogName = "Pulgas"; return myDogName; } // method scope ends here public String getMyDogName() { // method scope starts here // ❌ This method will cause an error because it doesn't know // about the variables of other methods that are out of // its scope return myDocName; } // method scope ends here } // class scope ends here
Типы
Java – это строго типизированный язык . Нам нужно указать типы данных, чтобы сообщить Java, с какими значениями мы работаем. Благодаря этому значения более предсказуемы, и можно обеспечить достаточно места в памяти для хранения наших данных.
Аналогия : Если я скажу вам, что переменная x
хранит число, а переменная y
хранит другое число, когда мы суммируем x + y
, мы можем сделать вывод, что результатом будет число. Но если вы не знаете, какие данные хранит переменная y
, вы не сможете узнать, возможно ли вообще суммировать их с помощью x
. Компилятор Java сталкивается с той же проблемой, поэтому ему нужна наша помощь, чтобы указать тип данных переменных.
Я скопирую и вставлю несколько примеров из w3schools.com
, но вам следует прочитать больше о здесь .
int myNum = 5; // Integer (whole number) float myFloatNum = 5.99f; // Floating point number char myLetter = 'A'; // Character boolean myBool = true; // Boolean String myText = "A text"; // String
Модификаторы доступа
Помните, что Java – это Объектно-ориентированный язык программирования . Одной из основных концепций ООП является инкапсуляция . Модификаторы доступа – это функция Java, которая позволяет нам инкапсулировать поведение объектов (методы) и данные (переменные).
По сути, модификаторы доступа – это ключевые слова, которые определяют видимость (экспозиция или доступность тоже являются хорошими терминами) переменных и методов.
Примечание : переменные и методы класса известны как члены класса.
общедоступный
: Делает участников доступными за пределами класса. Может быть унаследован от подклассов (наследование – еще одна ключевая концепция ООП) и вне пакета.private
: Делает участников доступными только внутри класса. Члены не могут быть унаследованы от “подклассов” и недоступны извне пакета.защищенный
: Делает члены доступными только внутри пакета класса и для подклассов, даже если подкласс находится вне пакета.по умолчанию
: Делает члены класса доступными только на уровне пакета. Подклассы могут наследовать защищенные элементы, только если они находятся внутри пакета.
public class MyPublicClass { // This variable is accesible inside the class only. private myDogName = "Pulgas"; // This method is accesible from the outside of the class and package public void getFirstLetterOfMyDogName() { String letter = this.myDogName.substring(string.length() - 1); return formatText(letter); } /** * This method is for internal usage in the class only. * We don't want others to know what we are doing here. */ private String formatText(String text) { return "Your dog's name first letter is: " + text.toUpperCase(); } /** * This method is accessible at package level * or available to sub-classes */ protected void sayHello() { System.out.println("No, I will say goodbye!"); } /** * This method has a default access modifier, so * it will be available at package level only, * and for subclasses inside the package. */ void sayHello() { System.out.println("Goodbye!"); } }
Давайте посмотрим, что происходит, когда мы пытаемся получить доступ к переменным и методам класса:
// First of all, lets create an object based on the MyPublicClass MyPublicClass objectInstance = new MyPublicClass(); // ✅ Now that the object exists, lets execute this public method objectInstance.getFirstLetterOfMyDogName(); // It works fine because the method is public, so we can access from the outside // ❌ But this method execution is not possible because the method // is privated and it's not available for external usage objectInstance.formatText(); // ❌ Trying to access to a private class variable isn't possible either objectInstance.myDogName;
Я нашел эта замечательная страница . Вы можете проверить это для более глубокого объяснения.
Переменные
Переменные позволяют временно хранить данные в памяти компьютера. Они очень полезны для проведения операций. Вы можете задавать им значения снова и снова.
Создание переменной известно как объявление переменной .
Вы можете объявлять переменные внутри “класса” или внутри “метода” . Когда метод завершен или экземпляр класса собран сборщиком мусора Java (механизм Java для удаления бесполезного материала из памяти) переменная будет удалена из памяти, и вы больше не сможете ее использовать.
Это способ объявления переменной : [тип] [Имя переменной] = [значение];
Переменные, объявленные на уровне класса должны иметь модификатор доступа): [видимость] [тип] [Имя переменной] = [значение];
Имена переменных должны быть в camelCase , который является стилем по соглашению (соглашение – это стиль, которому все следуют).
// ✅ Declare a variable without an initial value. // You can't use it until you set it a value int age; // ✅ You can declare many variables in a single line // if all them are of the same type String address, email, website; // ✅ You can set a value to the variable in this way age = 25; // the "=" is called assignation operator // ✅ Declare a variable with an initial value String name = "unknown user"; // ✅ You can set a new value later name = "Sara"; // You must set compatible types // ✅ This is valid boolean isAnAdult = true; // ❌ But this is not valid because "nop" is a String // and isAnAdult was declared as a boolean type variable isAnAdult = "nop"; // ✅ Class level variables are declared in this way public String myName = "Unknown"; private String myDog = "Pulgas"; protected String myCat = "Bigotes";
Методы
Метод – это структура кода, которая позволяет вам обернуть некоторые инструкции как единый процесс вы можете выполнять, когда вы хотите и когда захотите. Методы будут выполнять ваши потрясающие инструкции, когда вы их выполните. До тех пор они будут находиться в состоянии сна (бездействия).
Это способ выполнения метода: doSomething();
. Как вы можете видеть, вам нужно только написать имя метода, за которым следуют две круглые скобки ()
.
Метод немного сложнее переменной, потому что он может делать больше: он выполняет инструкции, которые вы пишете внутри него .
Метод может получать много значений (или никто), и возвращаемые значения (или ничего).
Это способ отправить значения методу: сделать что-то("с этим текстом");
Это способ получать значения из метода: String();
Значения, которые может получать метод, называются “параметры” или “аргументы” (короче говоря, параметры и аргументы). Вы должны указать тип каждого аргумента . Кроме того, вы должны указать тип возвращаемого значения (используйте void, если вы ничего не хотите возвращать).
Вы можете выполнить метод изнутри другого метода, так что вы можете иметь несколько простых методов для выполнения конкретной задачи и комбинировать их для создания более сложного процесса.
Это структура для объявления метода:
[access modifier] [return value type] [methodName]([args]) { ...method definition }
Давайте рассмотрим несколько примеров:
public void doNothing() { // ✅ nothing will happens when you execute this method } // ✅ This method don't return anything so we declare it as void // Also, this method doesn't receive any arg, so we keep the () empty public void saySomethingNice() { // your instructions go here.. System.out.println("Hi there! You are a nice person!"); } /** * ✅ This method will return a text with the planet name * so we specify String as the return type. * Also, this method doesn't receive any arg, so we keep the () empty */ public String giveMeThePlanetName() { return "Earth"; } /** * ❌ This method will throw an error because the method * return type is specified as void, so the Java compiler * won't allow to return anything, but you are trying to * return something */ public void giveMeTheCountryName() { return "I don't know"; } /** * ✅ This method will return a number with the result of a sum * so we specify int as the return type. * Also, this method receives two args, both int numbers */ public int sumTwoNumbers(int numberA, int numberB) { int result = numberA + numberB; return result; } /** * ❌ This method will throw an error because the method * return type is specified as int, so the Java compiler * expects a compatible return value, but you are not returning anything */ public int giveMeThisPostYear() { } /** * ✅ You can combine methods */ public void sum1and3() { const myResult = sumTwoNumbers(1, 2); // System.out.println method writes a text in the console // you can see a running example in the Classes section System.out.println("This is the result: " + myResult); }
Условные операторы if – else
Эти утилиты очень полезны для проверки данных и определения процессов, поведение которых отличается в зависимости от условий. Например, если вы создаете логин для разрешения и блокирования доступа к платформе, вам необходимо будет проверить правильность имени пользователя и пароля. Если да, разрешите доступ. Если нет, откажите в доступе.
// ✅ This is the common way to use the if-else statements if (true) { // the condition was fullfilled } else { // the condition specified in the if was not fullfilled } // ❌ You can't use only the else statement alone because it depends on the if statement defined rules else { } // ✅ But you can use only the if if ((2 + 2) == 4) { System.out.println("Mathematics are right"); } // ✅ You can omit the curly braces {} if you only have one line per statement if (1 < 8) System.out.println("1 is less than 8"); else System.out.println("1 is not less than 8, it could be equals or bigger"); /** * ❌ Java compiler will detect an error here because se second System.out,println * is not part of the if statement and then it finds the else statement after something that is not * an if statement */ if (1 < 8) System.out.println("1 is less than 8"); System.out.println("isn't ok?"); else System.out.println("1 is not less than 8, it could be equals or bigger"); // ✅ You can fix it in this way if (1 < 8) { System.out.println("1 is less than 8"); System.out.println("isn't ok?"); } else System.out.println("1 is not less than 8, it could be equals or bigger");
Занятия
Это более сложная часть. Это ключевая особенность реализации объектной ориентации Java .
Класс – это структура данных, которая обертывает набор функциональных возможностей в виде методов (поведение) и данных в виде переменных (состояние).
Вы можете думать о классах как о blueprint , который позволяет вам определять объект.
Предположим, мы создаем бота для telegram или facebook messenger, чтобы позволить некоторым пользователям в группе случайным образом выбирать место, где можно хорошо провести время после работы. Как его запрограммировать? С чего начать?
Ну, прежде всего мы должны подумать, какие сущности действительно важны . В этом случае двумя основными сущностями являются Пользователь и Бот.
Красиво, выглядит не очень сложно. Давайте смоделируем Бота, давайте создадим Чертеж бота (Класс бота).
// The first step is to declare our blueprint (our class). // In Java, all the classes name must be in PascalCase, the first letter must be capital public class Bot { }
Хорошо, теперь нашему боту нужны некоторые данные, чтобы выполнить некоторые действия. Давайте добавим некоторые данные конфигурации:
Мы хотим разрешить администратору группы настраивать день недели и час, а остальным пользователям предлагать место, которое выберет бот.
Итак, мы должны объявить переменные для хранения объектных данных , которые известны как состояние объекта :
public class Bot { /** * These variables are private because are for internal usage * we don't want and don't need to make them accesible. * Remember to expose just the very needed and useful data * and functionalities. */ private String botName; // can store a single string: "Mr Bot" private ArrayListproposedPlaces = new ArrayList (); // can store a group of texts: ["Beerhole", "Sam's Bar and Wine", "Super Taco"] private String dayOfWeek; // can store a single string: "Friday" private String hour; // can store a single string: "5:00pm" }
Мило! Теперь у нас есть переменные для хранения наших данных при создании Бота.
Следующий шаг – определить поведение . Итак, что нам нужно? Я думаю, нам нужно создать функциональность для настройки имени бота, установки дня и часа, сохранения предложенных мест и случайного выбора места.
Существует специальный метод, который позволяет нам что-то делать при создании объекта . Этот метод называется constructor , потому что он выполняется во время процесса построения объекта.
Как выглядит объект? Как мы его создаем? вы могли бы спросить. Что ж, мы создаем объект на основе класса, который его определяет. Для этого мы напишем что-то вроде этого :
Бот Бот();
В приведенной выше строке объявляется переменная типа Bot , которая будет содержать новый объект экземпляр класса Boat (тип Boat), что означает, что это объект, созданный и загруженный в память вашего компьютера на основе класса Bot.
Другими словами, бот теперь он живой! и мы называем его нашим суперботом
Вы можете создать множество объектов, основанных на одном и том же классе, и у каждого будут разные данные. Например, вы можете создать кучу ботов типа Bot:
Bot ourSuperBot = new Bot(); Bot superBotBrother = new Bot(); Bot kevinBot = new Bot();
Я хотел показать вам это заранее, потому что хочу, чтобы вы поняли, как работает метод конструктора.
Обратите внимание на эту часть: Bot();
. Это похоже на метод , верно? Ну, на самом деле, так оно и есть. Когда мы создаем новый экземпляр объекта данного класса, мы можем передавать данные через круглые скобки ()
, и эти данные будут получены и обработаны конструктором .
Хорошо, давайте вернемся к нашему проекту бота, чтобы увидеть конструктор в действии.
Мы хотим настроить нашу лодку приближаясь к конструктору . Единственной конфигурацией будет имя бота, день и время.
public class Bot { private String botName; private ArrayListproposedPlaces = new ArrayList (); private String dayOfWeek; private String hour; // This is the constructor. The constructor must have the // class name and must be public. Also, it has not a return type public Bot(String botName, String dayOfWeek, String hour) { // the word "this" allows you to access to variables at class level this.botName = botName; this.dayOfWeek = dayOfWeek; this.hour = hour; } }
Отлично! Теперь мы можем настроить Бота при создании нового экземпляра объекта следующим образом: Но оба ("Мистер Бот", "пятница", "5:20 вечера");
Теперь нам нужно создать метод для сохранения предложенных мест:
public class Bot { private String botName; private ArrayListproposedPlaces = new ArrayList (); private String dayOfWeek; private String hour; } public Bot(String botName, String dayOfWeek, String hour) { this.botName = botName; this.dayOfWeek = dayOfWeek; this.hour = hour; } // Must be public to allow to use it when the object // instance is created. We don't need to return any value // so we declare it as void. We need to receive the place // as an string, and save it in the global variable public void proposeAPlace(String place) { // the add() method allows to add an item at the end of the list this.proposedPlaces.add(place); }
Давайте добавим метод для получения случайно выбранного места Ботом:
public class Bot { private String botName; private ArrayListproposedPlaces = new ArrayList (); private String dayOfWeek; private String hour; public Bot(String botName, String dayOfWeek, String hour) { this.botName = botName; this.dayOfWeek = dayOfWeek; this.hour = hour; } public void proposeAPlace(String place) { this.proposedPlaces.add(place); } /** * We need to return a string (the randomly choosed place) * so we declare the method return type as String. * We don't need to receive anything so we don't specify * anything in the params. And that's all. */ public String chooseAPlace() { Random rand = new Random(); // this is an special object of Java to make random things return this.proposedPlaces.get(rand.nextInt(proposedPlaces.size())); }
Метод выберите место()
вернет только название случайного места, но мы хотим украсить его приятным сообщением типа "Привет! Это мистер Бот. Победитель на этой неделе: Sam's Bar and Wine. Запланируйте эту дату, чтобы встретиться со своими друзьями: пятница, 5:20 вечера"
.
Чтобы сделать это, нам нужно добавить новый метод для украшения текста перед его возвратом, но этот метод будет предназначен только для внутреннего использования, поэтому должен быть закрытым, чтобы пользователи не могли его использовать.
Он получит строку (место) с помощью аргументов, украсит полученную строку и вернет ее оформленной.
Шаг 1: Объявите закрытый метод
public class Bot { ... // this means that there are more code above but we don't want to write it again in this piece of example code private String decorateText(String textToDecorate){ String decoratedText = "The winner this week is: " + textToDecorate; return decoratedText; }
Шаг 2: Используйте наш новый частный метод
public class Bot { private String botName; private ArrayListproposedPlaces = new ArrayList (); private String dayOfWeek; private String hour; public Bot(String botName, String dayOfWeek, String hour) { this.botName = botName; this.dayOfWeek = dayOfWeek; this.hour = hour; } public void proposeAPlace(String place) { this.proposedPlaces.add(place); } /** * We need to update our method to implement the new * decorateText method in order to decorate the text before * returning the choosed place; */ public String chooseAPlace() { Random rand = new Random(); /** * All the proposed places are stored in proposedPlaces * global variable. * proposedPlaces is a list of elements, each element has * a number that defines its position (0, 1, 2, 3) * starting from 0. * To select a place from the list, we need to specify * its position number. * To randomly select a number, we will use the "rand" * object instance to access to a method called * "nextInt()". * We need to tell the "nextInt()" what is the maximum * number of options (if you set 4, the method will * choose a number between 0 and 4). * The maximum number of options is the number of items * in our proposedPlaces list. * To get the number of items in proposedPlaces, we use * the size() method which returns an Integer number with * the count of items in the list. */ int countOfPlaces = proposedPlaces.size(); int randomPlacePosition = rand.nextInt(countOfPlaces); String choosedPlace = this .proposedPlaces .get(randomPlacePosition); String decoratedText = decoratedText(choosedPlace); return decoratedText; } private String decorateText(String textToDecorate){ String decoratedText = "Hi! This is " + this.botName + ". The winner this week is: " + textToDecorate + ". Schedule this date to meet your friends: " + this.dayOfWeek + " " + this.hour; return decoratedText; } }
Мы закончили! Теперь мы можем использовать нашего бота таким образом:
// ✅ Create a bot instance and configure it // Remember that the args we are passing through will be received by the constructor method Bot ourSuperBot = new Bot("Mr Bot", "friday", "5:20pm"); // ✅ Execute the proposeAPlace method as many times you need ourSuperBot.proposeAPlace("Beerhole"); // Peter propose "Beerhole" ourSuperBot.proposeAPlace("Sam's Bar and Wine"); // Sara propose "Sam's Bar and Wine" ourSuperBot.proposeAPlace("Super Taco"); // and you propose "Super Taco" // ✅ Finally, we ask the ourSuperBot object to randomly choose // a place and store it in a new String type variable. String choosedPlace = ourSuperBot.chooseAPlace();
Если вы попытаетесь получить доступ к закрытым участникам, Java скомпилирует вас, остановит и выдаст ошибку:
// ❌ Will throw an error because decorateText is for internal class usage only (private) ourSuperBot.decorateText("Empanadas Juanita"); // ❌ Will throw an error because proposedPlaces is for internal class usage only (private) ourSuperBot.proposedPlaces;
Отлично! Вы можете увидеть этот код в действии благодаря replit.com что позволяет нам редактировать и запускать Java онлайн. Нажмите на зеленую кнопку, чтобы повторно запустить код и посмотреть, как место меняется случайным образом.
Я надеюсь, что этот пост был полезен для вас. Я знаю, что есть несколько лишних деталей. Я сделал это, потому что повторение во время обучения помогает мне запоминать. Извини за это. Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии. Я прочитаю вас как можно скорее, чтобы улучшить пост.
Я пишу это на испанском языке для para la banda que habla español, поэтому, когда я закончу, я обновлю этот пост, чтобы добавить несколько иллюстраций. Спасибо за чтение!
Оригинал: “https://dev.to/chema/programming-handbook-for-java-hg1”