Hola, lo primero que no veo claro es por qué declaras abstract class Inmobiliaria en lugar de public abstract class Inmobiliaria
Después tengo que decirte que tus preguntas van en la buena dirección: estás viendo que hay una falta de coherencia como esa creación de un Array para cada tipo de inmueble.
El problema que veo, no queriendo criticar sino ayudar, es que lo que ocurre en el fondo es que están manejando conceptos que no acaban de entender y eso es algo así como pretender caminar en la oscuridad sin darse golpes contra las paredes. Sería más razonable buscar una linterna y aprender cómo usarla para poder avanzar. Inicialmente te puede retrasar un poco respecto a los compañeros que avanzan dándose porrazos, pero en cuanto aprendas a usar la linterna los alcanzarás y dejarás atrás. Eso en Java vendría siendo como aprender las bases de Java, por eso te hacía referencia a lo importante que es un curso sobre los fundamentos de Java.
Hablar de fundamentos llevaría mucho tiempo y eso es una tarea que tendrás que pensar tú mismo si acometes. Centrándonos en el problema que comentas, los objetos Inmobiliaria sí pueden y deben conocer métodos... Para ello se utilizan distintas técnicas, quizás es largo de explicar y ver algo de código sea más útil.
Aquí te dejo un ejemplo de cómo se puede acceder a métodos de subclases de una clase abstracta, básicamente dos técnicas (habría más, pero creo que éstas son válidas): sobreescritura de métodos abstractos y uso de instanceof. En el caso de sobreescritura, el compilador determina dinámicamente qué método es el que debe aplicar. Con instanceof, debes hacer casting para acceder al método de interés. Espero te sirva de ayuda...
CLASE INMOBILIARIA
public abstract class Inmobiliaria {
protected String nombre;
protected String direccion;
protected float metros;
protected int dormitorios;
protected String estado;
protected static int cod = 0;
//constructor
public Inmobiliaria(String nombre, String direccion, float metros, int dormitorios, String estado) {
this.nombre = nombre; this.direccion = direccion;
this.metros = metros; this.dormitorios = dormitorios;
this.estado = estado; cod++;
}
protected abstract double precio();
protected abstract boolean ascensor();
}
CLASE PISO
public class Piso extends Inmobiliaria{
private String ubicacion;
private String balcon;
private int planta;
private static final float pvpMetro = 300;
//constructor
public Piso(String nombre, String direccion, float metros, int dormitorios, String estado,String ubicacion, String balcon, int planta) {
super(nombre, direccion, metros, dormitorios, estado);
this.ubicacion = ubicacion;
this.balcon = balcon;
this.planta = planta;
}
@Override
protected double precio() {
double precioTotal = 0;
precioTotal = this.metros*pvpMetro;
return precioTotal;
}
public boolean ascensor(){
System.out.println ("Soy un ascensor piso - método sobreescrito");
boolean ascensor = false;
return ascensor;
}
public boolean ascensor2(){
System.out.println ("Soy un ascensorian2 de piso - Método sólo de piso");
boolean ascensor2 = false;
return ascensor2;
}
}
CLASE PISOS2
public class Pisos2 extends Inmobiliaria{
private String ubicacion2;
private String balcon2;
private int planta2;
private static final float pvpMetro = 300;
//constructor
public Pisos2(String nombre, String direccion, float metros, int dormitorios, String estado,String ubicacion, String balcon, int planta) {
super(nombre, direccion, metros, dormitorios, estado);
this.ubicacion2 = ubicacion;
this.balcon2 = balcon;
this.planta2 = planta;
}
@Override
protected double precio() {
double precioTotal = 0;
precioTotal = this.metros*pvpMetro;
return precioTotal;
}
public boolean ascensor(){
System.out.println ("Soy un ascensor pisos2");
boolean ascensor = false;
return ascensor;
}
public boolean dimeTrue() { return true;}
}
CLASE TEST
import java.util.ArrayList;
import java.util.Iterator;
public class Test{
public static void main (String [] args) {
Inmobiliaria i1 = new Piso("juan", "calle 1", 3.22f, 4, "vendido", "norte", "si", 2);
Inmobiliaria i2 = new Pisos2("jose", "calle flu", 6.22f, 2, "comprado", "sur", "no", 7);
i1.ascensor();
i2.ascensor();
System.out.println ("Hemos accedido a los métodos ascensor de objetos Inmobiliaria...");
ArrayList <Inmobiliaria> lista1 = new ArrayList<Inmobiliaria> ();
lista1.add(i1);
lista1.add(i2);
Iterator<Inmobiliaria> it = lista1.iterator();
while ( it.hasNext() ) { //Utilizamos el método hasNext de los objetos tipo Iterator
Inmobiliaria m1 = it.next();
System.out.println ("Analizando elemento... " );
m1.ascensor(); //Utilizamos el método next de los objetos tipo Iterator
if (m1 instanceof Piso) {((Piso)m1).ascensor2();} else {
System.out.println ("El objeto analizado no es tipo Piso");
}
}
}
}
Pequeño comentario: la clase Piso y la clase Pisos2 heredan de la clase abstracta inmobiliaria.
En la clase test creamos un array de objetos Inmobiliaria y accedemos a los métodos propios de Piso y Pisos2...