Запутался в конструкторах Java

Так я учусь Java, Я до constructorsи иметь дело с classes, У меня возникли проблемы с пониманием того, что они делают / для чего? Я считаю, что они используются аналогично вызову функции, передавая параметры функции при вызове?

Я прав в этом мышлении?

Так, например:

class test{
    void durp(String input){
        System.out.print(input);
    }
}

Если бы я должен был сделать объект в моем основном классе, как это:

test object = new test("hey");

это пройдет hey как строка durp()

Это правильно?

7 ответов

Решение

Если бы я должен был сделать объект в своем основном классе следующим образом: test object = new test("hey"); это передало бы "эй" как строку в durp(), верно?

Нет, потому что ваш метод durp() не конструктор. Это просто метод, принадлежащий классу, который можно вызывать из созданного живого объекта.

public class Test {
    /** this is a constructor */
    public Test() {
    } 

    /** this is also a constructor with a parameter */
    public Test(String arg1) { 
        System.out.println(arg1); 
    } 

    /** this is a method of Test */
    public void derp() {
    }
}

Вы можете прочитать этот урок от оракула о конструкторах

Java-конструкторы выглядят только как функции *, но на самом деле они очень разные:

  • Вы вызываете метод, когда объект полностью инициализирован; Вы вызываете конструктор, когда объект еще не существует
  • Методы не могут изменить final переменные класса; для конструкторов, это часть их цели
  • Методы могут возвращать разные вещи; конструкторы ничего не возвращают
  • Вызовы методов могут использоваться во всех видах выражений; конструкторы могут быть вызваны только как часть new выражение.

Конструкторы должны следовать специальному соглашению об именах: их имя должно совпадать с именем класса. В вашем случае это было бы test, Обычно задача конструктора - установить переменные-члены класса. Учитывая, что ваш test В классе нет таких переменных, вам не нужен конструктор **: достаточно простого вызова, подобного этому:

new test().drup("hello");


* В Java правильным термином для "вызова функции" является "вызов метода", хотя программисты с опытом работы в других языках программирования часто используют эти два термина взаимозаменяемо.

** Когда класс не определяет пользовательские конструкторы, вам предоставляется стандартный конструктор без аргументов.

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

 class Tets{
   protected Test() { } // this is Test's constructor
   protected void Test() { } // this is a badly named,
   // but legal, method
 }

Первое, на что нужно обратить внимание, это то, что конструкторы очень похожи на методы. Ключевое отличие состоит в том, что конструктор не может когда-либо, никогда, никогда не иметь возвращаемый тип... никогда! Однако объявления конструктора могут иметь все обычные модификаторы доступа, и они могут принимать аргументы (включая var-args), как методы. Другое БОЛЬШОЕ ПРАВИЛО, которое нужно понимать для конструкторов, заключается в том, что они должны иметь то же имя, что и класс, в котором они объявлены. Конструкторы не могут быть помечены как статические (они все-таки связаны с созданием объектов), они не могут быть помечены как окончательные или абстрактные (потому что их нельзя переопределить). Вот некоторые легальные и нелегальные объявления конструктора:

 class Foo2 {
    // legal constructors
    Foo2() { }
    private Foo2(byte b) { }
    Foo2(int x) { }
    Foo2(int x, int... y) { }
    // illegal constructors
    void Foo2() { } // it's a method, not a constructor
    Foo() { } // not a method or a constructor
    Foo2(short s); // looks like an abstract method
    static Foo2(float f) { } // can't be static
    final Foo2(long x) { } // can't be final
    abstract Foo2(char c) { } // can't be abstract
    Foo2(int... x, int t) { } // bad var-arg syntax
}

посетите https://java.net/downloads/jfjug/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206-0071591060.pdf

class Test{

     // this is a constructor (name is same as class and no return type)
    public Test(String input){
      // some code here
   }

  // this is a method 
  public void durp(String input){
   // some code
  } 

 public static void main(String[] args){
       Test test = new Test("hey"); // calls constructor
  }

}

Конструкторы в java используются для создания объекта, например, вы хотите установить значение durp(не durp(), потому что это метод), который вы можете использовать для таких задач.

Я думаю, вы хотите что-то вроде этого:

class Test {
    private String durp;

    public Test(String durp) {
        //set value of durp
        this.durp = durp;
    }

    //function for getting durp string.
    //Use getDurp() rather than durp() in java.
    public String getDurp() {
        return durp;
    }
}

Вам нужно выучить базовый java basic, который расскажет вам о конструкторах с параметрами.

class test{

public test(String s)
{
   durp(s);
}

 void durp(String input){

  System.out.print(input);

} 
  public static void main(String args[])
  {
   test obj=new test("hey");
 }
 }

В ООП конструктор - это то, что вкладывает жизнь в классы. Методы (в ООП это методы, а не функции) просто выполняют что-то с уже существующим объектом (ранее созданным с помощью конструктора). Каждый класс имеет свой конструктор по умолчанию (конструктор без параметров), если вы не переопределите свой собственный конструктор. В твоем случае:

class Test{
   String durp;
   public Test(String anInput)
   {
      this.durp = anInput;
   }

   void durp(){
      System.out.print(input);
   }
}

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

Test test = new Test("hey");
test.durp() // prints "hey" (without quote)

Примечание. Поскольку имя класса соглашения об именовании всегда начинается с прописных и верблюжьих обозначений (т.е. ThisIsMyClass), в данном случае Test , Аргументы действительно широки, и есть много новых вещей, которые вы должны изучить.

Другие вопросы по тегам