Вопросы и ответы it-диктант 13 сентября 2021 год

Невозможно создавать переменные универсального типа.

Вы не можете использовать такие выражения, как new T (…), new T или T.class. Например, метод построения Pair <T> ниже недопустим:

После стирания типа T был изменен на Object, и он не предназначался для вызова Object (). После появления Java 8 лучшим решением было позволить вызову предоставлять выражение конструктора, например:

Метод makePair получает объект типа Supplier <T>, который представляет собой функциональный интерфейс, представляющий функцию без параметров, но с типом возвращаемого значения T:

Этот метод больше подходит для Java 8. Если читатели не очень знакомы с Java 8, вы можете сначала взглянуть на ссылки на методы в Java 8. Фактически, лямбда-выражение сокращено до формы ссылки на метод, которая так — так называемый синтаксический сахар. Но в традиционном мышлении мы склонны вызывать метод Class.newInstance через отражение для создания универсальных объектов:

Но, к сожалению, подробности посложнее и не назовешь. Выражение T.class недопустимо, потому что после стирания тип становится Object.class. Таким образом, чтобы получить объект класса, он должен быть разработан с помощью следующих методов:

Затем используйте следующий метод для вызова:

Обратите внимание, что сам класс Class является универсальным. Например, String.class — это объект класса

Следовательно, метод makePair может определить тип пары.

Сквозной пример по классам


####################################################
## 5. Классы
####################################################

# Чтобы получить класс, мы наследуемся от object.
class Human(object):

# Атрибут класса. Он разделяется всеми экземплярами этого класса
species = «H

sapiens»

# Обычный конструктор, вызывается при инициализации экземпляра класса
# Обратите внимание, что двойное подчёркивание в начале и в конце имени
# означает объекты и атрибуты, которые используются Python, но находятся
# в пространствах имён, управляемых пользователем.
# Не придумывайте им имена самостоятельно.
def __init__(self, name):
# Присваивание значения аргумента атрибуту класса name
self.name = name

# Метод экземпляра. Все методы принимают self в качестве первого аргумента
def say(self, msg):
return «{name}: {message}».format(name=self.name, message=msg)

# Метод класса разделяется между всеми экземплярами
# Они вызываются с указыванием вызывающего класса в качестве первого аргумента
@classmethod
def get_species(cls):
return cls.species

# Статический метод вызывается без ссылки на класс или экземпляр
@staticmethod
def grunt():
return «*grunt*»

# Инициализация экземпляра класса
i = Human(name=»Иван»)
print(i.say(«привет»)) # Выводит: «Иван: привет»

j = Human(«Пётр»)
print(j.say(«Привет»)) # Выводит: «Пётр: привет»

# Вызов метода класса
i.get_species() #=> «H

sapiens»

# Изменение разделяемого атрибута
Human.species = «H. neanderthalensis»
i.get_species() #=> «H. neanderthalensis»
j.get_species() #=> «H. neanderthalensis»

# Вызов статического метода
Human.grunt() #=> «*grunt*»

4.5
10
голоса

Рейтинг статьи

Пример инструкции

Java содержит инструкцию с именем instanceof. Она может определить, является ли данный объект экземпляром некоторого класса:

Car car = new Car();

boolean isCar = car instanceof Car;

После выполнения этого кода переменная isCar будет содержать значение true.

Инструкция instanceof также может использоваться для определения того, является ли объект экземпляром суперкласса своего класса. Вот пример, который проверяет, является ли объект Car экземпляром Vehicle:

Car car = new Car();

boolean isVehicle = car instanceof Vehicle;

Предполагая, что класс Car расширяет (наследует от) класс Vehicle, переменная isVehicle будет содержать значение true после выполнения этого кода. Объект Car также является объектом Vehicle, поскольку Car является подклассом Vehicle.

Как видите, инструкция instanceof может использоваться для изучения иерархии наследования. Тип переменной, используемый с ней, не влияет на ее результат. Посмотрите на этот пример:

Car car = new Car();

Vehicle vehicle = car;

boolean isCar = vehicle instanceof Car;

Несмотря на то, что переменная транспортного средства имеет тип Vehicle, объект, на который она в конечном итоге указывает в этом примере, является объектом Car. Поэтому экземпляр транспортного средства автомобиля будет оценен как истинный.

Вот тот же пример, но с использованием объекта Truck вместо объекта Car:

Truck truck = new Truck();

Vehicle vehicle = truck;

boolean isCar = vehicle instanceof Car;

После выполнения этого кода isCar будет содержать значение false. Объект Truck не является объектом Car.

Объявление

Объявляется с использованием ключевого слова extends:

public class Vehicle {
    protected String licensePlate = null;

    public void setLicensePlate(String license) {
        this.licensePlate = license;
    }
}
public class Car extends Vehicle {
    int numberOfSeats = 0;

    public String getNumberOfSeats() {
        return this.numberOfSeats;
    }
}

Класс Car в этом примере расширяет класс Vehicle, то есть Car наследуется от Vehicle. Поскольку Car расширяет Vehicle, защищенное поле licensePlate из Vehicle наследуется Car. Когда licensePlate наследуется, оно становится доступным внутри экземпляра Car.

В поле licensePlate на самом деле не ссылаются из класса Car в приведенном выше коде, но можно, если мы захотим:

public class Car extends Vehicle {
    int numberOfSeats = 0;

    public String getNumberOfSeats() {
        return this.numberOfSeats;
    }

    public String getLicensePlate() {
        return this.licensePlate;
    }
}

Ссылка происходит внутри метода getLicensePlate(). Во многих случаях имело бы смысл поместить этот метод в класс Vehicle, где находится поле licensePlate.

Определение связей между геометрическими объектами

Тип данных geometry предоставляет множество встроенных методов, с помощью которых можно определить связи между двумя объектами типа geometry .

Определение возможного наличия одинакового набора точек в двух объектахSTEquals

Определение отсутствия перекрытия двух объектовSTDisjoint

Определение пересечения двух объектовSTIntersects

Определение соприкосновений двух экземпляровSTTouches

Определение перекрещивания двух экземпляровSTOverlaps

Определение пересечения двух экземпляровSTCrosses

Определение нахождения одного экземпляра в другомSTWithin

Определение содержания одного экземпляра другимSTContains

Определение перекрещивания одного экземпляра с другимSTOverlaps

Определение пространственной связи двух экземпляровSTRelate

Определение кратчайшего пути между точками двух геометрических экземпляровSTDistance

Upcasting и Downcasting

Вы всегда можете привести объект подкласса к одному из его суперклассов, либо из типа суперкласса к типу подкласса, но только если объект действительно является экземпляром этого подкласса (или экземпляром подкласса этого подкласса). Таким образом, этот пример downcasting действителен:

Car     car     = new Car();

// upcast to Vehicle
Vehicle vehicle = car;

// downcast to car again
Car     car2    =(Car) vehicle;

Однако следующий приведенный ниже пример недопустим. Компилятор примет его, но во время выполнения, выдаст исключение ClassCastException.

Truck   truck   = new Truck();

// upcast to Vehicle
Vehicle vehicle = truck;

// downcast to car again
Car     car     =(Car) vehicle;

Объект «Грузовик» может быть передан объекту «Автомобиль», но позже он не может быть передан объекту «Автомобиль». Это приведет к исключению ClassCastException.

Живой пример

Он работает в текущем Chrome и текущем Firefox. Говорят, в нынешнем Edge это не работает.

Год 2019 ответ

