2013-07-31 5 views
0

Я новичок в Java, просто некоторое время играл с кодом.Создание объектов из конструкторов

public class ThreeVector { 
private double x,y,z; // definign local variables 

public ThreeVector(){} // a constructor that has no input 

public ThreeVector (double va1,double va2, double va3){va1=x;va2=y;va3=z;};// creatign a constructor , so can be used for calling by a method later 
// Takes 3 values 

public double magnitude(){ 
    double y1= Math.sqrt(x*x+y*y+z*z); 
    return y1 ; // finds the magnitude of a vector 
} 

public ThreeVector unitv(){ 

    ThreeVector unitv= new ThreeVector(); 
unitv.ThreeVector(x/magnitude(),y/magnitude(),z/magnitude()); 
} 

Теперь вот я застрял. Я создал объект unitV, поэтому я мог бы назвать конструктор ThreeVector, но компилятор продолжает говорить, чтобы создать новый метод для ThreeVector. Не Не уверен, что происходит ...

+0

Как создать объект? Можете ли вы добавить код, который пытается использовать 'ThreeVector'? –

+0

Читайте http: //www.javabeginner.com/learn-java/java-constructors – MayurB

+0

У вас есть метод, который определяется как 'public ThreeVector unitv() ...', но не возвращает экземпляр ThreeVector. Я думаю, вы хотите удалить метод unitv и сделать что-то вроде Луиджи. – km1

ответ

6

Конструктор можно назвать только только, используя ключевое слово new. Что вы делаете здесь:

unitv.ThreeVector(x/magnitude(),y/magnitude(),z/magnitude()); 

звонит метод, называемый ThreeVector, поэтому компилятор жалуется, что нет такого метода в вашем ThreeVector классе.

Чтобы исправить это, вы должны использовать ThreeVector конструктор с аргументами, чтобы создать свой unitv экземпляр вместо:

public ThreeVector unitv(){ 
    ThreeVector unitv = new ThreeVector(x/magnitude(),y/magnitude(),z/magnitude()); 
    //and, of course, return this ThreeVector instance 
    return unitv; 
} 

И этот код может сокращаться до

public ThreeVector unitv() { 
    return new ThreeVector(x/magnitude(),y/magnitude(),z/magnitude()); 
} 

Но так как вы можете иметь ваши x, y и z с 0 значение в то же время, было бы лучше изменить логику в вашем unitv способ сначала получить значение magnitude и делать оценку, это для того, чтобы избежать деления на 0:

public ThreeVector unitv() { 
    double magnitude = magnitude(); 
    if (magnitude != 0) { 
     return new ThreeVector(x/magnitude, y/magnitude, z/magnitude); 
    } 
    return new ThreeVector(0, 0, 0); 
} 

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

public ThreeVector (double va1,double va2, double va3) { 
    x = va1; 
    y = va2; 
    z = va3 
} 
+0

ThreeVector unitv = new ThreeVector(); Я имею в виду, не то, что делает вышеприведенная линия? Извините за мое невежество, совершенно новое для этого –

+0

@RobinPhilip в первом предложении моего ответа, я объясняю, что вы можете вызвать конструктор, используя ключевое слово 'new'. Когда вы выполняете 'unitv.ThreeVector (...)', вы не вызываете конструктор с тремя параметрами, вместо этого вызываете метод под названием «ThreeVector», который не существует, поэтому компилятор дает вам проблемы. –

+0

Спасибо LUiggi получил его, и все остальные :) –

0

Нет вам нужно напрямую вызывать конструктор:

ThreeVector unitv= new ThreeVector(x,y,z); 

Только после этого вы можете вызвать метод величина

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

Должно быть: общественного ThreeVector (двойной va1, двойной VA2, двойной VA3) {х = va1; у = VA2, Z = VA3;}

0

Вы должны инициализировать new ThreeVector(va1, va2, va3).

Внимание

Ваш код в конструкторе неправильно.

{ 
    // instance field assigned to argument   
    va1=x;va2=y;va3=z; 
} 

... должно быть:

{ 
    // argument assigned to instance field 
    x = va1; 
    y = va2; 
    z = va3; 
} 
+0

@SotiriosDelimanolis AARGH. благодаря! – Mena

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