Запутался в конструкторах 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
, Аргументы действительно широки, и есть много новых вещей, которые вы должны изучить.