Оператор присваивания объекта :

  • 47 obj + = звучит круто
  • 3 phpstorm рекомендует использовать и вместо , должно ли быть так в 2018 году?
  • @jimsmith: Не понимаю, почему вы это говорите. Вам нужно мое мнение? Преимущество интерпретатора — возможность изменять все в реальном времени в консоли. Я не люблю потому что это устраняет это преимущество. Каждый раз, когда я его использовал, это мешало развитию.
  • 11 Настоящий программист будет ценить развлечения, чтобы облегчить трудную профессию. Твой часть заслуживает Спасибо, ты сделал мой день. Лучший ответ +1
  • 1 LOL .. Я просто использовал это спонтанно (конечно, не сработало), прежде чем я оказался здесь

Я полюбил LoDash / Underscore при написании больших проектов.

Добавление или же все это твердые ответы на чистом JavaScript. Однако библиотеки LoDash и Underscore предоставляют множество дополнительных удобных функций при работе с объектами и массивами в целом.

предназначен для массивов, а не для объектов.

В зависимости от того, что вы ищете, есть две определенные функции, которые может быть полезно использовать и которые дают функциональность, аналогичную ощущению . Для получения дополнительной информации проверьте документацию, там есть отличные примеры.

_.defaults

Второй объект содержит значения по умолчанию, которые будут добавлены к базовому объекту, если они не существуют. значения будут скопированы, если ключ уже существует.

$ .extend

Кроме того, возможно, стоит упомянуть jQuery.extend, он работает аналогично _.merge и может быть лучшим вариантом, если вы уже используете jQuery.

Object.assign ()

Возможно, стоит упомянуть ES6 / ES2015 Object.assign, он работает аналогично _.merge и может быть лучшим вариантом, если вы уже используете полифил ES6 / ES2015, такой как Babel, если вы хотите использовать полифил самостоятельно.

  • Я считаю, что _.merge теперь _.extend (пункт назначения, другие)
  • Ах ты прав, — более универсальный псевдоним, поскольку библиотека подчеркивания все еще использует не . Я обновлю свой ответ.

Вы можете использовать любой из них (при условии, что key3 — это фактический ключ, который вы хотите использовать)

или же

Если key3 — переменная, вам следует сделать:

После этого запрашивая вернет значение , буквальный .

  • 7 Это не массив, а объект. Массивы JS индексируются только целыми числами. Попробуйте сделать arr.length, и он вернет 0. Подробнее об этом: less-broken.com/blog/2010/12/…
  • Ссылка @ DevAntoine недоступна. Если вы хотите получить «длину» этого типа массива, используйте: Object.keys (your_array) .length. Подробнее об этой проблеме см. Stackoverflow.com/questions/21356880/array-length-returns-0
  • Можно также просто перезаписать свойство длины создаваемого массива. Установка var myarray &lsqb;»length»&rsqb; = numArrayFields решает эту проблему для меня. Предполагая, что вы отслеживаете количество полей, которые каким-то образом добавляете в свой массив.

потому что ваш arr на самом деле не массив … Это объект-прототип. Реальный массив будет:

но это все равно не так. На самом деле это должно быть:

30 Это для массивов, а не для объектов.

Основы

Когда класс наследует от суперкласса, он наследует части методов и полей суперкласса. Подкласс также может переопределять (переопределять) унаследованные методы. Поля не могут быть переопределены, но могут быть «затенены» в подклассах. Как все это работает, рассказывается далее в этом тексте.

Что унаследовано?

Когда подкласс расширяет суперкласс в Java, он наследует все защищенные и открытые поля и методы, которые становятся его частью, как если бы он объявил их сам. Защищенные и открытые поля можно вызывать и ссылаться так же, как на методы, объявленные непосредственно в нем.

Поля и методы с модификаторами доступа по умолчанию (пакет) могут быть доступны для подклассов, только если он находится в том же пакете, что и суперкласс. На частные поля и методы суперкласса никогда нельзя ссылаться непосредственно, только через методы, достижимые из подкласса (например, методы по умолчанию (пакет), защищенные и публичные).

Конструкторы не наследуются подклассами, но конструктор подкласса должен вызывать конструктор в суперклассе.

Единичное наследование

