2013-11-23 5 views
0

Я работаю над 3 программами, которые содержат классы CarRental.java, LuxuryCarRental.java и UseCarRental.java, на моей LuxuryCarRental.java я продолжаю получать ошибку, Ошибка; Не могу найти символ; Символ: переменная super для класса, вот моя программа, я относительно новичок в Java, поэтому, пожалуйста, будьте детализированы! Заранее спасибо!Ошибка; Не могу найти символ; Символ: переменная super

import java.text.DecimalFormat; 


public class LuxuryCarRental extends CarRental{ 

private boolean chauffeur; 
private double dailyChauffeurFee; 


public LuxuryCarRental(String renterName, int renterZip, String sizeOfCar,int rentalDays, boolean chauffeur) { 
    super(renterName, renterZip, sizeOfCar, rentalDays); 
    this.chauffeur = chauffeur; 
} 


public void display(){ 

    super.dailyRentalFee = 79.99; 


    this.dailyChauffeurFee = 0; 
    if(chauffeur){ 
     this.dailyChauffeurFee = 200; 
    } 


    super.totalRentalFee = super.dailyRentalFee * super.getRentalDays() + this.dailyChauffeurFee * super.getRentalDays(); 


    DecimalFormat df = new DecimalFormat("0.00"); 


    System.out.println("Car Rental - Renter Name : " + super.getRenterName() + ", Renter Zip: " + super.getRenterZip() + 
      ", Rental Days : " + super.getRentalDays() + 
      ", Daily Rental Fee: " + dailyRentalFee + ", Daily Chauffer Fee: " + dailyChauffeurFee + 
      ", Total Rental Fee: " + df.format(totalRentalFee)); 
} 

} 

И вот все классы из всех трех моих программ, которые соответствуют друг другу.

