当从引用变量调用实例方法时,该变量的实际类型在运行时决定使用该方法的哪个实现。当访问数据域或静态方
当从引用变量调用实例方法时,该变量的实际类型在运行时决定使用该方法的哪个实现。当访问数据域或静态方法时,引用变量的声明类型在编译时决定使用哪个方法。这两句话是什么意思?能...
当从引用变量调用实例方法时,该变量的实际类型在运行时决定使用该方法的哪个实现。当访问数据域或静态方法时,引用变量的声明类型在编译时决定使用哪个方法。这两句话是什么意思?能不能给个通俗的解释。
展开
1个回答
推荐于2016-05-02
展开全部
第一句话,其实就是多态的实现,java支持继承,假设B继承A,A中有一个print方法,B重写了A的print方法,在实例化时A a= new A();A b = new B(); 声明类型虽然都是A,但是执行的方法却是由实际类型决定的,变量a执行的是A的print方法,变量b执行的是B重写过的print方法。
第二句话,你说的数据域应该是静态代码块,类的静态方法,静态变量是在类装载的时候装载的。这些是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。还是刚才的例子,A有静态方法static printStatic();B也有静态方法static printStatic();,但是这不是重写,虽然编译器也不会报错。如果你试图重写静态方法,Java不会阻止你这么做,但你却得不到预期的结果。所以A a= new A();A b = new B();a.printStatic()与b.printStatic()方法调用的都是A中的静态方法,也就是由声明类型决定,但是一般不推荐这么写,一般调用静态方法不需要创建实例,如:直接A.printStatic()即可,如果你要调用B中的可以B.printStatic()
第二句话,你说的数据域应该是静态代码块,类的静态方法,静态变量是在类装载的时候装载的。这些是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。还是刚才的例子,A有静态方法static printStatic();B也有静态方法static printStatic();,但是这不是重写,虽然编译器也不会报错。如果你试图重写静态方法,Java不会阻止你这么做,但你却得不到预期的结果。所以A a= new A();A b = new B();a.printStatic()与b.printStatic()方法调用的都是A中的静态方法,也就是由声明类型决定,但是一般不推荐这么写,一般调用静态方法不需要创建实例,如:直接A.printStatic()即可,如果你要调用B中的可以B.printStatic()
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询