[Judge] Могат ли да се submit-ват Java решения съдържащи допълнителен клас в същия файл?
Здравейте, колеги,
Имам следния въпрос:
Току-що си написах решение на задачата Problem 13** – Durts от Homework: Loops, Methods, Classes.
Направила съм си собстевен клас Rectangle, който за разлика от java.awt.Rectangle работи с double values, а не с int. На място при мен минава всички нулеви тестоове, но като го пусна в judge получавам грешка:
Exception in thread "main" java.lang.NoClassDefFoundError: P13_Durts$Rectangle
Т.е. не ми намира класа Rectangle, който си е в същия файл.
Помислих да не би да се чуди дали това е мой class Rectangle или е държавния class Rectangle, смених му името - но грешката не се промени:
Exception in thread "main" java.lang.NoClassDefFoundError: P13_Durts$CustomRectangle
Та въпросът ми е, по принцип възможно ли е judge да приема решение с повече от един клас, всички грубо и грозно в един файл, и ако е възможно - как става?
Не че не мога да го напиша без custom class Rectangle, но ми беше интересно да го напиша така....
@RoYaL
махнах public, остана: static class Rectangle
после пробвах с private static class Rectangle
При мен все си работи, а в judge грешката е същата:
Може ли да идва от факта, че всички решения са ми в package?
Не, и в package-a не е проблема, направих си нов проект Durts, без package - с private static class Rectangle - грешката не се промени:
Възможно е. На изпитът по Java на който се явявах преди повече от година ползвах класове. Изрових си кода:
http://pastebin.com/se3aF6Vd
Нямам package, класът ми не е nest-нат вътре в другия клас и също така всичко, което е от тип моя клас е статично.
А защо static?
Пробвах и твоя код. Нямаш право и на публичен конструктор явно. Така, че това което направих е да не ползвам конструктор и изнесох като статични двете ти променливи от тип Rectangle (не знам дали е нужно)
http://pastebin.com/cxWPba15
@Filkolev
махнах само static и се счупи: No enclosing instance of type P13_Durts is accessible. (при използване на конструктора в main).
Може да трябва да извикам конструктора сега по друг начин, но в Java още не се сещам как....
@RoYaL
Вярно, дава 100 точки сега, judge го прочете този път.
Благодаря много!
@RoYaL
Проблемът обаче излиза, че не е бил в конструктра, а точно в изнасянето като статични на двете променливи от тип Rectangle
Само си добавих втори конструктор - с default 0 values за всичко.
решението с public constructor
Judge пак го чете и пак си му дава точките.
Проблемът е, че ти можеш да ги изнесеш като типове без да ги инициализираш, и после в мейна да ги инициализираш като ректейнгъли, въпросът е, че тогава ще даде същта грешка. А за да успееш да ги инициализираш като статични поле още горе, ти трябва конструктор с 0 аргумента...
Както би казал японски турист с разговорник в ръка, когато му кажат, че е един дюнер е 18 лв: ебасимамамата, да?
@RoYaL
Преди последния ти коменар пробвах буква по буква точно каквото си написал и стана буква по буква точно каквото си напписал :)
"Проблемът е, че ти можеш да ги изнесеш като типове без да ги инициализираш, и после в мейна да ги инициализираш като ректейнгъли, въпросът е, че тогава ще даде същта грешка. А за да успееш да ги инициализираш като статични поле още горе, ти трябва конструктор с 0 аргумента..."
Туристът е прав :)
Сега си работи де, с допълнителния 0 arguments конструктор и всичко на public в class Rectangle, както и с всичко на private в в class Rectangle.
@Filkolev
Прав си, че няма логика да е static - оказва се, че ако искам да не е static класа, и да си има конструктор, този конструктор се извиква по много странен начин:
private static Rectangle vertical = new P13_Durts().new Rectangle();
или само Rectangle vertical = new P13_Durts().new Rectangle(rectVerticalX, rectVerticalY, rectVerticalWidth, rectVerticalHeight);
- ако няма да е за judge.
Благодаря за напомнянето - така научих как се работи с конструктор на non-static class.
Имам следния проблем със submit-ването на домашните.
За да не правя всички задачи на отделни проекти отивам в src-папката и създавам нов калс за всеки проблем.
Натискам десен бутон на SRC папката -> New -> наименовам си класа и до тук всичко ок. В момента в който започна да пиша кода в новия ллас не ми дава изобщо опция да принтирам System.out.println().
Моля помогнете.
@dgp_82 Чакай малко... сигурен ли си че всичко си правиш като хората? Новият клас който създаваш има ли си main() метод , това което описваш се поучава ако се опиташ да извикаш System.out.println() направо в класа, извикването трябва да се прави в някакъв метод main( ) или твой собствен, иначе няма как да стане.Огледай се добре.
Вече всичко е ОК. Благодаря.
Вътрешен клас може да е static или не в зависимост от това за какво ще го ползваш. Когато той не е статичен може да "види" променливите и методите на горния клас и съответно затова иска да се инициализира от инстанция на горния глас например:
public class Test {
private class Test1 {
public void printTest() {
System.out.println(test);
}
}
public int test;
public Test(int test) {
this.test = test;
}
public static void main(String[] args) {
new Test(5).new Test1().printTest();
new Test(6).new Test1().printTest();
}
}
В този случай вътрешния клас Test1 ползва променливата test на външния клас и съответно трябва да се конструира от инстанция на външния клас както е направено в мейн метода. Ако в този вид на кода Test1 се направи на static кода няма да се компилира, защото не знае кой точно test да вземе. В случай, че вътрешния клас няма да ползва промеливи/методи на външния клас по - добре да е static за да не се налага да се прави от инстанция на външния клас. например класа Test2 тук:
private static class Test2 {
public void printTest() {
System.out.println("test");
}
}
private class Test1 {
public void printTest() {
System.out.println(test);
}
}
public int test;
public Test(int test) {
this.test = test;
}
public static void main(String[] args) {
new Test(5).new Test1().printTest();
new Test(6).new Test1().printTest();
new Test2().printTest();
}
}