黑马程序员技术交流社区
标题:
Java继承中属性的覆盖的疑问
[打印本页]
作者:
hg3093483
时间:
2013-4-6 13:08
标题:
Java继承中属性的覆盖的疑问
本帖最后由 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
作者:
沈浩
时间:
2013-4-6 13:31
在多态中成员变量的特点是,无论编译和运行都参考左边(引用型变量所属的类)若要访问子类特有属性要将类型降为子类类型。所以打印结果会是1,2.
作者:
沈浩
时间:
2013-4-6 13:35
属性不能表现多态 因为属性跟实例引用名字是一体的.
作者:
谢达
时间:
2013-4-6 13:40
当子类想对继承自父类的方法有不同实现时就用到了覆盖。
注意事项:
--试图用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错
--试图用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器会报错
--静态方法和最终方法(带关键字final的方法)不能被覆盖
--实例方法能够被覆盖
--抽象方法必须在具体类中被覆盖
1、对于成员变量,无论是编译还是运行都参考左边,
Rootb stb = new Stemb(47);
System.out.println (stb.x); //这里是Rootb类型所以输出是1
System.out.println (((Stemb)stb).x); //这里强转所以为2
2、对于成员方法,编译看左边,运行看右边
3、对于静态方法无论编译还是运行都参考左边
希望对你有所帮助
作者:
Friendy89
时间:
2013-4-6 13:43
继承 extends 注意 事项:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,
* 当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,
* 父类的非静态代码块执行完毕,接着执行父类的构造方法;
* 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
* 子类的非静态代码块执行完毕再去执行子类的构造方法。
* 总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过
在多态中成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:无论编译和运行都参考左边。
作者:
刘策
时间:
2013-4-6 13:45
非静态函数:父类引用指向子类对象时:在编译的时候看父类,在运行的时候如果子类有就走子类的,如果没有就走父类的。
静态函数::i当父类和子类有相同的静态函数时。无论是在编译和运行都看左边;
静态成员变量和非静态成员变量是一样的。:在编译和运行时都看左边。
作者:
黄玉昆
时间:
2013-4-6 19:37
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2