开发者社区> 问答> 正文

final属性值问题?报错

interface A
{
   public static final int i =10;
   void f();
}
class B implements A 

int i = 111; 
   
   public void f()
   {
    System.out.printf("shlask");
    }
}
public class C
{
   public static void main(String[] args)
   {
      B bb = new B();
      System.out.printf("%d\n",bb.i);
   }

}

final是最种类,为什么运行后不报错,结果是111。

展开
收起
爱吃鱼的程序员 2020-06-14 21:25:23 425 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这里final没有修饰类哦,用来修饰了一个变量,变为常量。如果变量同名会出现覆盖的情况,所以输出11,而不是1他那篇博客也讲了,变量覆盖算是"半吊子"覆盖。实际上,那已经不是多态行为了回复<aclass='referer'target='_blank'>@kalo:http://blog.csdn.net/kuangxiang_panpan/article/details/7443046具体的,我也去了解一下相关文档,看一下如何去理解。回复<aclass='referer'target='_blank'>@kalo:如果父类、子类的属性名一致,子类会覆盖父类的同名属性(new子类名())回复<aclass='referer'target='_blank'>@kalo:啊,这不是覆盖吗??如果在类中的field和方法的变量名相同时,如果需要用到field,需要在前面加this.field,要不然就是使用方法里的变量。我国庆去看一个你说那本说变量名相同也不应该出现覆盖的情况吧?因为类的域没有多态行为,参考java编程思想4多态应该是111,而不是10你把interfaceA换成classA,然后去掉A中i变量的staticfinal修饰,重新运行一下,就会发现修改A为类之后,输出的仍然是111,为啥?因为类实例字段根本就不会出现像实例方法那样的多态行为!更何况A是接口呢另外,静态方法也不具备多态行为。因为静态方法是属于类的,不与单个对象关联,不存在动态绑定行为,在编译时即确定方法行为。接口中变量隐性的全部是staticfinal的,是属于整个接口,因此,也不应该具备多态行为。

    2020-06-14 21:25:39
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载