请教下关于JAVA继承与多态的问题

package test;

public class A {
public void A1( ){
System.out.println("A的方法");
}
}

package test;

public class B extends A{

public void B1(){
    System.out.println("B的方法");
    }

}

图片说明
为什么a不能调用B的B1方法呢?

a里面没有定义B的方法,子类可以调用父类的,但是父类不可以调用子类的,a是A的一个引用变量,B是A的子类。可以进行强制转换

简单来说是编译行为和运行时行为
1.编译器认为a的行为特征是A
2.你可以将a强转为B,再执行B1()

父类不拥有子类的行为,a属于父类,需要强转成B

A a=new B();这是一个向上转型的过程 ,向上转型后子类B的方法会被隐藏掉,如果这时你要调用子类B的方法就要向下转型了

A a=new B();
a.XX这是多态的表达形式。

运行时多态存在的三个必要条件:
一、要有继承(包括接口的实现);
二、要有重写;
三、父类引用指向子类对象。

多态表达形式可以实现父类应用,子类实现,但是调用的方法必须是可继承的方法,否则逻辑就会乱套

http://www.jb51.net/article/34413.htm