在实现类里写一个与接口类里相同的常量的问题
因为我手抖的缘故,本来还有点小疑问,误点了"采纳此答案",结果就得重新开个问答8 8(我是傻蛋!).
我的问题是:
在接口里写有public static final TEMP=20;
在实现类里写有public static final TEMP=30;
老师,为什么接口类的引用指向实现类实例对象后,引用调用的TEMP会是接口的20,而不是30?
还有,接口的引用指向实现类实力对象后,引用调用的就是实现类里重写的方法,对吗?
====================================================================
吃鱼的猫老师回复是:
static类型的变量是类变量,不会被重写。父类中的TEMP和子类中的TEMP是两个不同的变量,所以,当接口引用调用TEMP时,调用的是父类中的TEMP,值为20。
当接口引用指向实现类时,引用调用的是实现类里重写的方法,在这里,同学的理解是正确的。
====================================================================
我的问题是:1、老师说:父类中的TEMP和子类中的TEMP是两个不同的变量,问题是这里的TEMP是常量,根本不是变量啊。而且,我说的明明是接口和实现类重名的TEMP,吃猫的鱼老师扯到父类和子类,这是啥意思?
2、我之所以疑惑。是因为接口的抽象方法,在实现类里重写后,利用接口的引用.方法名调用的是接口重写的方法。而在接口和实现类里重名的TEMP,调用的确是接口的TEMP,为什么?
3、老师,我记得父子类里,父类写有一个成员变量,子类写了同名的成员变量后,不报错,虽不能称其为重写,但是这样操作后,子类对象实例化后,子类的引用.成员变量名,调用的是子类自己的成员变量吧?
正在回答 回答被采纳积分+1
1、同学问:
那么,1、多接口重名属性,用各自的接口名.属性名调用,那为什么在父类的属性鱼多接口的属性重名时,子类必须得重写一个属性呢?因为到最后,还是谁的引用调的谁的属性,实现类自己的属性也调不到。
答:没有必须重写一个属性呀:
比如:
父类也有
但是子类不一定要有啊:
2、同学的问题:
我有点没懂老师的意思,我问的是:父类写有一个成员变量,子类写了同名的成员变量后,不报错,虽不能称其为重写,但是这样操作后,子类对象实例化后,子类的引用.成员变量名,调用的是子类自己的成员变量吗?还是说调的还是父类的那个成员变量?
答:
调用的是子类自己的成员变量。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
1、首先说一下:同学的
在接口里写有public static final TEMP=20;
在实现类里写有public static final TEMP=30;
并不正确:应该是:
在接口里写有public static final int TEMP=20;
在实现类里写有public static final int TEMP=30;
1、其实TEMP可以称之为变量,但是经过final修饰后,它等同于常量一样。同学这里不用纠结它叫什么呦。关于父类还是接口,这里是老师口误了,非常抱歉。
2、同学提的问题很有深度,但是这个是java的语法规则,同学这里记住就好,或者说,老师暂时也不能理解Java的设计者这么设计的意义
package com.imooc.sum; public class B extends C implements A { public static final int TEMP=30; public static final int TEMP1=30; public void test() { System.out.println(22222); } } package com.imooc.sum; public interface A { public static final int TEMP=20; default void test() { System.out.println(44444); } } package com.imooc.sum; public class C { public static final int TEMP1=40; public void test() { System.out.println(11111); } } package com.imooc.sum; public class Test { public static void main(String[] args) { // A 是接口 A a = new B(); //这里打印出来的就是接口中的常量 System.out.println( a.TEMP); //而调用方法,会调用实现类里的方法 a.test(); //B实现了C, C c = new B(); //这里打印出来的就是父类中的常量 System.out.println(c.TEMP1); //而调用方法,会调用子类里的方法 c.test(); } }
3、经过以上代码测试,同学说的这个第三问,调用的是父类的变量(常量)。
目前是,接口或者父类调用属性时,调用的是自己的,调用方法时,调用的子类或者实现类的。目前同学先记住这个规则吧。
同学记忆中,应该是在子类方法中调用了子类的属性,然后用c 去调用方法吧
接口设计的目的就是为了数据的规范化和一种方法多种实现。
祝学习愉快。
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星