java rookie - pytanie o konstruktor i JVM

java rookie - pytanie o konstruktor i JVM
TR
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 2 lata
  • Postów:731
0

Cześć wszytkim,

Dawno się nie udzielałem na forum, więc może krótki update: zmieniam pracę! :)
Ostatnio byłem na rozmowie kwalifikacyjnej i miałem pytanie dotyczące konstruktora. Otóż jak wiadomo, jeśli mamy "pustą" klasę, bez konstruktora to JVM/kompilator doda domyślnie konstruktor bezargumentowy. Pytanie dostałem takie: "jeśli mamy klasę z kilkoma konstruktorami z argumentami, to czy JVM doda domyślnie konstruktor bezargumentowy, czy nie?"
Moja odpowiedź była, że konstruktor zostanie dodany, natomiast mój adwersarz stwierdził, że jestem w błędzie i że klasa się nie skompiluje.

Wróciłem do domu trochę skonfundowany i sprawdziłem sobie na prostej klasie i wszystko się ładnie skompilowało i zadziałało.

Tutaj moje pytanie: jakie trzeba spełnić warunki, żeby klasa bez bezargumentowego konstruktora (ale z konstruktorami z argumentami) się nie skompilowała? Jest coś takiego?

Pozdrawiam,
t


musica curat corpus at animam
RewAnd
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:36
1

Podasz kod, bo to nie działa i ziomek miał rację.
http://ideone.com/YwUMbs

szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:13 dni
  • Lokalizacja:Kraków
  • Postów:1694
0

No ale OP chyba nie mówił, że koleś próbował tworzyć obiekt tej klasy domyślnym konstruktorem, tylko, że jest błąd w samej klasie. O takim przypadku jak podałeś też pomyślałem ale to chyba nie o to chodzi.

danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
1

Klasa się skompiluje, bo nie ma powodu żeby nie miała. Jedyne co to nie będzie miała bezargumentowego konstruktora


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
catom
Też nie rozumiem, co ma kompilacja klasy do braku domyślnego, bezargumentowego kontruktora. Co innego Runtime'y w połączeniu CDI + EJB :D
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 2 godziny
3

Domyślny konstruktor jest dodawany tylko i wyłącznie wtedy, gdy nie ma żadnego innego.
Analogicznie, jeśli w konstruktorze klasy dziedziczącej pierwszą instrukcją nie jest super(argumenty) to kompilator dopisuje domyślnie na początku super(). Przykład:

Kopiuj
	class A { A(int a) {} }
	class B extends A { }

Wynik kompilacji:

Kopiuj
Main.java:13: error: constructor A in class Ideone.A cannot be applied to given types;
	class B extends A { }
	^
  required: int
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

Rozwiązaniem jest dodanie jawnego konstruktora z jawnym super:

Kopiuj
	class A { A(int a) {} }
	class B extends A { B() { super(5); } }

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
TR
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 2 lata
  • Postów:731
0

@RewAnd:
Nie mam kodu, sorry. Widocznie o to mu chodziło. :D
Zapomina się jak działa Java, jak ma się IDE które robi połowę roboty
Takie to chciwe i podchwytliwe :D


musica curat corpus at animam
edytowany 1x, ostatnio: trojanus

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.