疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中的关键字:extends 与 implements


 

   

  一个类通过关键字implements声明自己使用一个或者多个接口。在类的声明中,通过关键字extends来创建一个类的子类。

  class 子类名 extends 父类名 implenments 接口名

  {...

  }

  ===========================================================

  A a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?

  ===========================================================

  class B extends A

  继承过后通常会定义一些父类没有的成员或者方法。

  A a = new B();

  这样是可以的,上传。

  a是一个父类对象的实例,因而不能访问子类定义的新成员或方法。

  

  假如这样定义:

  class A{

  int i;

  void f(){}

  }

  class B extends A{

  int j;

  void f(){} //重写

  void g(){}

  }

  然后:

  B b = new B();

  b就是子类对象的实例,不仅能够访问自己的属性和方法,也能够访问父类的属性和方法。诸如b.i,b.j,b.f(),b.g()都是合法的。此时 b.f()是访问的B中的f()

  A a = new B();

  a虽然是用的B的构造函数,但经过upcast,成为父类对象的实例,不能访问子类的属性和方法。a.i,a.f()是合法的,而a.j,a.g()非 法。此时访问a.f()是访问B中的f()

  ==========================================================

  A a = new B(); 这条语句,实际上有三个过程:

  (1) A a;

  将a声明为父类对象,只是一个引用,未分配空间

  (2) B temp = new B();

  通过B类的构造函数建立了一个B类对象的实例,也就是初始化

  (3) a = (A)temp;

  将子类对象temp转换未父类对象并赋给a,这就是上传(upcast),是安全的。

  经过以上3个过程,a就彻底成为了一个A类的实例。

  子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的。

  ===========================================================

  a.f()对应的应该是B类的方法f()

  调用构造函数建立实例过后,对应方法的入口已经确定了。

  如此以来,a虽被上传为A类,但其中重写的方法f()仍然是B的方法f()。也就是说,每个对象知道自己应该调用哪个方法。

  A a1 = new B();

  A a2 = new C();

  a1,a2两个虽然都是A类对象,但各自的方法f()不同。这正是1楼说的多态性的体现。