A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hg3093483 中级黑马   /  2013-4-6 13:08  /  2221 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hg3093483 于 2013-4-6 19:22 编辑

还有能否讲一讲 继承中覆盖的特点,何时应用,注意事项?下面的代码为什么结果会是1,2呢??小弟先行谢过。
class Rootb {
  int x = 1;
  public Rootb(int i) { }
}
class Stemb extends Rootb {
  int x = 2;
  public Stemb(int i) {
    super(i);
  }
}
public class Test {
  public static void main(String args[]) {
    Rootb stb = new Stemb(47);
    System.out.println (stb.x);
    System.out.println (((Stemb)stb).x);
  }
}
显示结果:
1
2

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

6 个回复

倒序浏览
在多态中成员变量的特点是,无论编译和运行都参考左边(引用型变量所属的类)若要访问子类特有属性要将类型降为子类类型。所以打印结果会是1,2.
回复 使用道具 举报
属性不能表现多态  因为属性跟实例引用名字是一体的.
回复 使用道具 举报
当子类想对继承自父类的方法有不同实现时就用到了覆盖。

注意事项:
--试图用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错
--试图用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器会报错
--静态方法和最终方法(带关键字final的方法)不能被覆盖
--实例方法能够被覆盖
--抽象方法必须在具体类中被覆盖

1、对于成员变量,无论是编译还是运行都参考左边,
    Rootb stb = new Stemb(47);
    System.out.println (stb.x);   //这里是Rootb类型所以输出是1
    System.out.println (((Stemb)stb).x); //这里强转所以为2
2、对于成员方法,编译看左边,运行看右边
3、对于静态方法无论编译还是运行都参考左边

希望对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
继承 extends 注意 事项:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,
* 当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,
* 父类的非静态代码块执行完毕,接着执行父类的构造方法;
* 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
* 子类的非静态代码块执行完毕再去执行子类的构造方法。
* 总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过

在多态中成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:无论编译和运行都参考左边。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
非静态函数:父类引用指向子类对象时:在编译的时候看父类,在运行的时候如果子类有就走子类的,如果没有就走父类的。
静态函数::i当父类和子类有相同的静态函数时。无论是在编译和运行都看左边;
静态成员变量和非静态成员变量是一样的。:在编译和运行时都看左边。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马