Урок 33: Введение в параметризацию. (Generics). 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Урок 33: Введение в параметризацию. (Generics).



До, и после появления дженериков.

 

import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String[] args) {
   System. out. println ("////////// Java 5 //////////");
   List animals = new ArrayList ();
   animals.add ("can"); // add. - добавить значение Object "can" в         animals. Index элемента в массиве - 0.
  
animals.add ("dog"); // add. - добавить значение Object "dog" в         animals. Index элемента в массиве - 1.
  
animals.add ("frog"); // add. - добавить значение Object "frog" в         animals. Index элемента в массиве - 2.
   /*
   get - получаем элемент "dog" из массива по index.
   Используем DOWNcasting - Нисходящее преобразование.
   Нисходящее преобразование происходит явно, т.е. принудительно
   как int = (int) long и float = (float) double.
   */

   String animal = (String) animals.get (1);
   System. out. println (animal);

   System. out. println ("////////// С появлением дженериков //////////");

   List<String> animals2 = new ArrayList<String> ();
   animals2.add ("can"); // add. - добавить значение <String> "can" в         animals. Index элемента в массиве - 0.
  
animals2.add ("dog"); // add. - добавить значение <String> "dog" в         animals. Index элемента в массиве - 1.
  
animals2.add ("frog"); // add. - добавить значение <String> "frog" в         animals. Index элемента в массиве - 2.
   /*
   get - получаем элемент "dog" из массива по index.
  !!! НЕ!!! используем DOWNcasting - Нисходящее преобразование.
   Так как есть дженерик < String >.
   */

   String animal2 = animals2.get(1);
   System. out. println (animal2);


}
}

 

 

Вывод в консоль:

 

////////// Java 5 //////////

dog

////////// С появлением дженериков //////////

dog

 

 

Создаем Свой Новый класс ourAnimal

 

import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String[] args) {
   System. out. println ("////////// Java 5 //////////");
   /*
   Создаем Свой Новый класс Animal и элемент ourAnimal.
   Кладем его как Объект в массив Object.
   Но преобразовать его в String и вывести его на печать, мы не сможем.
    */
  
List animals = new ArrayList ();
   Animal ourAnimal = new Animal ();
   animals.add ("can"); // add. - добавить значение Object "can" в         animals. Index элемента в массиве - 0.
  
animals.add ("dog"); // add. - добавить значение Object "dog" в         animals. Index элемента в массиве - 1.
  
animals.add ("frog"); // add. - добавить значение Object "frog" в         animals. Index элемента в массиве - 2.
  
animals.add (ourAnimal);

   System. out. println ("////////// С появлением дженериков //////////");

   List<String> animals2 = new ArrayList<String> ();
   /*
   Создали Свой Новый класс Animal и элемент ourAnimal.
  !!! НО!!! положить его как Объект в массив ArrayList<String>
   мы НЕ СМОЖЕМ.
   */

   animals2.add ("can"); // add. - добавить значение <String> "can" в         animals. Index элемента в массиве - 0.
  
animals2.add (" dog "); // add. - добавить значение < String > " dog " в     animals. Index элемента в массиве - 1.
  
animals2.add ("frog"); // add. - добавить значение <String> "frog" в         animals. Index элемента в массиве - 2.
  
animals2.add (ourAnimal); //!!!ОШИБКА!!!
}
}
class Animal{

}

 

Вывод в консоль:

 

Information:java: Some messages have been simplified; recompile with -Xdiags:verbose to get full output

Information:java: Errors occurred while compiling module 'lessons'

Information:javac 1.8.0_171 was used to compile java sources

Information:13.08.2018 10:09 - Compilation completed with 1 error and 0 warnings in 1s 571ms

U:\Java\lessons\src\Test.java

Error:(31, 17) java: no suitable method found for add(Animal)

method java.util.Collection.add(java.lang.String) is not applicable

(argument mismatch; Animal cannot be converted to java.lang.String)

method java.util.List.add(java.lang.String) is not applicable

(argument mismatch; Animal cannot be converted to java.lang.String)

Information:java: U:\Java\lessons\src\Test.java uses unchecked or unsafe operations.

Information:java: Recompile with -Xlint:unchecked for details.

 

 

import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String[] args) {
   ////////// Java 5 //////////

   List animals = new ArrayList ();
   animals.add ("can"); // add. - добавить значение Object "can" в
   animals. Index элемента в массиве - 0.
  
animals.add ("dog"); // add. - добавить значение Object "dog" в
   animals. Index элемента в массиве - 1.
  
animals.add ("frog"); // add. - добавить значение Object "frog" в
   animals. Index элемента в массиве - 2.

   ////////// Java 5 (С появлением дженериков "<String>") //////////

   List<String> animals2 = new ArrayList<String> ();
   animals2.add ("can"); // add. - добавить значение <String> "can" в
   animals. Index элемента в массиве - 0.
  
animals2.add ("dog"); // add. - добавить значение <String> "dog" в
   animals. Index элемента в массиве - 1.
  
animals2.add ("frog"); // add. - добавить значение <String> "frog" в
   animals. Index элемента в массиве - 2.

   ////////// Java 7 //////////

   List<String> animals3 = new ArrayList<> (); //new ArrayList<> ();
МОЖНО ПИСАТЬ БЕЗ String.
  
animals3.add ("can"); // add. - добавить значение <String> "can" в
   animals. Index элемента в массиве - 0.
  
animals3.add ("dog"); // add. - добавить значение <String> "dog" в
   animals. Index элемента в массиве - 1.
  
animals3.add ("frog"); // add. - добавить значение <String> "frog" в
   animals. Index элемента в массиве - 2.
}
}

 

