在实现类里写一个与接口类里相同的常量的问题

在实现类里写一个与接口类里相同的常量的问题

因为我手抖的缘故,本来还有点小疑问,误点了"采纳此答案",结果就得重新开个问答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

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿莹 2019-05-25 19:29:39

1、同学问:

那么,1、多接口重名属性,用各自的接口名.属性名调用,那为什么在父类的属性鱼多接口的属性重名时,子类必须得重写一个属性呢?因为到最后,还是谁的引用调的谁的属性,实现类自己的属性也调不到。

答:没有必须重写一个属性呀:

比如:

http://img1.sycdn.imooc.com//climg/5ce926590001e5d404840183.jpg

http://img1.sycdn.imooc.com//climg/5ce926690001372f05310156.jpg

父类也有

http://img1.sycdn.imooc.com//climg/5ce9267e0001e2da05640261.jpg

但是子类不一定要有啊:

http://img1.sycdn.imooc.com//climg/5ce9269b0001208206590223.jpg

2、同学的问题:

我有点没懂老师的意思,我问的是:父类写有一个成员变量,子类写了同名的成员变量后,不报错,虽不能称其为重写,但是这样操作后,子类对象实例化后,子类的引用.成员变量名,调用的是子类自己的成员变量吗?还是说调的还是父类的那个成员变量?

答:

调用的是子类自己的成员变量。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


好帮手慕阿莹 2019-05-24 20:53:06

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 去调用方法吧

http://img1.sycdn.imooc.com//climg/5ce7ea1500012c2c06920357.jpg

http://img1.sycdn.imooc.com//climg/5ce7ea33000167ba10210536.jpg

接口设计的目的就是为了数据的规范化和一种方法多种实现。

祝学习愉快。

  • 提问者 鱼儿0001 #1
    谢谢老师。成员属性这一块就是:谁的引用调的谁的属性。那么,1、多接口重名属性,用各自的接口名.属性名调用,那为什么在父类的属性鱼多接口的属性重名时,子类必须得重写一个属性呢?因为到最后,还是谁的引用调的谁的属性,实现类自己的属性也调不到。2、我有点没懂老师的意思,我问的是:父类写有一个成员变量,子类写了同名的成员变量后,不报错,虽不能称其为重写,但是这样操作后,子类对象实例化后,子类的引用.成员变量名,调用的是子类自己的成员变量吗?还是说调的还是父类的那个成员变量?
    2019-05-25 14:53:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师