Why do I get errors about non-staic methods being referenced from the static context?
In the following block of code, I am trying to print the properties whose location
, monthlyRent
, numberOfBedrooms
defined in the Property
class being equal to this method's parameters in LettingAgent class. When I compiled, the error is occured in the if line where it says non-static method like getlocation()
can't be referenced from static context.
/**
* Java coursework on class property which present detail information about the property
public class Property
{
// instance variables of class property.
private String address;
private char location;
private double monthlyRent;
private int numberOfBedrooms;
private boolean occupied;
private String tenantName;
/**
* Constructor for object of class Property with required parameters.
*/
public Property( String addressinput, char locationinput, double Rentinput, int Bedsinput )
{
//initialise the instance variables or fields of property class.
address = addressinput;
location = locationinput;
monthlyRent = Rentinput;
numberOfBedrooms = Bedsinput;
occupied = false;
tenantName = "";
}
/**
* Return the address of the property
*/
public String getAdress( )
{
return address;
}
/**
* Return the location of the property
*/
public char getLocation( )
{
return location;
}
/**
* Return the monthlyRent of the property
*/
public double getmonthlyRent( )
{
return monthlyRent;
}
/**
* Return the numberOfBedrooms of the property
*/
public int getnumberOfBedrooms( )
{
return numberOfBedrooms;
}
/**
* Return the occupied value of the property
*/
public boolean isoccupied( )
{
return occupied;
}
/**
* Return the tenant's name of the property
*/
public String gettenantName( )
{
return tenantName;
}
/**
* Set the monthly rent to a new value
*/
public void setmonthlyRent( double newRent )
{
monthlyRent = newRent;
}
/**
* Adding tenant's na开发者_StackOverflowme to the property
*/
public void addtenantName(String newTenant)
{
if(occupied == false) {
tenantName = newTenant;
occupied = true;
}
else {
System.out.println(" The property is already occupied");
}
}
/**
* Removing tenant's name of the property
*/
public void removetenantName( )
{
if( occupied == true) {
tenantName = "";
occupied = false;
}
else {
System.out.println(" The property is new and not occupied");
}
}
/**
* Print all the property attributes
*/
public void printProperty( )
{
//simulate the printing of the property attributes.
System.out.println( "The details of the property are as follow" );
System.out.println("Address:" + address );
switch(location){
case 'n': case 'N': System.out.println("Location: North london" );break;
case 's': case 'S': System.out.println("Location: South london" );break;
case 'e': case 'E': System.out.println("Location: East london" );break;
case 'w': case 'W': System.out.println("Location: West london" );
}
System.out.println("Monthly-Rent:" + monthlyRent );
System.out.println("Number of Bedrooms:" + numberOfBedrooms );
System.out.println("Status of property:" + occupied );
if(occupied == true) {
System.out.println("Tenant Name:" + tenantName );
}
else {
System.out.println("Property is empty at moment" );
}
}
}
LettingAgent Class (calling class)
import java.util.ArrayList;
/**
* Write a description of class LettingAgent here.
*/
public class LettingAgent
{
// instance variables of LettingAgent Class.
private ArrayList<Property>agproperty;
private int Propnumber;
/**
* Constructor for objects of class LettingAgent
*/
public LettingAgent()
{
// initialise instance variables
agproperty = new ArrayList<Property>();
Propnumber = 0;
}
/**
* Return the property number of the Class LettingAgent.
*/
public int getPropnumber(){
return Propnumber;
}
/**
*Method to add new property to the class LettingAgent via class Property.
*/
public void addNewProperty(String addressinput, char locationinput, double Rentinput, int Bedsinput)
{
// put your code here
Property newProperty = new Property(addressinput,locationinput,Rentinput,Bedsinput);
agproperty.add(newProperty);
}
/**
* @Description Method for removing the propety from the class LettingAgent.
* @param int propnumber
*/
public void removalOfProperty(int Propnumber)
{
// initialise instance variables
if( Propnumber<agproperty.size()){
agproperty.remove(Propnumber);
System.out.println("The property has been removed");
}
else{
System.out.println("The Property number is not valid");
}
}
/**
* Method for adding tenant to the property within class LettingAgent via class Property.
*/
public void addTenant(int Propnumber, String newName, Property newProperty)
{
// initialise instance variables
if( Propnumber<agproperty.size()){
agproperty.get(Propnumber);
newProperty.addtenantName(newName);
}
else{
System.out.println("The Property number is not valid");
}
}
/**
* Method for removing tenant from the class LettingAgent via Property class.
*/
public void removeTenant(int Propnumber,Property newProperty)
{
// initialise instance variables
if( Propnumber<agproperty.size()){
agproperty.get(Propnumber);
newProperty.removetenantName( );
}
else{
System.out.println("The Property number is not valid");
}
}
/**
*Method for searching property within the LettingAgent class.
*/
public void searchProperty(String Address)
{
// initialise instance variables
for(Property Property : agproperty){
if (agproperty.get(Propnumber).equals( Address)){
System.out.println("The details of the property is as follow"+ Property);
}
else{
System.out.println("The property is not in the Letting agent's Stock");
}
}
}
/**
* Method for printing unoccupied property of the class LettingAgent.
*/
public void printListOfUnoccupiedProperty( char Location, double maxmonthlyRent, int miniNoBeds)
{
// initialise instance variables
for(Property property : agproperty){
if((Property.getLocation().equals(Location))&&(Property.get(monthlyRent).equals(maxmonthlyRent))&&(agproperty.get(numberOfBedrooms).equals(miniNoBeds))){
System.out.Println(Propnumber);
Property.printProperty();
}
else{
System.out.println("The Property number is not valid");
}
}
}
}
In the last method you define (formatted below):
/**
* Method for printing unoccupied property of the class LettingAgent.
*/
public void printListOfUnoccupiedProperty(char Location, double maxmonthlyRent, int miniNoBeds) {
// initialise instance variables
for (Property Property : agproperty) {
if ((Property.getLocation().equals(Location))
&& (Property.get(monthlyRent).equals(maxmonthlyRent))
&& (agproperty.get(numberOfBedrooms).equals(miniNoBeds))) {
System.out.Println(Propnumber);
Property.printProperty();
} else {
System.out.println("The Property number is not valid");
}
}
}
on the line:
&& (Property.get(monthlyRent).equals(maxmonthlyRent))
you're calling the get
method of the Property
variable. I think that should be Property.getMonthlyRent()
.
One other thing, in Java you should name your variables differently than their class names. I would use something like
for (Property property : agproperty) { ...
I know it's a small change, but it makes a big difference in the readability of your code. You can read about other Java code conventions in Code Conventions for the Java Programming Language.
Okay, I've compiled your code in BlueJ now and this is what I've found. First I get the error message
non-static method getLocation() cannot be referenced from a static context
When you changed the variable name from Property
to property
in the following line:
for(Property property : agproperty){
you needed to also change it where it is referenced in the next line:
if((Property.getLocation().equals(Location))&& ...
The word Property
now only refers to the class name, so the phrase Property.getLocation()
looks like a static method call. You need to change that to:
if((property.getLocation().equals(Location))&& ...
Note the lower-case of property
.
Next there are a few more method calls like Property.get(monthlyRent)
that need to be fixed. Again you'll need to change the variable name to property
and put the correct method name in.
Following that I got the error message:
char cannot be dereferenced
This means that you're trying to call a method on a variable of the primitive char
type. You're doing that right at the beginning of the same method where you have:
property.getLocation().equals(Location) ...
You can't use the equals
method on a char
because it's a primitive type, not an Object type. (What do you use instead to compare two primitives?)
You do the same thing again when you try to compare two double
values.
property.getmonthlyRent().equals(maxmonthlyRent)
Next you have:
agproperty.get(numberOfBedrooms).equals(miniNoBeds)
Here the problem is a little bit more complicated. It looks like you have the wrong variable name at the beginning of this phrase. Think about what you want to compare here and look at the two previous problems you've fixed and I think you can figure out what should be here instead.
精彩评论