继承:
父类可以是实现类也可以是抽象类
方法:
子类拥有父类的所有方法,可以重写父类的方法,
当父类中有抽象方法,必须重写@Override该方法
属性:
但不能拥有父类的属性
类的多态:
(1) Fu f = new Zi();父类引用指向子类对象。基于继承或实现(即方法的重写)
构造器:
* 无论new的是子类的有参还是无参对象,都将先调用父类的无参构造
方法:
子类中有方法就调用子类的方法,
子类中没有方法,就调用父类的方法,
如果调用父类中没有但子类中有的方法,将会出现编译期异常
属性:
* 因为继承不会传递属性,所以父类的引用调用的还是父类的属性,而不是子类的
(2)Zi zi = (Zi) new Fu();编译期没有问题,但会有运行时异常,ClassCastExecption
public class Fu {
String s = "Fu的参数s";
public Fu(){
System.out.println("Fu的空构造");
}
public Fu(Strings){
System.out.println("Fu的带参构造,打印s="+s);
}
void m_a(){
System.out.println("Fu的方法a");
}
void m_b(){
System.out.println("Fu的方法b");
}
}
public class Zi extends Fu{
String s = "Zi的参数s";
public Zi() {
System.out.println("Zi的空构造");
}
public Zi(Strings) {
System.out.println("Zi的带参构造,打印s=" +s);
}
void m_a() {
System.out.println("Zi的方法a");
}
void m_c() {
System.out.println("Zi的方法c");
}
}
public class Test {
public static void main(String[] args) {
Fu fu = new Zi();//调用父类的空构造器,子类的空构造器
fu.m_a();
fu.m_b();//父类的引用掉用方法:如果子类中有这个方法,将调用子类的;如果子类没有这个方法,将调用父类的;如果父类中没有这个方法,但子类中有,将编译错误
//fu.m_c();
//The System class contains several useful class fieldsand methods. It cannot be instantiated.
System.out.println(fu.s);//父类引用获取变量,将获取父类的
System.out.println("---------------------------------------");
Zi zi = new Zi();
zi.m_a();
zi.m_b();
zi.m_c();//子类的引用调用方法:如果子类中有这个方法,将直接调用子类的;如果子类中没有这个方法,将调用父类的
System.out.println(zi.s);//子类引用获取变量,将获取子类的
System.out.println("----------------------------------------");
Fu fu2 =new Zi("str");//调用父类的功构造器,子类的带参构造器
System.out.println("----------------------------------------");
Zi zi2 = (Zi)new Fu();//运行时异常ClassCastExecption,但是还是会调用父类的空构造器
zi2.m_a();
zi2.m_b();
zi2.m_c();
System.out.println(zi2.s);
System.out.println("-----------------------------------------");
Zi zi3 = (Zi)new Fu("str");//运行时异常ClassCastExeception,但是会调用父类的带参构造器
}
}
Fu的空构造
Zi的空构造
Zi的方法a
Fu的方法b
Fu的参数s
---------------------------------------
Fu的空构造
Zi的空构造
Zi的方法a
Fu的方法b
Zi的方法c
Zi的参数s
----------------------------------------
Fu的空构造
Zi的带参构造,打印s=str
Fu的空构造
Exception in thread "main" java.lang.ClassCastException:Test.polymorphic_1.Fu cannot be cast to Test.polymorphic_1.Zi
atTest.polymorphic_1.Test.main(Test.java:19)
-----------------------------------------
Fu的带参构造,打印s=str
Exception in thread "main" java.lang.ClassCastException:Test.polymorphic_1.Fu cannot be cast to Test.polymorphic_1.Zi
atTest.polymorphic_1.Test.main(Test.java:25)