Object created by new B() can be used as an object of either of three types — A, B or C. But you can't declare a variable of several types.
Since B is a subtype of A and C you can use its instance as an instance of any of those types. E.g.
B o = new B();
A aO = o;
C cO = o;
Now you can use o to access both speak and shutUp methods, you can use aO to access speak method and cO to access shutUp method. It doesn't matter which variable you will use the methods called will be the same because those variables all reference the same object. Why you can't use aO to invoke shutUp in Java is because you have declared your variable with a type that doesn't have such a method. Although you know that this particular object does have that method doesn't make it so in general.
class D extends A {
public void speak(){
System.out.println("Class D");
}
}
List<A> as = new ArrayList<A>();
as.add(new A());
as.add(new B());
as.add(new D());
A a0 = as.get(0);
A a1 = as.get(1);
A a2 = as.get(2);
a0.speak(); // >> Class A
a1.speak(); // >> Class B
a2.speak(); // >> Class D
Now, in this example you have instances of three different classes in a single collection. When you pass this collection around or modify it you will never know which class is each object actually is. All you know is that they all are of type A, they are guaranteed to be of that type though actually they can be of any subtype of A (like B or D).