public class CarRental { 

private String renterName; 
private int renterZip; 
private String sizeOfCar; 
private int rentalDays; 
protected double dailyRentalFee; 
protected double totalRentalFee; 


public class UseCarRental 

public class LuxuryCarRental extends CarRental { 

private boolean chauffeur; 

private double dailyChauffeurFee; 

public CarRental(String renterName, int renterZip, String sizeOfCar, int rentalDays) 
{ 
    renterName = renterName; 
    renterZip = renterZip; 
    sizeOfCar = sizeOfCar; 
    rentalDays = rentalDays; 

И мой измененный код:

public class CarRental 
{ 

public static void main(String[] args) 
{ 

private String renterName; 
private int renterZip; 
private String sizeOfCar; 
private int rentalDays; 
protected double dailyRentalFee; 
protected double totalRentalFee; 
} 


public CarRental(String renterName, int renterZip, String sizeOfCar, int rentalDays) 
{ 
    renterName = renterName; 
    renterZip = renterZip; 
    sizeOfCar = sizeOfCar; 
    rentalDays = rentalDays; 
} 

public void setDailyRentalFee(double dailyRentalFee) 

{ 

this.dailyRentalFee = dailyRentalFee; 

} 

public double getDailyRentalFee() 

{ 

return dailyRentalFee; 

} 


public void display(){ 

    if(sizeOfCar.equalsIgnoreCase("economy")) 
    { 
     dailyRentalFee = 29.99;   
    } 

    else if(sizeOfCar.equalsIgnoreCase("midsize")) 
    { 
     dailyRentalFee = 38.99;   
    } else { 
     dailyRentalFee = 43.50;   
    } 

    //calculates total rental fee 
    this.totalRentalFee = this.dailyRentalFee * rentalDays; 

    DecimalFormat df = new DecimalFormat("0.00"); 

    //displays output 
    System.out.println("Car Rental - Renter Name : " + renterName + ", Renter Zip: " + renterZip + 
      ", Size of car: " + sizeOfCar + ", Rental Days : " + rentalDays + 
      ", Daily Rental Fee: " + dailyRentalFee + ", Total Rental Fee: " + df.format(totalRentalFee)); 
} 


public String getRenterName() 
{ 
    return renterName; 
} 


public int getRenterZip() 
{ 
    return renterZip; 
} 


public int getRentalDays() 
{ 
    return rentalDays; 
} 

} 

ответ

2
super.dailyRentalFee = 79.99; 

Это не работает. То же самое можно сказать о каждом другом месте, где вы его использовали.

Я предполагаю, что ваш класс имеет поле privatedailyRentalFee? Сделать это protected вместо. Или используйте public/protected геттеры и сеттеры.

Вы находитесь в подклассе, который вы действительно должны рассматривать как расширение суперкласса. Все, что доступно в суперклассе, доступно в подклассе при условии, что вы не используете private, а скорее protected (доступно в текущем классе и подклассе) или public (доступно везде, где есть доступ к текущему классу).

Пример:

class SuperClass { 
    protected int someValue = 5; 
    private int anotherValue = 10; 
} 

class SubClass extends SuperClass { 
    public void doSomething() { 
     someValue = 6; // I can access it because it's protected instead of private 
     anotherValue = 1; // I can't access it because it's private and only accessible in the SuperClass 
    } 
} 

Чтобы подвести итог:

  • Отбросьте super.X, super() используется для вызова конструктора суперкласса
  • Использование protected или public идентификаторы доступа вместо private
+0

Если поля защищены, вы можете просто сделать 'this.dailyRentalFee = 79.99' или' dailyRentalFee = 79.99'. Нет необходимости указывать, что они пришли из 'super'. –

+0

Да @Jeroen Я использую защищенное двойное поле для моего ежедневногоRentalFee – RequiemDream

+0

@FlightOdyssey: при наборе текста я понял, что я никогда не говорил об этом явным образом. Он сейчас там. –

0

Первое, super не работает так, как вы его использовали. , когда вы расширяете класс, CarRental в вашем случае, вы наследуете все public и protected членов этого класса. поэтому, чтобы использовать переменную вашего суперкласса, вам не нужно префикс super, вы можете просто использовать переменную, как если бы ее класс удержал. поэтому вместо

super.dailyRentalFee = 79.99; 

использования

dailyRentalFee = 79.99; // since dailyRentalFee is protected in class CarRental 
         // this will work 

аналогично,

super.totalRentalFee = super.dailyRentalFee * super.getRentalDays() + this.dailyChauffeurFee * super.getRentalDays(); 

должна быть записана в виде

totalRentalFee = dailyRentalFee * getRentalDays() + this.dailyChauffeurFee * getRentalDays(); 

при условии, метод getRentalDays является открытым в CarRental класс.

и об ошибке вы упомянули в @ комментариях ответов Йерун, в убедитесь LuxuryCarRental и CarRental находятся в одной и той же package. Чтобы быть простым, убедитесь, что оба файла находятся в одной папке.

EDIT:

Ваш код не содержит метод main, поэтому получается, что ошибка. Вы должны иметь метод main в своей программе для его выполнения. Это отправная точка всех приложений Java. поэтому определите класс с методом main внутри, а затем создайте объект LuxuryCarRental и выполните свои вычисления там. например,

class Sample { 
    public static void main(String[] args) { //this is how all main methods would look 

    LuxuryCarRental luxuryCar = new LuxuryCarRental("A",62020,"SUV",10,true); 
    //call the LuxuryCarRental methods as per your coding requirements 

    } 
} 

см, его SimPE,

class CarRental { 
    //CarRental code 
} 

class LuxuryCarRental { 
    //LuxuryCarRental code 
} 

class Test { 
    public static void main(String[] args) { 
    LuxuryCarRental luxuryCar = new LuxuryCarRental("A",62020,"SUV",10,true); 
    luxuryCar.display(); 
    } 
} 
+0

теперь я получаю эту ошибку при запуске файла, теперь компиляция работает нормально: нет основных методов, апплетов или мидлетов, найденных в файле? – RequiemDream

+0

@ user2966818: см. Мой обновленный ответ –

+0

Ой, я не могу поверить, что забыл об этом! – RequiemDream

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