Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступность объектов из других классов, в одном package 
:(
    Опции темы
Farsong
Дата 20.8.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



Добрый день, 

Решил переписать все разбить на много классов и сразу столкнулся с проблемой. Христоматийный пример. 

Есть 3 класса. Майн, второй и третий. 
В майне делаю объект второго класса, во втором классе определяю переменную, в третьем классе через объект(определенный в майне) пытаюсь вызвать переменную из второго класса - НЕ ВИДИТ. 
Как правильно оформить, куда копать? ЧТО делать?!
Код

package test1;


public class Main {

    SecondClass testOb = new SecondClass();

    public static void main(String[] args) {

    }

}
class SecondClass {

int i = 10;

    public static void main(String[] args) {

    }

}
class ThirdClass {

       
    testOb.i = 20;         // НЕ ВИДИТ!!!!!!!!

    public static void main(String[] args) {

    }

}

PM MAIL   Вверх
revenforv
Дата 20.8.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Сделать в Main static SecondClass testOb = new SecondClass(); тогда будет работать.
В третьем классе не видит переменную, потому что переменная существует только в рамках объекта класса Main, а их нет ни одного.

Код

package test1;

public class Main {
    static SecondClass testOb = new SecondClass();
    public static void main(String[] args) {
    }
}

// SeconClass без изменений ...

class ThirdClass {
    public static void main(String[] args) {
         Main.testOb.i = 20; // это кстати наверное внутри метода должно быть
                                        // нехорошо как-то присваивать значение переменной где попало
                                        // или тогда в область инициализации положите
    }
}


Или тогда в третий класс ссылку на объекта Main'а, если по логике должно быть обращение именно к полю объекта (а не класса).

Это сообщение отредактировал(а) revenforv - 20.8.2009, 20:32
PM MAIL Skype   Вверх
Farsong
Дата 20.8.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



спасибо, но не получилось!

вот, чуть чуть сделал код осмысленнее
Код

package test1;


public class Main {

    static SecondClass testOb = new SecondClass(); // Создаю объект второго класса
    static ThirdClass testOb1 = new ThirdClass();      // Создаю объект третьего класса

    public static void main(String[] args) {
    testOb1.printPlz();                                              // Печатаю из третьего класса
    testOb.i = 22;                                                    // Присваивание РАБОТАЕТ, НО ТОЛЬКО ТУТ
    }

}
class SecondClass {

int i = 10;
}

class ThirdClass {

testOb.i = 25;                                 // Не работает
void printPlz() {System.out.println (testOb.i); }              // Не находит testOb.i

}



Вот, что пишет компилятор:
java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Uncompilable source code - package testOb does not exist
        at test1.ThirdClass.<init>(Main.java:24)
        at test1.Main.<clinit>(Main.java:9)
Could not find the main class: test1.Main.  Program will exit.
Exception in thread "main" Java Result: 1

PM MAIL   Вверх
revenforv
Дата 20.8.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Еще раз. 

Код

class ThirdClass
{
     testOb.i = 25;         // Нельзя задавать значение переменной из ниоткуда
                             // и нехватает разрешения имени статической пееменной

     void printPlz() {System.out.println (testOb.i); }              // Не находит testOb.i
}


Во-первых, заменяем testOb.i = 25 на Main.testOb.i = 25

Во-вторых, делаем вот так:
Код

class ThirdClass
{
     { Main.testOb.i = 25; } // область инициализации выполняется до создания класса

     void printPlz() {System.out.println (Main.testOb.i); }
}


Добавлено через 9 минут и 35 секунд
В общем должно получиться что-то вроде этого:

Код

package sandbox.paccess;

public class Main
{
    static SecondClass testOb = new SecondClass();
    static ThirdClass testOb1 = new ThirdClass();

    public static void main(String[] args)
    {
        testOb1.printPlz();
        testOb.i = 22;
    }
}

class SecondClass
{
    int i = 10;
}

class ThirdClass
{
    {
        Main.testOb.i = 20;
    }

    public void printPlz()
    {
        System.out.println(Main.testOb.i);
    }
}


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

Это сообщение отредактировал(а) revenforv - 20.8.2009, 20:46
PM MAIL Skype   Вверх
Farsong
Дата 20.8.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



спасибо!
пример я составил специально легкий для понимания, программа у меня чуть чуть другая будет, но думаю и там тоже будет все криво, но я просто начал недавно изучать =)
PM MAIL   Вверх
goodday1941
Дата 20.8.2009, 23:18 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 1
Всего: 9



что за статик объекты?

отвыкайте от такого сразу... используют иногда но в 99% случаев не используют )

ааааааааа....

сей класс вообще из разряда "изатерического" программирования:


Цитата(revenforv @  20.8.2009,  20:44 Найти цитируемый пост)

class ThirdClass
{
    {
        Main.testOb.i = 20;
    }
    public void printPlz()
    {
        System.out.println(Main.testOb.i);
    }
}



Цитата(revenforv @  20.8.2009,  20:44 Найти цитируемый пост)
Хотя если честно это похоже на то, как если бы я хотел удалить себе гланды через задний проход. Вроде бы и рука и гланды мои и результат тот, который нужно, но процесс выглядит по меньшей мере странно.


собственно и сам автор это понимает ))

если нужен вызов чего-либо с класса B в классе C то это должно выглядеть как-то так (не проверял, возможны ошибки):

Код

Class A{
public static void main (String args []){
B b = new B();
C c = new C();
//можно организовать через конструктор 
c.setB(b);
//may produce NPE if b not set ) 
c.getB().doSomthig();
}
}

Class B{
public boid doSomthig(){
//blah blah
}
}

Class C{
private B b;

public void setB(B b){
this.b=b;
}

public b getB(){
return b;
}

}



--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
revenforv
Дата 21.8.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(goodday1941 @  21.8.2009,  00:18 Найти цитируемый пост)
если нужен вызов чего-либо с класса B в классе C то это должно выглядеть как-то так (не проверял, возможны ошибки):


Ну это понятно.. просто автор попросил - я предложил вариант.
А вот про static объекты это вы зря. Кстати очень полезно бывает и весьма элегантное решение получается, например System.out ;) Хотя и правда, это бывает полезно весьма редко.

PM MAIL Skype   Вверх
Farsong
Дата 21.8.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



goodday1941, попробовал твой код - не получился, хотя вроде поправил, но ладно

Скажите, а где есть документация с поиском? например тут http://java.sun.com/javase/6/docs/api/ как-то все громоздко, я не сильно пока разбираюсь, а мне надо быстро найти метод setLayout
PM MAIL   Вверх
Farsong
Дата 21.8.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



Помогите, почему не запускается??

Пишет, что BoxLayout не "shared".  Я не хочу все в конструктор запихивать, а то он разростается неимоверно со временем, хотел методами все сделать, а тут такое, как правильно поступить? Код весь! Можете попробовать, убрав package.
Код

package auto04;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.BorderFactory;
import javax.swing.border.*;
import java.util.*;
import java.text.*;

public class Main extends JFrame {

    Main(){
        printJFrame();
        
    }

    // СОЗДАЮ ГЛАВНОЕ ОКНО ПРОГРАММЫ
    void printJFrame () {
    JFrame mainJFrame = new JFrame ();
    mainJFrame.setLayout(new BoxLayout(mainJFrame, BoxLayout.X_AXIS));

    // ДОБАВЛЯЮ СЮДА 4 ПАНЕЛИ
    JPanel leftJPanel = new JPanel();
    JPanel rightJPanel = new JPanel();
    JPanel insideLeftJPanelUpper = new JPanel();
    JPanel insideLeftJPanelBottom = new JPanel();

    // ДОБАВЛЯЮ В НОВЫЕ ПАНЕЛИ БОРДЮРЫ, но только в 3
    rightJPanel.setBorder(new LineBorder(Color.GRAY,1));
    insideLeftJPanelUpper.setBorder(new LineBorder(Color.GRAY,1));
    insideLeftJPanelBottom.setBorder(new LineBorder(Color.GRAY,1));

    // ДОБАВЛЯЮ В JFRAME 2 ПАНЕЛИ
    mainJFrame.add(leftJPanel);
    mainJFrame.add(rightJPanel);
    
    mainJFrame.setSize(300,300);
    //mainJFrame.pack();
    mainJFrame.setVisible(true);
    mainJFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

        public static void main(String[] args) {
       SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new Main();

            }

        });


    }

}



PM MAIL   Вверх
Farsong
Дата 21.8.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



извиняюсь, сам BoxLayout криво сделал
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.