接口特性

1.接口可以多重实现。

2.接口中声明的属性默认为public static final的,也只能是public static final的,

3.接口中只能定义抽象方法,而且这些方法默认为public的,也只能是public的。

4.接口可以继承其它的接口,并添加新的属性的抽象方法。

5.多个无关的类可以实现同一个接口。

6.一个类可以实现多个无关的接口。

7.与继承关系类似,接口与实现类之间存在多态性。

java 接口动态实现不同实现类 java接口多实现_抽象类


关键字interface(接口),其实相当于abstract class(抽象类),而实现(implements)接口相当于继承(extends)父类。本质上是一样的。

interface本质上是一个抽象类。它的属性只能是public static final(即使你不写它的默认类型也是如此),也就是它的成员属于具有final关键字的静态变量,换句话说,它的成员不属于对象的,而是存放在date seg区域的不可访问的常量。(这是为了防止多继承造成的变量重名的情况。) 而它的方法也只能是public并且由于是抽象类的方法,所以该方法本身也是抽象的(abstract)

接着是一段代码:

interface Singer {

 public void
sing();   ―――→
定义一个Singer接口,里面有sing()和sleep()方法的声明

 public void sleep();

 } 
interface Painter {

 public void paint(); 
―――→定义一个Painter接口,里面有paint()和eat()的方法的声明

 public void eat();

 }


 

class Student implements Singer
{

 private String name;

                                         ―――→Student实现了Singer接口,增加了一个


 Student(String
name){                   String类的name,以及重写了Singer接口的方法


  this.name = name;

  }

 public void study(){

  System.out.println("student is
studying");

  }

 public void sing(){

  System.out.println("student is
singing");

  } 

 public void sleep(){

  System.out.println("student is
sleeping");

  }

 } 
class Teacher implements Singer , Painter {

 private String name;

 

 Teacher(String
name){             ―――→Teacher类实现了Singer和Painter接口,也就


  this.name =
name;                拥有Singer和Painter里头的方法。并且重写了接口的方法。


  }

 public void teach(){

  System.out.println("teacher is
teaching");

  }

 public void sing(){

  System.out.println("teacher is
singing");

  } 

 public void sleep(){

  System.out.println("teacher is
sleeping");

  }

 public void paint(){

  System.out.println("teacher is
painting");

  };

 public void eat(){

  System.out.println("teacher is
eating");

  }; 

 }  public class Interface {

 public static void main(String
args[]){ 

  Singer s1 = new
Student("pipi");

  s1.sing();

  s1.sleep();

  Singer s2 = new
Teacher("gigi");

  s2.sing();

  s2.sleep();

  Painter p = (Painter)s2;

  p.paint();

  p.eat();

  }

 }

  着重从main方法分析起, Singer s1 = new Student("pipi"); 一个Singer类型的引用变量s1 “指向”一个Student的对象,我的指向加引号意思是由于s1是Singer类型的引用,所以实际上它只看得到Singer接口里头的sing()和sleep()方法,如果加上一句s1.study();那么。程序就会报错,因为study()是Student的方法。

也就是接口也具有多态性。

 

在看看代码的结构,Student和Teacher都实现了Singer接口,这就是多个无关的类可以实现同一个接口。而Teacher同时实现了Singer和Painter接口,也就是一个类可以实现多个无关的接口

 

多态有三个条件:要有继承,要有重写,父类引用指向子类对象