Вопрос очень простой и глупый, где-то я видимо сильно недопонял.. Случайно наткнулся.. поместив код задачи в Solution из примера...
Почему если класс Car поместить в Solution, то в мейне не дает воспользоваться конструктором, требуется static доступ для Car , хотя везде доступ public, но как только я избавлюсь от public класса Solution, все в public класс Car, уже не требует static для класса Car...
package com.javarush.task.task15.task1518;
public class Solution {
public class Car {
String model;
int maxSpeed;
public Car(String model, int maxSpeed) {
this.model = model;
this.maxSpeed = maxSpeed;
}
}
public static void main(String[] args) {
Car bugatti = new Car("k", 5); //ошибка!
}
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++
public class Car {
String model;
int maxSpeed;
public Car(String model, int maxSpeed) {
this.model = model;
this.maxSpeed = maxSpeed;
}
public static void main(String[] args) {
Car bugatti = new Car("k", 5); // нет ошибки!
}
}
Freeflyfish
32 уровень
...cannot be referenced from a static context...
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
JustinianJudge в Mega City OneMaster
14 апреля 2023, 09:56
Почтиайhttps://javarush.com/forum/842#discussion
public private и тд это про доступ к методам и переменным, классам тоже.
Но еcть и другие проблемы
static это не совсем про доступ, статические члены содержится в одном участке памяти фактически в одном экземпляре
грубо говоря, есть у тебя класс
Cat {
private static int age;
это значит, что после запуска программы, во всей JVM будет только одна переменная age, ее можно менять значение, но переменная физически одна, хоть 1000 котов будь или миллион
А вот так:
Cat {
private int age;
для каждого кота будет своя переменная, миллион котов = миллион переменных.
Поскольку каждый экземпляр кота это НОВЫЙ объект с методами и полями.
А статические члены - классы, методы, переменные, это ТОТ ЖЕ САМЫЙ и ОДИН метод или переменная.
Что происходит у тебя в коде,
у тебя есьт некий класс, а в нем, внутренний другой класс.
И ты пытаешься просто создать свой Car, который в Solution
Но у тебя это НЕ статический класс, а значит, он НЕ может существовать вне объекта Солюшн.
Что мы говорим про
Cat {
private int age;
Эта переменная может существовать ИСКЛЮЧИТЕЛЬНО если создан экземпляр кота.
Нету экземпляра кота ты не сможешь к ней обратиться, ведь ее не существует
Точно такая же картина с
Solution {
Car {
ты не можешь просто создать Car из статического контекста.
Что такое статический контекст это контекст в котором существует гарантированно только статика. В нем может не быть Solution, Car
И оно про это и пишет, я не могу создать Car, ты в статическом контексте, твой Car это часть Solution как внутренний класс.
Где экземпляр Solution, Билли?
0
JustinianJudge в Mega City OneMaster
14 апреля 2023, 09:56
Запомнить просто.
из статических методов ты гарантированно можешь вызывать только другие статические методы.
Методы и переменные экземпляра ты можешь обращаться только при наличии этого экземпляра.
При создании внутреннего класса обязательно наличие экземпляра объекта, в котором находится.
Как именно - показано в ссылке выше.
Если это вложенный статический класс, тогда не обязательно можно было бы и просто new Solutio.Car();
Solution.Car это просто имя вложенного класса, поскольку он может существовать вне экземпляров, Solution, то его идентификатор это имя, которое включает имя класса, в котором находится.
В твоем примере Car имеет просто имя Car, поскольку все-равно без экземпляра не существует, и нет вариантов где бы мы могли его создать иначе как внутри экземпляра Solution().
Общая идея перекликается с ООП.
Если Колесо часть Автомобиля и по логике программы никак иначе не используем, зачем нам Колесо БЕЗ Автомобиля? Не зачем.
Суть твоей ошибки оно пишет "не могу создать колес без автомобиля, сделайте его самостоятельным компонентом", нужно это или нет, статический вложенный класс или нестатический (он же внутренний) это сам программист решает исходя из бизнес-логики приложения, есть смысл чтобы Car существовал без Solution или нету.
Есть методы экземпляров и переменные, экземпляр объекта это конкретный объект построенный по чертежу с необходимым аттрибутами.
То есть есть класс Кот, ты создал 10 экземпляров, у каждого из них есть свои поля, это удобно, благодаря этому каждый кот может называться по разному, а не иметь одно имя на всех котов.
Есть статика, это собственно сам чертеж, он в одном экземпляре, метод это или переменная.
Это два разных мира, и в джаве они могут пересекаться, но по своим правилам.
Из методов экземпляров ты можешь статические вызывать. Проблем нет
Но из статических методов, ты не можешь обращаться к тому, что может просто не существовать. Существование = наличие экземпляра,поэтому нужен конкретный экземпляр и нужен new Solution()
+2
Freeflyfish
14 апреля 2023, 10:34
Спасибо! Очень доходчиво,
в особенности ...
Суть твоей ошибки оно пишет "не могу создать колес без автомобиля, сделайте его самостоятельным компонентом", нужно это или нет, статический вложенный класс или нестатический (он же внутренний) это сам программист решает исходя из бизнес-логики приложения, есть смысл чтобы Car существовал без Solution или нету.
ссылка тоже очень помогла!
+1
JustinianJudge в Mega City OneMaster
14 апреля 2023, 11:41
на здоровье, удачи!
0