Wildcards (Generics).

 

 

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Test {
public static void main(String[] args) {
   List<Animal> listOfAnimal = new ArrayList<> ();
   listOfAnimal.add (new Animal (1));
   listOfAnimal.add (new Animal (2));

   test (listOfAnimal);
}
private static void test(List<Animal> list){
   for (Animal animal: list) {
       System. out. println ("new Animal (id: " + animal + ")");
   }
}
}

 

 

public class Animal {
private int id;

public Animal(int id){
   this. id = id;
}

/*
Создав конструктор
public Animal(int id){
   this.id = id;
}
мы удалили конструктор по - умолчанию
и поэтому класс Dog выдаст ошибку.
Надо создать дефолтный конструктор по-умолчанию.
public Animal(){
}
*/

public Animal(){

}

public String toString(){

   return String. valueOf (id);
}
}

 

 

public class Dog extends Animal {
}

 

 

Вывод в консоль:

 

new Animal (id: 1)

new Animal (id: 2)

 

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Test {
public static void main(String[] args) {
   List<Animal> listOfAnimal = new ArrayList<> ();
   listOfAnimal.add (new Animal (1));
   listOfAnimal.add (new Animal (2));

   List<Dog> listOfDogs = new ArrayList<> ();
   listOfAnimal.add (new Dog ());
   listOfAnimal.add (new Dog ());

   test (listOfAnimal);
//   test(listOfDogs); // Почему - то и без него выводятся третья и четвертая строки на экран.

   /*
   Чтобы передать Объект "new Dog" () в метод test (listOfDogs); с параметром "List<Animal> list"
   private static void test(List<Animal> list){
   for (Animal animal: list) {
       System.out.println ("new Animal (id: " + animal + ")");
       }
   }
   мы должны изменить параметр метода <Animal> на <? extends Animal>.
    */

}
private static void test(List<? extends Animal> list){
   for (Animal animal: list) {
       animal.eat ();
   }
}
/*
Если мы пишем <? super Animal>, то мы разрешаем подавать на вход метода лист, содержащий объекты класса Animal и всех суперклассов (родительских классов) класса Animal. В нашем случае, у класса Animal только один родительский класс - класс Object. То есть, в этом листе могут хранится объекты класса Animal и объекты класса Object. Почему же тогда мы не можем вызывать методы класса Animal внутри метода? А по той причине, что мы разрешаем хранить в этом листе объекты класса Object, у которых нет методов, определенных в классе Animal. Поэтому всегда, когда в wildcard мы пишем super, мы будем иметь доступ только к методам самого общего родителя, класса Object.
*/
}

 

public class Animal {
private int id;

public Animal(int id){
   this. id = id;
}

/*
Создав конструктор
public Animal(int id){
   this.id = id;
}
мы удалили конструктор по-умолчанию
и поэтому класс Dog выдаст ошибку.
Надо создать дефолтный констрктор по-умолчанию.
public Animal(){
}
*/

public Animal(){

}

public void eat(){
   System. out. println ("Animal is eating... ");
}

public String toString(){

   return String. valueOf (id);
}
}

 

 

public class Dog extends Animal {
}

 

 

Вывод в консоль:

 

Animal is eating...

Animal is eating...

Animal is eating...

Animal is eating...

 

 

Урок 35: Анонимные классы.

 

 

 

class Animal{
public void eat(){
   System. out. println ("Animal is eating...");
}
}

public class Test {
public static void main(String[] args) {
   Animal animal = new Animal ();
   animal.eat ();
}
}

 

 

Вывод в консоль:

 

Animal is eating...

 

 

Переопределяем метод eat, через создание класса OtherAnimal.

 

class Animal{
public void eat(){
   System. out. println (" Animal is eating...");
}
}

/*
Переопределяем метод eat,
через создание класса OtherAnimal.
*/

class OtherAnimal {
public void eat(){
   System. out. println ("Other animal is eating...");
}
}

public class Test {
public static void main(String[] args) {
   Animal animal = new Animal ();
   animal.eat ();

   OtherAnimal otherAnimal = new OtherAnimal ();
   otherAnimal.eat ();
}
}

 

 

Вывод в консоль:

 

Animal is eating...

Other animal is eating...

 

 

Тот же код, но с анонимным классом.

 

class Animal{
public void eat(){
   System. out. println ("Animal is eating...");
}
}

