VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • 接口和抽象类是否有构造方法

先上结论:接口没有,抽象类可以有。

甚至于有其他的区别:

  1. 接口不能有方法体,抽象类可以有(仅限java8以前)
  2. 接口不能有静态方法,抽象类可以有(仅限java8以前)
  3. 接口中的变量必须由public static final修饰,抽象类不要求

首先针对构造方法而言很好理解:

抽象类虽然内部的方法可以不用具体描述方法体,但是归根结底,抽象类其实是一个标准的类,它里面的内容完全可以按照一个标准的类进行描述,并且与一般类一样使用extends进行继承,在创建抽象类时,IDE会默认生成无参构造,你也可以自己定义,这些都是可以的;

接口则不一样,根据博主lllllzllll所言对接口的描述:

接口只是定义功能和行为规范,如果一个类实现了一个接口,那么这个类必须遵守这个接口的方法约定,但没有is-a的关系

接口作为一种声明,不需要进行初始化,所以根本不需要构造器对其进行构造。

其次针对方法体和静态方法:

这是看见上面所说的博主文章下面评论区说的,java8之后:

java8让接口与抽象类之间距离更近一步,java8以后,接口中可以有默认方法,静态方法,不再是纯抽象的东西了

所以这个要看仔细,但其中有些注意点:

  1. 静态方法

    从java8开始接口里可以有静态方式,用static修饰,但是接口里的静态方法的修饰符只能是public,且默认是public

譬如:


 
interface Test{
 
static void test1(){//不写public也可,默认为public
 
System.out.println("静态方法");
 
}
 
}
 
 
 
class TestClass{
 
public static void main(String[] args){
 
Test.test1();//与调用普通类的静态方法一致
 
}
 
}
  1. 非静态方法

    java8里,除了可以在接口里写静态方法,还可以写非静态方法,但是必须用default修饰,且只能是public,默认也是public,这方法称为默认方法


 
interface Test{
 
default void test1(){//不写public也可,默认为public
 
System.out.println("默认方法");
 
}//该方法需要实例化后调用,可使用匿名内部类进行实例化
 
}

最后,接口内的属性为啥都是public static final

查看了大佬徐明曉的文章:为什么接口中的成员变量非得是public static final的呢?

各自提到这三个修饰符的意义:

public: 使接口的实现类可以使用这个常量 static:表示它属于类的,随的类的加载而存在的,如果是非static的话,就表示属于对象的,只有建立对象时才有它,而接口是不能建立对象的,所以接口的常量必须定义为static。 final:是保证接口定义的常量不能被实现类去修改,如果没有final的话,由子类随意去修改的话,接口建立这个常量就没有意义了。

出处:https://www.cnblogs.com/cola-pink/p/15808224.html


相关教程