关于接口(实现java的多态机制)

接口特性

1.接口可以多重实现。

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

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

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

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

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

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

关于接口(实现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的方法。

而且s1虽然是Singer类型,但是它的实例是Student,所以sing()虽然在Singer和Student中都有sing()的声明。但由于多态机制是按照实例进行的,所以它调用的是Student里头的sing()方法,也就是接口也具有多态性。

 

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

 

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

 

posted @ 2016-11-23 15:09  天涯海角路  阅读(195)  评论(0)    收藏  举报