黑马程序员技术交流社区
标题:
继承的一个小问题
[打印本页]
作者:
魏亮
时间:
2012-9-6 20:37
标题:
继承的一个小问题
各位是怎么理解非静态成员方法不能覆盖同名静态方法的??
最好从内存的角度解释一下。
作者:
小黑马
时间:
2012-9-6 21:26
首先说明继承的特点:
1. 继承覆盖的特点:
子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败
父类被覆盖的方法不能是private修饰,如果修饰则不为覆盖,父类和子类拥有自己的方法.
静态只能覆盖静态.
方法名称,参数列表,参数类型必须相同,返回值类型相同或者有关系.(子类返回值是父类返回值的子类)
2. 静态方法只与定义时所在的类相关,在编译期就已经绑定到某个类。可以继承,但不能在子类中被同名方法覆盖.
网上有一句话:类的引用指向子类时,当用到方法时,调用的是子类的对象.当用到属性时,用到的是父类对象.这个不适合静态方法.
代码测试如下:
public class Test1 {
final int var_final = 100;
void doit(){
System.out.println(var_final);
}
static int myFunction(){
return 500;
}
}
public class Test2 extends Test1{
final int var_final = 200;
public Test2(){
super();
}
void doit(){
System.out.println(var_final);
}
static int myFunction(){
return 1000;
}
public static void main(String[] str){
Test1 test = new Test2();
System.out.println("var_final = "+test.var_final);
System.out.println("myFunction = "+test.myFunction());
}
}
复制代码
因为不管是静态方法,还是静态成员,他只属于这个类。类对像(Class)没有像实例一样的包容形式。只能各自调用各自的静态成员与方法。
作者:
乔九
时间:
2012-9-6 21:51
覆盖(override)是在继承+多态的前提下的概念。Java中的静态方法不多态,所以不涉及覆盖,无论静态方法是在基类还是派生类上。
作者:
黑马--张帅
时间:
2012-9-6 21:59
首先必须明确一点的是覆盖只发生在一般函数上。其次是静态函数随着类的加载而加载,在内存中静态成员加载到方法区的静态区。非静态方法在没有对象创建的时候都是没有加载的,当对象创建后,并通过对象调用此方法,这时该方法才进栈。调用完后该方法就出栈了,而静态方法还在静态方法区可以通过类名直接调用,它和该类已经绑定在一起了。无论在函数的生命周期和空间上都无法形成覆盖。
覆盖的条件:
1,覆盖技术只发生在一般函数上。
2,子类覆盖父类时,覆盖方法的权限必须大于或者等于被覆盖的方法的权限。
3,静态只能覆盖静态。
4,父类成员函数没有抛出异常,子类覆盖该函数时也不能抛出异常。如果父类成员函数抛出异常子类覆盖该成员函数时只能抛出和父类相同的异常或者抛出子类异常的子集。
作者:
魏亮
时间:
2012-9-7 13:15
明白了,谢谢各位的回答
作者:
魏亮
时间:
2012-9-7 13:17
马小龙 发表于 2012-9-6 21:26
首先说明继承的特点:
1. 继承覆盖的特点:
子类覆盖父类,必须保证子类权限大于等于父类权 ...
你说的很清楚,多谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2