Buenas noches.
El código es correcto.
Podrías ahorrarte las variables numeroCaracteres y primeraLetra y usar directamente los métodos.
Además usando el método equalsIgnoreCase() en lugar de equals() ya no hace diferencia entre si la letra es mayúscula o minúscula.
Quedaría:
import java.util.Scanner;
public class PruebaTexto1{
public static void main (String [] args){
System.out.println("Empezamos el programa");
System.out.println("Por favor introduzca una cadena por teclado");
String entradaTeclado = "";
Scanner entradaEscaner = new Scanner(System.in);//Creacion de un objeto scanner
entradaTeclado = entradaEscaner.nextLine();
if (entradaTeclado.length()<5){System.out.print("La palabra introducida tiene menos de 5 caracteres");}
else if(entradaTeclado.length()==5||entradaTeclado.length()<=15){System.out.print("La palabra introducida tiene entre 5 y 15 caracteres");}
else{System.out.print("La palabra introducida tiene mas de 15 caracteres");}
if (entradaTeclado.substring(0,1).equalsIgnoreCase("a")||entradaTeclado.substring(0,1).equalsIgnoreCase("á")){System.out.print(" y empieza por A");}
else{System.out.print(" y no empieza por A");}
}
}
En cuanto a la pregunta que hacías de por que no se podía usar == , es porque el método equals y el operador = = hacen dos pruebas completamente diferentes para la igualdad. Mientras que el método equals compara los caracteres contenidos en una String, el operador = = compara dos referencias de objeto para ver si se refieren a la misma instancia. Por tanto, no podemos usar el signo == por que esta sería una comparación binaria de punteros a memoria y no nos devolvería el valor correcto