public class Test {
public static void main(String[] args) {
   Animal animal = new Animal ();
   animal.eat ();

/*Создаем Объект АНОНИМНОГО класса НАСЛЕДНИКА от класса Animal.!!! Не объект класса Animal, а его НАСЛЕДНИК (по типу class Xxx extends Animal{})..*/
   Animal animal2 = new Animal () {
       @Override
       public void eat() {
           System. out. println ("Other animal is eating...");
       }
   };
   animal2.eat ();
}
}

 

Вывод в консоль:

 

Animal is eating...

Other animal is eating...

 

 

Вариант использования без АНОНИМНОГО класса.

 

interface AbleToEat {
public void eat();
}

class Animal implements AbleToEat{
@Override
public void eat(){
   System. out. println ("Do eat!!!");
}
}

public class Test {
public static void main(String[] args) {
  AbleToEat ableToEat = new Animal ();
  ableToEat.eat ();
}
}

 

 

Вывод в консоль:

 

Do eat!!!

 

 

Вариант использования с АНОНИМНЫМ классом.

 

 

interface AbleToEat {
public void eat();
}

public class Test {
public static void main(String[] args) {
  AbleToEat ableToEat = new AbleToEat () {
      @Override
      public void eat() {
          System. out. println ("Do eat!!!");
      }
  };
}
}

 

 

Вывод в консоль:

 

Do eat!!!

 

 

Урок 36: Чтение из файла.

Считывание данных с клавиатуры.

 

 

import java.util.Scanner;

public class ReadingFomFile {
public static void main(String[] args) {
   Scanner scanner = new Scanner (System. in);
   String input = scanner.nextLine ();
   System. out. println (" Вывел на экран: " + input);
}
}

 

Вывод в консоль:

 

ASDF

Вывел на экран: ASDF

 

Создаем файл"test" с каким-нибудь Строковым (String) "текстом

" qwer

 asdf

 zxcv"

на Рабочем столе.

 

Перемещаем файл "test" в наш код.
Т.е. создаем абстракцию для работы с файлом.
Меняем слэши в пути к файлу в Windows: "\" -> "/"
C:\Users\Dragosh\Desktop\test
Чтобы не делать это вручную,
String path = "C:/Users/Dragosh/Desktop/test.txt";
делаем универсальную
для разных ОС систему разделителей в Пути к файлу "/" или "/".
Статическая переменная "separator" у каждой ОС своя.НО, чтобы вообще не использовать запись Пути к файлу, нужно создать файл "text2" в Корневой папке Проекта с программой,читающей файл.МеняемString path = "C:/Users/Dragosh/Desktop/test2.txt";наString path = "test2.txt";


   

 

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadingFomFile {
public static void main(String[] args) throws FileNotFoundException {
  
String separator = File. separator;
   String path = "C:" + separator + "Users" + separator + "Dragosh" +         separator + "Desktop" + separator + "test.txt";
   /*
   В Windows имя файла писать " ОБЯЗАТЕЛЬНО " с раширением "test.txt".
    */
  
File file = new File (path);

   /*
   Кампилятор выдаст ошибку, чтобы
   мы записали "throws FileNotFoundException" в
   public static void main(String[] args) throws FileNotFoundException {}
    */
  
Scanner scanner = new Scanner (file);

   /*
   Считываем данные из файла.
   "hasNextLine" для считывания строк.
    */
  
while (scanner.hasNextLine ()){
       System. out. println (scanner.nextLine ());
   }

   /*
  !!! ОБЯЗАТЕЛЬНО ЗАКРЫТЬ ПОТОК scanner!!!
    */
      
scanner.close ();
}
}

 

 

Вывод в консоль:

 

qwer

asdf

zxcv

 

 

Создаем файл"test" с каким-нибудь числовым (int) "текстом

"1 2 3" на Рабочем столе.

 

 

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class ReadingFomFile {
public static void main(String[] args) throws FileNotFoundException {
   String separator = File. separator;
   String path = "C:" + separator + "Users" + separator + "Dragosh" + separator + "Desktop" + separator + "test.txt";
   File file = new File (path);

   Scanner scanner = new Scanner (file);
   // Считаем строку чисел (String).
  
String line = scanner.nextLine ();

   /*
    Создаем массив String[],
    и помещаем в него разделенную на "слова" Строку.
    метод split (" "); делит Строку на слова.
    Его аргумент - знак для деления (Пробел).
    Если используем другой знак препинания (. или " или иной)
    обязательно экранируем его знаком - \.
    */

   String[] numbers = line.split (" ");
   System. out. println (Arrays. toString (numbers));

   // Выводим числа на экран.
  
for (String s: numbers) {
       System. out. println (Integer. parseInt (s));
   }

   /*
  !!! ОБЯЗАТЕЛЬНО ЗАКРЫТЬ ПОТОК scanner!!!
    */
      
scanner.close ();
}
}

 

 

Вывод в консоль:

 

[1, 2, 3]

1

2

3

 

 



Поделиться:


Последнее изменение этой страницы: 2020-12-17; просмотров: 175; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.249.105 (0.108 с.)