Механизм наследования позволяет наследовать класс только от одного суперкласса (единичное наследование). В некоторых языках программирования, таких как C ++, подкласс может наследоваться от нескольких суперклассов (множественное).

Так как множественный вариант может создать некоторые странные проблемы, например, суперклассы содержат методы с одинаковыми именами и параметрами, он был исключен в Java.

Что такое ключевое слово instanceof в Java?

Оператор java instanceof используется для проверки того, является ли объект экземпляром указанного типа (класс, подкласс или интерфейс).

Instanceof также известен как оператор сравнения типов, потому что он сравнивает экземпляр с типом. Возвращает либо true, либо false. Если мы применяем оператор instanceof к любой переменной, которая имеет нулевое значение, она возвращает false.

Давайте воспользуемся оператором instanceof, чтобы проверить, действительно ли млекопитающее является животным, а собака на самом деле животным.

interface Animal{}
class Mammal implements Animal{}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

Результат будет получен:

Классное внимание

  1. У класса может быть только один публичный класс, но может быть любое количество закрытых классов.

  2. Как правило, файл имеет только один класс, и он не используется для помещения нескольких классов в один файл.

  3. Домен экземпляра (то есть атрибут объекта) не рекомендуется использовать для модификации public, а частную модификацию следует использовать в максимально возможной степени, а соответствующие методы set и get используются для присвоения и значения.

  4. Конструктор не может использовать конструктор для сброса домена экземпляра существующего объекта. Использование конструктора должно быть при инициализации объекта, то есть сопровождаться вызовом нового

  5. В классе не называйте переменные с тем же именем, что и домен экземпляра во всех методах

Создание новых объектов

JavaScript содержит набор встроенных объектов. Также вы можете создавать свои объекты. Начиная с JavaScript 1.2, вы можете создавать объект с помощью инициализатора объекта. Другой способ —  создать функцию-конструктор и сделать экземпляр объекта с помощью этой функции и оператора .

Помимо создания объектов с помощью функции-конструктора вы можете создавать объекты и другим, особым способом. Фактически, вы можете записать объект синтаксически, и он будет создан интерпретатором автоматически во время выполнения. Эта синтаксическая схема приведена ниже:

здесь  — это имя нового объекта, каждое  — это идентификатор (имя, число или строковый литерал), и каждый  — это значения, назначенные . Имя и ссылка объекта на него необязательна; если далее вам не надо будет ссылаться на данный объект, то вам не обязательно назначать объект переменной

(Обратите внимание, что вам потребуется обернуть литерал объекта в скобки, если объект находится в месте, где ожидается инструкция, чтобы интерпретатор не перепутал его с блоком.)

Если объект создан при помощи инициализатора объектов на высшем уровне скрипта, то JavaScript интерпретирует объект каждый раз, когда анализирует выражение, содержащее объект, записанный как литерал. Плюс, если пользоваться функцией инициализатором, то он будет создаваться каждый раз, когда функция вызывается.

Следующая инструкция создаёт объект и назначает его переменной , когда выражение  истинно.

Следующий пример создаёт объект с тремя свойствами. Заметьте, что свойство  — это также объект со своими собственными свойствами.

Вы также можете использовать инициализатор объекта для создания массивов. Смотрите .

До JavaScript 1.1 не было возможности пользоваться инициализаторами объекта. Единственный способ создавать объекты — это пользоваться функциями-конструкторами или функциями других объектов, предназначенных для этой цели. Смотрите .

Другой способ создать объект в два шага описан ниже:

  1. Определите тип объекта, написав функцию-конструктор. Название такой функции, как правило, начинается с заглавной буквы.
  2. Создайте экземпляр объекта с помощью ключевого слова .

Чтобы определить тип объекта создайте функцию, которая определяет тип объекта, его имя, свойства и методы. Например предположим, что вы хотите создать тип объекта для описания машин. Вы хотите, чтобы объект этого типа назывался , и вы хотите, чтобы у него были свойства make, model, и year. Чтобы сделать это, напишите следующую функцию:

Заметьте, что используется чтобы присвоить значения (переданные как аргументы функции) свойствам объекта.

Теперь вы можете создать объект, называемый , следующим образом:

Эта инструкция создаёт объект типа Car со ссылкой и присваивает определённые значения его свойствам. Значением станет строка «Eagle»,  — это целое число 1993, и так далее.

Вы можете создать столько объектов сколько нужно, просто вызывая  . Например:

Объект может иметь свойство, которое будет другим объектом. Например, далее определяется объект типа  следующим образом:

и затем создать два новых экземпляра объектов как показано далее:

Затем, вы можете переписать определение и включить в него свойство , которому назначить объект  следующим образом:

Затем, чтобы создать экземпляры новых объектов, выполните следующие инструкции:

Заметьте, что вместо того, чтобы передавать строку, литерал или целое число при создании новых объектов, в выражениях выше передаются объекты и как аргумент функции. Теперь, если вам нужно узнать имя владельца car2, это можно сделать следующим образом:

Заметьте, что в любое время вы можете добавить новое свойство ранее созданному объекту. Например, выражение

добавляет свойство к car1, и устанавливает его значение равным «black.» Как бы там ни было, это не влияет на любые другие объекты. Чтобы добавить новое свойство всем объектам одного типа, вы должны добавить свойство в определение типа объекта .

Объекты также можно создавать с помощью метода . Этот метод очень удобен, так как позволяет вам указывать объект прототип для нового вашего объекта без определения функции конструктора.

Создание классов

Оператор класса создает новое определение класса. Имя класса следует сразу за ключевым словом class, за которым следует двоеточие:

class ClassName:
   'Optional class documentation string'
   class_suite
  • Класс имеет строку документации, к которой можно получить доступ через ClassName .__ doc__ .
  • Class_suite состоит из всех компонентов утверждений, определяющих член класса, атрибуты данных и функцию.

Пример

Ниже приведен пример простого класса Python 

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
  • Переменная empCount является переменной класса, значение которой является общим для всех экземпляров этого класса. Доступ к нему можно получить как Employee.empCount внутри класса или за его пределами.
  • Первый метод __init __ () — это специальный метод, который называется конструктором класса или методом инициализации, который Python вызывает при создании нового экземпляра этого класса.
  • Вы объявляете другие методы класса, как обычные функции, за исключением того, что первый аргумент каждого метода — это self . Python добавляет аргумент self в список для вас; вам не нужно включать его при вызове методов.

Невозможно создать универсальный массив.

Так же, как вы не можете создать объект универсального типа, вы не можете создать массив универсального типа. Но причины разные: ведь массив будет заполнен нулевыми значениями, и конструкция кажется безопасной. Однако сам массив также имеет тип, используемый для мониторинга массива на виртуальной машине, этот тип будет удален. Например:

Стирание типа заставит этот метод всегда создавать массив типа Comparable. Но если массив является частной переменной-членом класса, вы можете использовать массив типа Object и выполнять преобразование типа при получении элементов. Например, класс ArrayList можно реализовать так:

На самом деле это тоже можно записать так:

В методе minAndMax, поскольку метод возвращает массив универсального типа, операции, подобные приведенным выше, не могут быть выполнены, но если вы хотите реализовать функцию, вы можете реализовать ее следующим образом:

Затем вызовите код:

В приведенном выше коде на этапе компиляции нет ошибки, но когда мы вызываем этот метод, будет выброшено исключение ClassCastException. В этом случае вы можете позволить пользователю предоставить выражение конструктора массива:

Затем используйте этот параметр в методе minAndMax, чтобы сгенерировать массив правильного типа:

Вышеупомянутое письмо основано на ссылке на метод в Java 8. Если вы используете старое отражение Java, вызовите метод Array.newInstance:

16 ответов

Лучший ответ

Если вы можете использовать ES6 самостоятельно или с Babel (js compiler), тогда вы можете сделать следующее:

Который распечатает этот вывод:

Метод возвращает массив пар перечислимого свойства собственного объекта данного объекта в том же порядке, в котором он предусмотрен циклом (разница в том, что цикл for-in также перечисляет свойства в цепочке прототипов) .

  • Object.entries документация
  • для … из документации
  • документация по деструктивному назначению
  • перечисление и владение свойствами документация

Надеюсь, поможет! = ) сильный >

287

Francesco Casula
1 Мар 2019 в 16:32

используется для проверки, действительно ли ваше обладает этим свойством, а не унаследовало его от своего прототипа. Немного проще было бы:

Он просто проверяет, что не является методом (как будто равен , вы получите оповещение о множестве методов, например, , , { { }} Х5 и др . )

533

Michael Levy
3 Июн 2019 в 23:48

Никто не упомянул , поэтому я упомяну это.

325

Afshin Moazami
20 Авг 2015 в 17:12

для … в будет работать на вас.

В современном JavaScript вы также можете сделать это:

121

Paul
26 Сен 2019 в 15:47

Синтаксис PHP просто сахар.

72

JD.
5 Сен 2017 в 19:00

Я предполагаю, что вы знаете, что является ключом, и что вы можете получить значение через (и просто хотите ярлык для этого).

ECMAScript5 представил для массивов (кажется, у вас есть массив):

Документация по MDN предоставляет оболочку для браузеров, которые ее не поддерживают.

Конечно, это не работает для объектов, но вы можете создать аналогичную функцию для них:

Поскольку вы пометили вопрос с помощью jquery, jQuery предоставляет который зацикливается как на массив, так и на структуру объекта.

26

Felix Kling
30 Авг 2011 в 10:44

Вы можете использовать для этого.

10

Christoph Winkler
30 Авг 2011 в 10:38

В javascript каждый объект имеет набор встроенных пар ключ-значение, которые имеют метаинформацию. Когда вы просматриваете все пары ключ-значение для объекта, вы также проходите через них. Использование hasOwnProperty () отфильтровывает их.

9

Siddhu
19 Июл 2017 в 15:26

4

吴毅凡
17 Авг 2018 в 11:56

ES6 предоставит Map.prototype.forEach (callback), который можно использовать следующим образом

2

Stephen Murby
16 Авг 2016 в 13:51

За последние несколько лет, с тех пор как был задан этот вопрос, Javascript добавил несколько новых функций. Одним из них является Object.Entries а> метод.

Скопирован непосредственно из MDN, следующий фрагмент кода

2

David
22 Фев 2020 в 19:36

Вы можете использовать цикл for для этого:

1

Richard Dalton
30 Авг 2011 в 10:38

Ниже приведен пример, который подходит как можно ближе.

1

Aidamina
30 Авг 2011 в 10:39

Если вы используете , вы можете использовать

1

Gil Epshtain
30 Апр 2019 в 12:35

Да, вы можете иметь ассоциативные массивы также в JavaScript:

-2

Alex Pacurar
30 Авг 2011 в 10:38

-8

user278064
30 Авг 2011 в 14:08

Практическая работа

Разработайте программу по следующему описанию.

В некой игре-стратегии есть солдаты и герои. У всех есть свойство, содержащее уникальный номер объекта, и свойство, в котором хранится принадлежность команде. У солдат есть метод «иду за героем», который в качестве аргумента принимает объект типа «герой». У героев есть метод увеличения собственного уровня.

В основной ветке программы создается по одному герою для каждой команды. В цикле генерируются объекты-солдаты. Их принадлежность команде определяется случайно. Солдаты разных команд добавляются в разные списки.

Измеряется длина списков солдат противоборствующих команд и выводится на экран. У героя, принадлежащего команде с более длинным списком, увеличивается уровень.

Отправьте одного из солдат первого героя следовать за ним. Выведите на экран идентификационные номера этих двух юнитов.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: