I am curently working on a program what simulates boats moving on a lake, there are rules that apply to different boats. I need to get the distance from one boat to another, check if the closest boat is a certain kind of boat and follow the rules given for that boat. My problem is that I am not sure where I should put the method that would calculate the closest boat and its type (Sail\Motor), by where I mean Either main method of the program , or the superclass from which the different boatclasses are being extended.

Here is what I got so far:

Thanks in advance.Code:class boatprogram5{ static int numboats=4; static boatclass boat[]=new boatclass[numboats+1]; public static void main(String[]args){ boatclass boat0=new sailboatclass(1.6,0.3,1.1,10.4,35,false,65); boat[1]=boat0; boat0=new motorboatclass(30.5,10.8,-5.2,-1.4,18,25); boat[2]=boat0; boat0=new sailboatclass(3.8,2.4,7.2,-4.9,30,true,120); boat[3]=boat0; boat0=new motorboatclass(7.4,14.8,0.2,8.6,12,16); boat[4]=boat0; double time=0; double deltatime=2.0; while(time<=10.0){ System.out.println("Time: "+cpj.nf(time,7,2)); for(int i=1;i<=numboats;i++){ double nearestdistance=Double.MAX_VALUE; for(int j=1;j<=numboats;j++){ if(i!=j){ if(boat[i].distance(boat[j])<nearestdistance){ nearestdistance=boat[i].distance(boat[j]); boat[i].nearestboat=boat[j]; } } } System.out.println("Boat "+i+" is at "+boat[i].positionstring()); System.out.println(" nearest boat is at "+boat[i].nearestboat.positionstring()); System.out.print(" distance: "+cpj.nf(boat[i].nearestdistance(),7,2)); String nearestboattype=""; if(boat[i].nearestboat instanceof sailboatclass) {nearestboattype=" Sailboat";} if(boat[i].nearestboat instanceof motorboatclass) {nearestboattype=" Motorboat";} System.out.println(" type="+nearestboattype); } time+=deltatime; for(int i=1;i<=numboats;i++){ boat[i].moveboat(deltatime); } } } } abstract class boatclass{ double x=0; double y=0; double vx=0; double vy=0; boatclass nearestboat; public boatclass(double x,double y,double vx,double vy){ this.x=x; this.y=y; this.vx=vx; this.vy=vy; } void moveboat(double deltatime){ x+=deltatime*vx; y+=deltatime*vy; } void stop(){ vy=0; vx=0; } double distance(boatclass otherboat){ double z=Math.sqrt(Math.pow((x-otherboat.x),2)+Math.pow((y-otherboat.y),2)); return z; } double nearestdistance() { if(distance(nearestboat)<=3){ stop(); System.out.println(" Boat has stopped stopped"); } return distance(nearestboat); } String positionstring(){ return("x ="+cpj.nf(x,7,2)+" y ="+cpj.nf(y,7,2)); } } class sailboatclass extends boatclass{ private int mastheight=0; boolean sailsfurled=false; double saildirection=0; public sailboatclass(double x,double y,double vx,double vy, int mastheight, boolean sailsfurled,double saildirection){ super(x,y,vx,vy); this.mastheight=mastheight; this.sailsfurled=sailsfurled; this.saildirection=saildirection; } } class motorboatclass extends boatclass{ double fuellevel=0; private double fueltanksize=0; public motorboatclass(double x,double y,double vx,double vy,double fuellevel,double fueltanksize){ super(x,y,vx,vy); this.fuellevel=fuellevel; this.fueltanksize=fueltanksize; } }