Можно ли перемещать значения переменных из одного класса в другой класс без наследования в java?

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

  1. Я создаю два класса: class1 и class2.
  2. Я ввожу переменную со значением в class1.
  3. Переместите значение переменной в class2.
  4. Пусть значение будет проверено операторами if в class2.
  5. Вывод в классе 2 можно переместить в класс 1 или метод с выводом в классе 2 можно вызвать в классе 1.

Это не настоящая архитектура программы, это просто для моих учебных целей. Спасибо. Обновление: меня попросили опубликовать код того, что я сделал, чтобы показать идею выше. Вот один класс:

class MainClass
{
public static void main(String[] args)
{
    System.out.println("You have entered: " + args[0]);
    static int num = Integer.parseInt(args[0]);
    SubClass.calc(); //I believe I override it by passing value to a method within SubClass
}

}

Вот второй класс:

class SubClass
{
    public static void calc()
{
    System.out.println("This is the output" + MainClass.num);
}
}

Я попытался переместить свое значение в args[0] из MainClass в SubClass, но получаю сообщение об ошибке, когда пытаюсь преобразовать его из строки в тип данных int:

pavel@pavel-OptiPlex-GX270:~/myjava$ javac MainClass.java
MainClass.java:9: error: cannot find symbol
static int num = Integer.parseInt(args[0]);
                                  ^
symbol:   variable args
location: class MainClass
1 error

Могу ли я что-нибудь сделать, чтобы решить проблему?


person pavelexpertov    schedule 13.06.2013    source источник
comment
Павел, вам нужно опубликовать код, чтобы показать нам, что вы пробовали. И вам нужно опубликовать это в stackoverflow, а не здесь.   -  person kevin cline    schedule 13.06.2013
comment
Привет @pavelexpertov, я не знаю, чего ты пытаешься достичь, но этот путь не выглядит хорошим. Попробуйте реорганизовать свой код таким образом, чтобы он мог передавать параметры.   -  person Joqus    schedule 14.06.2013
comment
У меня есть несколько ответов ниже. Если вы не видите, я думаю, что мой пост был перемещен в stackoverflow. И по какой-то странной причине я вижу свой пост на сайте программиста, а также в stackoverflow.   -  person pavelexpertov    schedule 14.06.2013


Ответы (3)


Вы не можете удалить статическую переменную внутри метода:

Попробуйте отредактировать свой основной класс следующим образом:

public class MainClass {

    private static int num;

    public static void main(String ... args) {
        System.out.println("You have entered: " + args[0]);
        num = Integer.parseInt(args[0]);
        SubClass.calc();

        //even better, pass in the argument
        SubClass.calc2(num);
    }

    public static int getNum() {
        return num;
    }

}

И ваш SubClass вот такой:

public class SubClass {
    public static void calc() {
        System.out.println("This is the output" + MainClass.getNum()); //invoke the public getter method. We hid the original num variable with private keyword
    }

    public static void calc2(int number) { 
        System.out.println(number);
    }
}
person darijan    schedule 13.06.2013
comment
почему вам нужно было поместить метод getNum() в MainClass? Я думал, что вы можете вызвать метод в другом классе для вывода числа. - person pavelexpertov; 14.06.2013
comment
Я этого не сделал. Но принято скрывать переменные от внешнего мира и выставлять напоказ аксессоры (то есть методы get и set; в данном случае метод get) - person darijan; 14.06.2013
comment
Спасибо. Что такое аксессоры, я просто учусь, поэтому пытаюсь узнать все, что могу. - person pavelexpertov; 14.06.2013
comment
Аксессоры — это просто название методов, которые следуют определенному стандарту кодирования и обращаются к полям класса (переменным). Подробнее читайте здесь: java.about.com/od/workingwithobjects/a/accessormutator. htm - person darijan; 14.06.2013

SubClass.calc(); //I believe I override it by passing value to a method within SubClass

Нет, вы не переопределяете его. Только когда вы extends выбираете другой класс, на сцену выходит переопределение. Также помните, что вы не можете переопределить static членов, потому что они принадлежат классу. Вам не нужно создавать экземпляр класса для их вызова.

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

person Parth    schedule 13.06.2013
comment
Вы обычно обращаетесь к членам другого класса, используя запись через точку? - person pavelexpertov; 14.06.2013
comment
Если они не static, то мы должны получить к ним доступ через запись через точку. Здесь вам, возможно, придется спросить, в чем причина использования static участников? Итак, предположим, что у вас есть один служебный класс с методом, который всегда возвращает, скажем, случайное число, тогда вам нужно сделать этот метод статическим, потому что он всегда будет вести себя одинаково, независимо от того, какой экземпляр класса выполнял метод. - person Parth; 14.06.2013

Используя static, вы можете заархивировать это:

public class class1
{
public static string myname = "light";


}

public class2 {

public static void displayMyname()
{
    System.out.println(class1.myname);
}

    }

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

person Misters    schedule 13.06.2013
comment
Я видел то же самое. Я думаю, что stackoverflow просто дал сбой, лолз. Спасибо за ответ!!! - person pavelexpertov; 14.06.2013