接口和抽象类的区别是什么? Java接口中声明的变量默认都是final的。(为什么)

接口和抽象类的区别是什么?

参考答案

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
 

抽象类可以在不提供接口方法实现的情况下实现接口。?
Java接口中声明的变量默认都是final的。(为什么)抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别
 
 
 
问题1.Java接口中声明的变量默认都是final的。(为什么)
interface中的变量是当作常量来设计的,它不但是final,而且还是public static的,也即interface中的变量一定是public static final的,换言之,这个变量实际上已经是个“常量”。

解答:java接口中成员变量必须是final类型的原因如下:

1. 接口中的数据对所有实现类只有一份,所以是static
2.要使实现类为了向上转型成功,所以必须是final的.这个举例子很好理解.比如接口A,A有变量value.实现类A1,A2,可以向上转型.假如代码中有一句:
 

  A a=null;
     a=....(2)实际实现类
   System.out.println(a.value);

   利用向上转型,可以得到接口a的值,在第2步中,我不关你是实现类A1,还是new A2(),通过转型,我们可以得到正确的值.要是类中可以更改,我们得不到一个统一的值,接口也没有了意义.

 

假设接口的成员变量x不是final的,且默认有值。

如果你在某接口的实现类A中把x改为其他值,(能够改掉接口中的 吗,假如是继承的父类呢),那么另一个实现类B中对x有依赖的方法全部都出错了,这样接口还怎么能起到“模板”的作用呢

 

 

接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别? (不懂,抽象类是怎么样的,抽象类可以包含非final的变量。)又接口是一种更高层面的抽象,是一种规范、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规范化的作用。所以接口中的属性必然是final的。

 

posted on 2016-07-20 22:29  雪的心  阅读(11413)  评论(0编辑  收藏  举报

导航