5.3. Встроенные типы языка Java, использование пользовательских классов.

5.3. Встроенные типы языка Java, использование пользовательских классов.

Java статически типизированный язык, что означает когда объявлена переменная с каким-либо типом значения другого типа этой переменной присвоить нельзя, потому что при объявлении типа в оперативной памяти выделяется место для хранения значения объявленного типа. Нарпимер для типа int – 4 байта, float – 4 байта, char – 2 байта, String – это массив значений типа char, число байтов = количество символов * 2.

Наиболее часто используемые типы это: 

int – целое число (0, 1, 10);

float – число с дробной частью (0.1, 0.05, 3.14);

char – символ ('b', 't', 'd');

String – строка ("Привет, как жизнь?", "Какая-нибудь строка", "Строки заключаются в двойные кавычки, а символы в одинарные").

Для экземпляров классов типом считается название класса, например при объявлении экземпляра TextView используется TextView tv = findViewById(R.id.some_id);

Кроме встроенных классов по мере необходимости можно определять и использовать свои классы, что называется пользовательскими классами. Членами пользовательских классов могут быть объекты каких-угодно классов с каким-угодно типом. Например в следующем примере программы используется пользовательский класс Pupil членами которого являются три переменные целочисленного типа – int, в котором хранятся возраст, вес и оценка и одна перменная строкового типа для хранения названия.

В языке Java есть также понятие литералы, это когда значение какого-либо типа используется в коде напрямую, например int a = 10 + b;. 10 это литерал целочисленного типа. Есть ещё один тип для хранения чисел с дробной частью – тип double, и использование литералов числа с дробной частью может выдавать ошибку, потому что возникает неоднозначность и компилятор не знает выделить для литерала 4 байта для хранения как float значения или 8 байт для хранения как double значения, поэтому при использовании литералов типа float после числа следует писать f, например float b = 1.14f + 2;


Создайте новый проект на основе шаблона Empty Activity. В этом примере показывается разработка приложения для динамического добавления виджетов в контейнер на основе вводимых пользователем данных. После написания кода заполните текстовые поля затем нажмите на кнопку "Добавить", после нажатия на кнопку "Добавить" в верхней части экрана должны добавляться новые TextView с введенной вами информацией. Откройте файл MainActivity.java и после блока импортов напишите этот код:

// Пользовательский класс для группирования информации об ученике
class Pupil {
    // Переменная для хранения имени ученика
    String name;
    // Для хранения возраста
    int age;
    // Для хранения веса
    int weight;
    // Для хранения оценки
    int mark;

    // Каждый класс может иметь конструктор для объявления нового экземпляра и передачи необходимых значения для переменных за один раз. Конструкторы в отличии от других функций не имеют типа, а названием для функции служит название класса, затем идут скобки () в которых пишутся принимаемые параметры. В данном случае принимаются три параметра и присваиваются переменным класса
    public Pupil(String name, int age, int weight, int mark) {
        // Ключевое слово this служит
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.mark = mark;
    }
}
В этом же файле напишите код класса MainActivity подобным образом:
public class MainActivity extends AppCompatActivity {
    // Константы обяъвляются также как и переменные только с ключевым словом final
    final int someFinal = 1;
    // Пременные для хранения целого числа,
    int someInt = 0;
    // числа с дробной частью,
    float someFloat = 0.9f;
    // одного символа,
    char someChar = 'a';
    // строки.
    String someString = "Hello my name is Khurshed";
    // Тип переменной container равен LinearLayout
    LinearLayout container;

    // Ссылки на поля с текстом для добавления в массив
    EditText nameTxt;
    EditText weightTxt;
    EditText ageTxt;
    EditText markTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        container = findViewById(R.id.container);

        // Объявление массива типа ArrayList для хранения объектов класса Pupil
        final ArrayList<Pupil> pupils = new ArrayList<>();
        // Добавление новых элементов в массив pupils осуществляется через метод add() класса ArrayList
        pupils.add(new Pupil("Ibrohim", 20, 85, 5));
        pupils.add(new Pupil("Abdurahmon", 18, 90, 6));
        pupils.add(new Pupil("Khurshed", 25, 80, 4));

        // Цикл for для итерации через все элементы добавленные в массив pupils
        for (int i = 0; i < pupils.size(); i++) {
            TextView tv = new TextView(this);
            String s = String.format("Имя: %s, Возраст: %d, Вес: %d, Оценка: %d", pupils.get(i).name, pupils.get(i).age, pupils.get(i).weight, pupils.get(i).mark);
            tv.setText(s);
            container.addView(tv);
        }

        // Нахождение объектов EditText из файла макета
        nameTxt = findViewById(R.id.name);
        weightTxt = findViewById(R.id.weight);
        ageTxt = findViewById(R.id.age);
        markTxt = findViewById(R.id.mark);

        // Нахождение кнопки из файла макета
        Button addToList = findViewById(R.id.addPupil);

        // Присваивание обработчик события click для кнопки
        addToList.setOnClickListener(new View.OnClickListener() {
            // Код обработки события клика на кнопке
            @Override
            public void onClick(View v) {
                // Создание нового объекта класса Pupil, путём получения необходимых значений с EditText полей
          Pupil p = new Pupil(
           nameTxt.getText().toString(),
           Integer.parseInt(ageTxt.getText().toString()),
           Integer.parseInt(weightTxt.getText().toString()),
           Integer.parseInt(markTxt.getText().toString())
          );
// Добавление объекта класса Pupil в массив (ArrayList)
           pupils.add(p);
// Программное создание нового TextView
            TextView tv = new TextView(MainActivity.this);
// Подготовка строки для указания в качестве текста для TextView
            String s = String.format("Имя: %s, Возраст: %d, Вес: %d, Оценка: %d", p.name, p.age, p.weight, p.mark);

// Установка нового значения свойства text переменной tv.
            tv.setText(s);
// Показ сообщения об успешном добавлении новой записи в список
           Toast.makeText(MainActivity.this, "Добавлена новая запись", Toast.LENGTH_SHORT).show();
             // Добавляем новый TextView в котейнер
              container.addView(tv);
             // Очищаем текстовые поля от введенных текстов
                nameTxt.setText("");
                weightTxt.setText("");
                ageTxt.setText("");
                markTxt.setText("");
            }
        });
    }
}

Разметку файла res/layout/activity_main.xml напишите так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!--Этот контейнер необходим для показа добавляемых виджетов-->
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"></LinearLayout>
    </ScrollView>
    <!--LinearLayout размещения полей ввода-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fefefe"
        android:orientation="vertical"
        android:padding="10dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <!--TextInputLayout служит для показа подсказки текстового поля и анимирования при получения фокуса со стороны текстового поля. Подсказка указывается через атрибут hint-->
            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:hint="Имя">
                <!--Внутри виджета TextInputLayout размещается TextInputEditText, который и служит полем для ввода текста-->
                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:hint="Возраст">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/age"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </com.google.android.material.textfield.TextInputLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:hint="Вес">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/weight"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:hint="Оценка">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/mark"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </com.google.android.material.textfield.TextInputLayout>
        </LinearLayout>

        <Button
            android:id="@+id/addPupil"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp"
            android:text="Добавить" />
    </LinearLayout>
</LinearLayout>
Запустите проект и посмотрите на результат.