2015-08-17 25 views
3

我对Java相当陌生,我正在制作一个小型应用程序,需要两辆汽车并返回谁更快。我为汽车上了另一堂课。首先,我在主要方法中创建了所有对象,并且它工作正常,然后我尝试将代码放在另一个方法中,并从main调用它,只是为了使它更整洁,并且出现错误。可能有些显而易见的,但我太累了,没法思考。使用另一个函数来创建对象

错误:(7,14)的java:无法找到符号 符号:可变法拉利 位置:Test类

错误:(7,23)的java:无法找到符号 符号:可变兰博基尼 位置:类测试

public class Test { 

public static void main(String[] args) { 

    createCars(); 

    race(ferrari, lamborghini); 

} 

public static void createCars() { 

    Car ferrari = new Car("Ferrari", "California"); 
    ferrari.setHp(552); 
    ferrari.setAcceleration(3.3); 

    Car lamborghini = new Car("Lamborghini", "Huracan"); 
    lamborghini.setHp(602); 
    lamborghini.setAcceleration(2.5); 

    Car bmw = new Car("BMW", "M5"); 
    bmw.setHp(560); 
    bmw.setAcceleration(3.7); 

    Car cadillac = new Car("Cadillac", "CTS-V"); 
    cadillac.setHp(640); 
    cadillac.setAcceleration(3.6); 

} 


public static void race(Car carA, Car carB) { 
    if (carA.getAcceleration() < carB.getAcceleration()) { 
     System.out.println("The " + carA.getMake() + " " + carA.getModel() + " is faster than the " + carB.getMake() + " " + carB.getModel()); 
    } else if (carB.getAcceleration() < carA.getAcceleration()) { 
     System.out.println("The " + carB.getMake() + " " + carB.getModel() + " is faster than the " + carA.getMake() + " " + carA.getModel()); 
    } else { 
     System.out.println("It's a tie"); 
    } 
} 

}

+2

一旦你离开'createCars'方法,那个方法中定义的变量就消失了。您需要从方法返回它们或使用类级变量。 – David

+2

您可以在createCars方法中创建对象,但只能通过此方法看到它们。当方法结束时,法拉利和兰博基尼都消失了。 – mszalbach

+0

知道这是件容易的事,哈哈!谢谢你们,可能会一直陷在这样一个愚蠢的事情上。 –

回答

4

你得到这个错误,因为您的汽车实例ferrarilamborghini不在主要功能的范围内。

你可以修改创建汽车的方法,它返回一个新的汽车insteand:

​​

,然后你可以使用它:

public static void main(String[] args) { 

    Car ferrari = createCar("Ferrari", "California", 552, 3.3); 
    Car lamborghini = createCar("Lamborghini", "Huracan", 602, 2.5); 
    race(ferrari, lamborghini); 

} 

...或者直接

public static void main(String[] args) { 
    race( 
     createCar("Ferrari", "California", 552, 3.3), 
     createCar("Lamborghini", "Huracan", 602, 2.5) 
    ); 
} 
+0

谢谢,好又简单! –

+1

@EmilØgård当你在'main()'方法中创建所有对象时,这不就是你开始的吗? – dasblinkenlight

+1

@EmilØgård此外,这种方式并不直接支持创建多个(> 2)汽车。 – CubeJockey

3

提前声明你的对象。这允许变量保持在您的race()函数的范围内。否则,只有createCars()方法会看到你的汽车。

public class Test { 

    static Car ferrari; 
    static Car lamborghini; 
    static Car bmw; 
    static Car cadillac; 

    public static void main(String[] args) {  
     createCars();  
     race(ferrari, lamborghini);  
    } 

    public static void createCars() { 

     ferrari = new Car("Ferrari", "California"); 
     ferrari.setHp(552); 
     ferrari.setAcceleration(3.3); 

     lamborghini = new Car("Lamborghini", "Huracan"); 
     lamborghini.setHp(602); 
     lamborghini.setAcceleration(2.5); 

     bmw = new Car("BMW", "M5"); 
     bmw.setHp(560); 
     bmw.setAcceleration(3.7); 

     cadillac = new Car("Cadillac", "CTS-V"); 
     cadillac.setHp(640); 
     cadillac.setAcceleration(3.6); 

    } 
} 
+0

有没有简单的方法可以在不创建类中的对象的情况下进行这项工作?所以我不需要每次创建另一个Car对象时都声明它。 –

+0

那么,你可以创建一个'ArrayList'来存储你的Car对象,并且只能全局实例化它。然后在你的'createCars()'方法中,你可以向该数组中添加任何新的对象,并在整个运行时间内持续存在。 – CubeJockey

+0

@Downvoter有何评论? – CubeJockey

3

只要您创建的对象的方法结束,您创建的对象就变得无法访问(因此已准备好进行垃圾回收)。这是因为您将它们分配给该方法内的局部变量,并且程序的其他部分无法访问这些变量。

您需要一种方法让程序的其余部分访问您创建的汽车。一种方法是使“持有”他们的对象,像这样:

class Garage { 
    private Car ferrari; 
    private Car lamborghini; 
    private Car bmw; 
    private Car cadillac; 
    // You could use a constructor instead of using a separate method. 
    public void createCars() { 
     ferrari = new Car("Ferrari", "California"); 
     ferrari.setHp(552); 
     ferrari.setAcceleration(3.3); 

     lamborghini = new Car("Lamborghini", "Huracan"); 
     lamborghini.setHp(602); 
     lamborghini.setAcceleration(2.5); 

     bmw = new Car("BMW", "M5"); 
     bmw.setHp(560); 
     bmw.setAcceleration(3.7); 

     cadillac = new Car("Cadillac", "CTS-V"); 
     cadillac.setHp(640); 
     cadillac.setAcceleration(3.6); 
    } 
    public void getFerrari() {return ferrari;} 
    public void getLamborghini() {return lamborghini;} 
    public void getBmw() {return bmw;} 
    public void getCadillac() {return cadillac;} 
} 

现在你可以使用Garage类在main()方法,像这样:

public static void main(String[] args) { 
    Garage garage = new Garage(); 
    // If you move createCars into Garage's constructor, you wouldn't need to call createCars any longer. 
    garage.createCars(); 

    race(garage.getFerrari(), garage.GetLamborghini()); 
} 
+0

非常感谢,真的帮了我很多! –

相关问题