2016-04-04 3 views
0

Если я не предоставляю никакого конструктора, компилятор создаст конструктор по умолчанию для класса.Default Constructor в файле класса

Будет ли этот конструктор по умолчанию присутствовать в файле класса?

Если нет, то как VM запускает файл класса и создает объект для класса?

Update 1:

Я создал файл класса,

public class ConstructorExp { 
    public static void main(String[] args){ 
    ConstructorExp e = new ConstructorExp(); 
    } 
} 

С помощью декомпилятора, я декомпилировал файл класса,

/* 
* Decompiled with CFR 0_114. 
*/ 
public class ConstructorExp { 
    public static void main(String[] arrstring) { 
    ConstructorExp constructorExp = new ConstructorExp(); 
    } 
} 

Как вы видите, есть нет конструктора по умолчанию!

+0

он присутствует в файле класса – silentprogrammer

+0

Попробуйте, создать класс, не конструктор, скомпилировать его, а затем использовать программу externam, декомпилировать его. –

+0

@Все: Пожалуйста, прочтите мое обновление – Lathy

ответ

3

Будет ли этот конструктор по умолчанию присутствовать в файле класса?

Да, это будет.

Вы можете проверить это самостоятельно, создав класс с конструктором по умолчанию, скомпилировав его, а затем изучив его с помощью утилиты javap ..., которая включена в ваш JDK.

Вот что происходит, когда я это делаю.

[[email protected] tmp]$ cat Test.java 
public class Test {} 
[[email protected] tmp]$ javac Test.java 
[[email protected] tmp]$ javap -c Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 
} 
[[email protected] tmp]$ 

QED


С помощью декомпилятор, я декомпилировали файл класса [и нет конструктора по умолчанию не в выводе]

Интересно. Однако это ничего не доказывает .

Что на самом деле происходит то, что декомпилятор:

  • видит не-арг конструктор в .class файл с телом, что эквивалентно super();
  • видит там нет другого конструктору
  • понимает, что конструктор может быть представлен как конструктор по умолчанию.
  • не выводит никакого исходного кода для конструктора ... , потому что код будет избыточным.

1 - ... кроме того факта, что декомпилятор немного умный.

+0

Я прочитал ваш комментарий, но не мог понять его: P – Lathy

+0

Можете ли вы это понять сейчас? –

+0

Стивен: Хмммм Спасибо! – Lathy

0

Это одна из тех вещей, которые выполняет java при компиляции файла .java в файл .class. То же самое происходит, если вы не ставите «F» за поплавок или «D» за двойным.

0

Да, это будет.Проверьте приведенный ниже ответ и скомпилируйте класс a без конструктора arg. Вы найдете ответ. В любом случае объяснение дается ниже

Конструкторы по умолчанию Если вы объявите класс без конструкторов, компилятор автоматически создаст конструктор по умолчанию для класса. Конструктор по умолчанию не принимает никаких параметров (это конструктор no-arg) и имеет пустое тело. Поскольку компилятор автоматически сгенерирует конструктор по умолчанию, если вы явно не объявляете какие-либо конструкторы, все классы гарантированно имеют хотя бы один конструктор. Например, если вы объявляете класс CoffeeCup без объявления конструктора явно:

// В исходном пакете в файл инициализации/EX6/CoffeeCup.java

class CoffeeCup { 

    private int innerCoffee; 

    public void add(int amount) { 
     innerCoffee += amount; 
    } 
    //... 
} 

компилятор будет генерировать один и тот же файл класса, как если ты явно объявлен конструктор без аргументов с пустым телом:

// в исходном пакете в файле инициализации/EX7/CoffeeCup.java

class CoffeeCup { 

    private int innerCoffee; 
     public CoffeeCup() { 
    } 

    public void add(int amount) { 
     innerCoffee += amount; 
    } 
    //... 
} 

компилятор ГИ ves по умолчанию имеют тот же уровень доступа, что и их класс. В приведенном выше примере класс CoffeeCup является общедоступным, поэтому конструктор по умолчанию является общедоступным. Если CoffeeCup был предоставлен доступ к пакету, конструктор по умолчанию получит также доступ к пакету.

Ссылка: https://www.artima.com/designtechniques/initializationP.html

+0

Это не отвечает на вопрос. Вопрос очень конкретный - компилятор записывает код для конструктора по умолчанию в файл «.class». –

Смежные вопросы