#java #kotlin #inheritance #constructor #default-constructor
#java #kotlin #наследование #конструктор #по умолчанию -конструктор
Вопрос:
Я новичок в Kotlin (имею некоторый опыт работы с Java). В java, если мы напишем хотя бы один конструктор, чтобы компиляция не создавала пустой конструктор. Пустой конструктор будет построен только в том случае, если мы не написали конструктор. Я знаю, что в Kotlin компилятор также работает так же, как и в Java. Я написал в Kotlin суперкласс (с именем Animal) с конструктором с одним параметром. Кроме того, я написал подкласс для Animal , и подкласс вызывает пустой конструктор Animal . Я не могу понять, почему компилятор не сообщает мне, что это ошибка компиляции, поскольку класс Animal не имеет пустого конструктора для вызова. Мой код:
open class Animal (val str:String = "sav")
{
open var fff:String = ""
open var image = ""
open val food =""
open val habitat =""
var hunger = 10
open fun makeNoise()
{
println("The animal is making noise")
}
}
class Hippo ( var strrr:Int = 7) : Animal()
{
override var image = "hippo.jpg"
override var food = "grass"
override val habitat = "water"
override fun makeNoise()
{
println("Grunt! Grunt!")
}
}
класс Hippo ( var strrr:Int = 7): Animal()> не проблема?
Комментарии:
1. @Nicolas, кто является основным конструктором? не тот, у которого ** val str:String = «sav»
2. Извините, я удалил комментарий, это было неправдой. Проблема здесь в том, что ваш конструктор имеет значение по умолчанию, следовательно, существует пустой конструктор.
3. @Nicolas, спасибо, я понимаю проблему. Но только для точности (насколько мне известно), на самом деле это не пустой конструктор, у него есть конструктор с параметром по умолчанию. Я прав?
4. Если я помню, Kotlin сгенерирует синтетический конструктор для случая, когда аргумент не указан. Этот конструктор не будет виден из Java. Так что на самом деле это не пустой конструктор или его отсутствие, скорее что-то среднее.
5. @Nicolas, я понимаю. Спасибо!!!!!
Ответ №1:
Как указано в документации:
В JVM, если все параметры основного конструктора имеют значения по умолчанию, компилятор сгенерирует дополнительный конструктор без параметров, который будет использовать значения по умолчанию.
Кстати, этот конструктор тоже будет виден из Java.
Комментарии:
1. @MC Emperor, извините. я удалю свой комментарий
2. @Михаил Нафталь, You have mentioned the JVM. Означает ли это, что он не будет работать, когда я попытаюсь скомпилировать его в Android Studio?
3. Не знаю наверняка (особенно с точки зрения объектов в сгенерированном байт-коде), но поскольку официальная игровая площадка Kotlin для Android использует JVM target, это должно работать так же.