正在阅读:学习和使用继承时先要清楚的三点学习和使用继承时先要清楚的三点

2004-03-09 09:56 出处:PConline 作者:qlampskyface 责任编辑:linjixiong

  第一点:

  那就是

         1.如果子类覆盖了父类的方法,那么子类对象调用该方法时,被该方法修改的类级别变量是子类的变量。
         2.如果子类没有覆盖父类方法,而直接调用父类的方法,那么被该方法修改的类级别变量是父类的变量。

  1则如下例:

  public class Temp{
  public static void main(String args[]){
    b bb = new b();
    bb.fuqin();
  }
  }
  class a{
  public String s = "fuqin";
  public void fuqin(){
    System.out.println(s);
    }


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


  }
  class b extends a{
  public String s = "erzi";
  public void fuqin(){
    System.out.println(s);
  }
  }
  //结果为erzi


  2.则如下例:

  public class Temp{
  public static void main(String args[]){
    b bb = new b();
    bb.fuqin();
  }
  }
  class a{
  public String s = "fuqin";
  public void fuqin(){
    System.out.println(s);
    }


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


  }
   class b extends a{
  public String s = "erzi";
  public void erzi(){
    System.out.println(s);
  }
  }
  //结果为fuqin

  第二点:

  那就是对“覆盖(override)”和“重载(overload)”以及重建的概念的清晰。
  先声明一下:重建就是写一个新的方法。
  如下例:
  下面这个叫覆盖


  public class Temp {
    public static void main(String[] args) {
    Sub sub = new Sub();
    sub.plus(2);
     System.out.println(sub.i);
    }


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


  }

  class Super {
  protected int i;
  void plus(int i) {
    this.i += i;
  }
  }

  class Sub
    extends Super {
  protected int i = 1;
  void plus(int i){
    this.i=i+5;
  }
  }


  下面这个叫重建,不是重载:

  public class Temp {
    public static void main(String[] args) {
      Sub sub = new Sub();


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


    sub.plus(2);
    sub.plus(2,2);
    System.out.println(sub.i);
    System.out.println(((Super)sub).i);
    }
  }

  class Super {
  protected int i;
  void plus(int i) {
    this.i += i;
    }
  }

  class Sub
    extends Super {
  protected int i = 1;
  void plus(int i,int j){
    this.i=i+j;
  }
  void jian(int i){
    this.i=this.i-i;
  }
  }

  第三点:


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

        那就是通常所说的“继承后使用多态”、“动态方法调度”、“运行时类型识别”了。先不要被上面的术语搞昏头哦:-)

        可以总结为以下两条:

        1.默认状态(和强制类型转换状态相区别)下,该对象(sub)能且只能调用父类方法和父类变量(调用子类方法时会出现编译期错误)。此种情况下,还有两种不同的情况:
           ▲被调用方法是被子类覆盖的方法,这时父类变量不能被该方法修改。【注1】
           ▲被调用方法没有被子类覆盖,这时父类变量可以被该方法修改。
看看下面的代码,注意1~5处。


  public class Temp {
  public static void main(String[] args) {
    Super sub = new Sub();
    System.out.println(sub.i);//打印结果为0----------------------------------------------1
    sub.plus(3);//默认状态下调用被覆盖了的父类方法------------------------------2
    System.out.println(sub.i);//打印结果为0----------------------------------------------3
    sub.print();//默认状态下调用没有被覆盖的父类方法----------------------------4
    System.out.println(sub.i);//打印结果为5:-------------------------------------------5
    }
  }

  class Super {
    protected int i=0;
    void plus(int i) {
      this.i =3;


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


    }
    void print(){
      this.i=5;
    }
  }

  class Sub
    extends Super {
  protected int i = 1;
  void plus(int i) {
    this.i = i + 8;
    }

    void plus(int i, int j) {
    this.i = i + j;
    }

    void reduce(int i) {
    this.i = this.i - i;
    }


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


  }

         2.强制类型转换状态下【注2】,该对象(sub)能且只能调用其子类方法和子类变量(这时被修改的就是子类变量了)。

        此种情况下,也有两种不同情况:

                ▲调用方法时强制转换,比如下面的((Sub)sub).plus(int i);
                ▲调用变量时强制转化,比如下面的System.out.println(((Sub)sub).i);
        看看下面的代码,注意6、7处:

  public class Temp {
    public static void main(String[] args) {
    Super sub = new Sub();
    ((Sub)sub).plus(3);//调用方法时强制转换----------------------------------------------6
    System.out.println(((Sub)sub).i);//调用变量时的强制转换,打印结果11------7
    }
  }

  class Super {
    protected int i=0;
    void plus(int i) {
     this.i =3;
    }
    void print(


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

  ){
    this.i=5;
    }
  }

  class Sub
    extends Super {
    protected int i = 1;
  void plus(int i) {
    this.i = i + 8;
    }

    void plus(int i, int j) {
    this.i = i + j;
    }

    void reduce(int i) {
      this.i = this.i - i;
    }
  }


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

  【注1】这种情况下,把该对象强制转换为子类对象时,可以发现,如果子类中覆盖了父类的方法,那么子类的变量被改变了。如下例中。

  【注2】对父类强制转换的结果和默认状态下是相同的,所以,这里只讨论对子类强制转换。

       下面的两个例子混合了上述情况,体验一下,注意8~17处。
  例1.

  public class Temp {
    public static void main(String[] args) {
    Super sub = new Sub();
    sub.plus(3);//默认状态下调用被覆盖了的父类方法---------------------------------8
    System.out.println(sub.i);//调用变量时强制转化,打印结果为0-----------------9
    System.out.println(((Sub)sub).i);//打印结果为11--------------------------------------10
    }
  }

  class Super {
    protected int i=0;
    void plus(int i) {
      this.i =3;
    }
    void print(){
      this.i=5;


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


    }
  }

  class Sub
      extends Super {
    protected int i = 1;
    void plus(int i) {
      this.i = i + 8;
    }

    void plus(int i, int j) {
      this.i = i + j;
  }

    void reduce(int i) {
      this.i = this.i - i;
    }
  }


  例2.

  public class Temp {


 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:


    public static void main(String[] args) {
      Super sub = new Sub();
      ((Sub)sub).plus(3);//强制转换状态下调用子类方法(不管其有无覆盖其父类方法)--11
      System.out.println(((Sub)sub).i);//调用变量时的强制转换,打印结果为11---------------12
      ((Sub)sub).plus(2,2);//-----------------------------------------------------------------------------------13
      System.out.println(((Sub)sub).i);//打印结果为4--------------------------------------------------14
      System.out.println(sub.i);//打印结果为0-----------------------------------------------------------15
      sub.print();//默认状态下调用没有被子类覆盖的父类方法----------------------------------16
      System.out.println(sub.i);//打印结果为5-----------------------------------------------------------17
    }
  }

  class Super {
    protected int i=0;
    void plus(int i) {
      this.i =3;
    }
      void print(){
    this.i=5;
    }
  }

  class Sub
      extends Super {
    protected int i = 1;
    void plus(int i) {
      this.i = i + 8;
    }

    void plus(int i, int j) {
      this.i = i + j;
      }

    void reduce(int i) {
      this.i = this.i - i;
    }
  }

  请看到的朋友评论!
 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

关注我们

最新资讯离线随时看 聊天吐槽赢奖品