Почему импорт класса не нужен когда вызывающий метод для экземпляра (Java)

Вы не показываете свою кнопку с button1.show().

Кроме того, лучший способ написания вашего кода будет:

import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk




class GUI:
    def __init__ (self):

        self.builder = Gtk.Builder()
        self.builder.add_from_file("test.glade")
        self.builder.connect_signals(self)
        window = self.builder.get_object("window1")
        window.show_all()

    def on_back_clicked(self, button):
        pass
    def on_destroy_clicked(self, button):
        Gtk.main_quit()
    def on_forward_clicked(self, button):
        pass
    def on_refresh_clicked(self, button):
        pass
    def on_home_clicked(self, button):
        pass
    def on_information_clicked(self, button):
        pass
    def on_delete_clicked(self, button):
        pass
    def on_add_clicked(self, button):
        box = self.builder.get_object("boxMain")
        button1 = Gtk.Button()
        button1.set_label("Button")
        box.pack_start(button1,True,True,0)
        button1.show()
        print("done")


GUI()
Gtk.main()
13
задан jjujuma 24 April 2009 в 14:21
поделиться

5 ответов

Импорт в Java необходим только для того, чтобы компилятор знал, что a Дата - если вы набираете

Date date = new Date();

Импорт не похож на #include в C / C ++; все типы в classpath доступны , доступны , но вы импортируете их, чтобы избежать необходимости писать полное имя. И в этом случае это не нужно.

26
ответ дан 1 December 2019 в 21:12
поделиться

Хороший вопрос !!

Я думаю, что результатом является разница между тем, как java-компилятор обрабатывает выражения против операторов.

Date d = new Date(); // a statement

где as

new Thing().getDate().getTime()

- это выражение, которое встречается внутри метода println вызов. Когда вы вызываете getDate для нового Thing (), компилятор пытается обработать выражение, просматривая информацию о типе для класса Thing, где он получает объявление типа Date. Но когда вы пытаетесь использовать Date отдельно в выражении типа

Date d = new Thing().getDate();

, вы присваиваете результат типу в текущей области (класс TestUsesThing), компилятор пытается разрешить тип в этой области. В результате вы видите ошибку компилятора для неизвестного типа.

1
ответ дан 1 December 2019 в 21:12
поделиться

Являются ли Thing и TestUsesThing в одном пакете? Если это так, то вам не нужно импортировать Thing. Причина, по которой вам нужно импортировать Date, заключается в том, что он находится в другой упаковке.

0
ответ дан 1 December 2019 в 21:12
поделиться

операторы import используются для нескольких вещей.

  1. Проверка типа компилятора и избежание конфликта имен.
  2. Гарантирует связь байтового кода

Всякий раз, когда мы говорим

System.out.println( new Thing().getDate().getTime() )

Компилятор анализирует это утверждение слева направо и попадает в этот класс.

Разбор компилятора первого уровня.

  1. Перейти к классу вещей
  2. У компиляции нет ошибок связывания или ClassVersion из Thing.class

  3. Проверьте, что Thing.class имеет метод getDate.
  4. если # 3 - Хорошо, тогда указатель компилятора все еще находится в Thing.class (в котором есть операторы импорта даты), и я мог бы вызвать метод Time.
  5. В качестве потребителя TestUsesThing получает только длинную переменную.

     System.out.println (new Thing (). GetDate ())
    

    5.1 В этом случае мы неявно обращаемся к методу .toString ()

0
ответ дан 1 December 2019 в 21:12
поделиться

На самом деле это был идеальный пример, поскольку есть два разных стандартных класса Java Date: java.util.Date и java. sql . Дата .

Откуда он знает, какой использовать? Просто. Метод getDate () объявляется как часть определения класса Thing, и частью этого объявления является его возвращаемый тип:

public java.util.Date getDate() {
  return this.date;
}

Конечно, если у вас есть импорт в определении класса Thing - и он не является двусмысленным, вы просто говорите:

public Date getDate() {

Если бы вы декодировали двоичный файл класса Thing, вы бы увидели сигнатуру метода метода getDate, и она включает полное имя класса (включая пакет) возвращаемого типа.

Импорт - это просто способ сообщить компилятору, какой пакет (ы) вы хотите использовать при обращении к классам без явных уточнений. Список импорта будет проверяться всякий раз, когда будет замечено неквалифицированное имя класса, и пакеты будут искать. Если нет никакой двусмысленности (такой как импорт java.util.date и java.sql.Date), этот класс будет использоваться. Если вы можете определить класс неявным образом или если имя класса полностью определено, вам не нужно импортировать.

0
ответ дан 1 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: