The 30 second answer
Var, added in Java 10, lets the compiler infer a local variable's type from what's on the right side. It is still fully static typing; the type is fixed at compile time. It only works for local variables with an initializer, loop variables, and, since Java 11, lambda parameters. It can't be used for fields, method parameters or return types, and var x = null won't compile.
var orders = new ArrayList<Order>(); // ArrayList<Order>
for (var entry : map.entrySet()) { ... }
try (var in = Files.newInputStream(path)) { ... }
BiFunction<Integer, Integer, Integer> add = (var a, var b) -> a + b; // Java 11; allows annotationsNot allowed: fields, method parameters, return types, var x; without an initializer, var x = null;, var f = () -> 1; (a lambda needs an explicit target type), and array initializers like var a = {1, 2};.
var is a reserved type name, not a keyword, so existing variables named var still compile.
Trap: var list = new ArrayList<>(); infers ArrayList<Object>.
[Opinion] Use var when the type is obvious from the right side; spell it out when it carries meaning the reader needs.
Sources: JEP 286: Local-Variable Type Inference, JEP 323: Local-Variable Syntax for Lambda Parameters