JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态

在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么

这一篇主要就要分析接口实现的多态。

实例一

Test.java源文件代码:

public class Test{
	public static void main(String[] args){
		//实现接口Singer
		Singer s1 = new Student("Amy");
		s1.sing();
		s1.sleep();
		s1.study();//编译出错

		//实现接口Singer
		Singer s2 = new Teacher("Jack");
		s2.sing();
		s2.sleep();
		s2.paint();//编译出错
		s2.eat();//编译出错
		s2.teach();//编译出错

		//实现接口Painter
		Painter p1 = (Painter)s2;
		p1.paint();
		p1.eat();
		p1.teach();//编译出错
		p1.sing();//编译出错
		p1.sleep();//编译出错
	}
}

//接口Singer
interface Singer{
	//抽象方法
	public void sing();
	public void sleep();
}

//接口Painter
interface Painter {
	//抽象方法
	public void paint();
	public void eat();
}

//学生类Student,继承一个Singer接口
class Student implements Singer{
	//私有成员变量
	private String name;

	//构造方法
	Student(String name){
		this.name = name;
	}

	public String getName(){
		return name;
	}

	//学生类独有的study()方法
	public void study(){
		System.out.println("student is studying");
	}

	//重写接口Singer中的sing()方法
	public void sing(){
		System.out.println("student is singing");
	}

	//重写接口Singer中的sleep()方法
	public void sleep(){
		System.out.println("student is sleeping");
	}

}

//教师类Teacher,继承两个接口Singer和接口Painter
class Teacher implements Singer,Painter{
	//私有成员变量
	private String name;

	//构造函数
	Teacher(String name){
		this.name = name;
	}

	public String getName(){
		return name;
	}

	//Teacher类独有的teach()方法
	public void teach(){
		System.out.println("teacher is teaching");
	}

	//重写接口Singer的sing()方法
	public void sing(){
		System.out.println("teacher is singing");
	}

	//重写接口Singer的sleep()方法
	public void sleep(){
		System.out.println("teacher is sleeping");
	}

	//重写接口Painter的paint()方法
	public void paint(){
		System.out.println("teacher is painting");
	}

	//重写接口Painter的eat()方法
	public void eat(){
		System.out.println("teacher is eating");
	}
}

编译过程报错:

从上面报错的信息可以看出:在前面的叙述面向对象多态的时候就说过,引用多态和方法多态,以及多态中的引

用类型转换,这些同样在接口中都能实现,但是有区别的是,接口不能实例化,但是可以接口的引用可以指向继承它

的子类的对象,当然调用的方法也是子类的重写接口中的抽象方法的方法。具体的对象的多态性可以参考:JavaSE

入门学习18:Java面向对象之多态

上面的编译过程报错的行数是7、13、14、15、21、22、23。这些报错的类型都是找不到符号,这是因为引用类

型不一样的原因,比如Singer接口的引用指向子类Student的对象s1,这个对象引用只能包含子类Student中重写接口

Singer的两个抽象方法,不能包含其它重写Painter接口中的抽象方法以及子类Student本身独有的方法,其它的类

似。为了避免这种编译出错,我们可以创建子类Student的对象和子类Teacher的对象。

实例二

改写Test类中的代码:

public class Test{
	public static void main(String[] args){
		//创建Student类的对象,实现接口Singer
		Student s1 = new Student("Amy");
		s1.sing();
		s1.sleep();
		s1.study();

		//创建Teacher类的对象,实现接口Singer和接口Painter
		Teacher t1 = new Teacher("Jack");
		t1.sing();
		t1.sleep();
		t1.paint();
		t1.eat();
		t1.teach();

	}
}

编译运行结果:

二接口的用法(实际参考)

(1)精简程序结构,免除重复定义

比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,

在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。

举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就

可以定义一个接口,专门描述飞行。

下图是分别定义鸟类和昆虫类,其都有飞行的方法,类图为:

下图定义了接口,其类图如下:

具体的代码实现:

//接口FlyAnimal
interface FlyAnimal{
   //抽象方法fly()
   void fly();
} 

//昆虫类
class Insect{
    int  legnum = 6;  

    void oviposition(){};
}  

//鸟类
class  Bird {
    int  legnum = 2;  

    void egg(){};
}  

//蚂蚁类
class Ant extends Insect implements  FlyAnimal{  

    public void fly(){
        System.out.println("Ant can fly");
    }  

    public void oviposition(){
	System.out.println("Ant can spawn");
    }
}  

//鸽子类
class Pigeon extends Bird implements FlyAnimal{

    public void fly(){
        System.out.println("pigeon can fly");
    }  

    public void egg(){
        System.out.println("pigeon can lay eggs ");
    }
}  

public class Test{
   public static void main(String args[]){
        Ant a=new Ant();
        a.fly();
        a.oviposition();
        System.out.println("Ant's legs are "+ a.legnum);  

	System.out.println("\n");
        Pigeon p= new Pigeon();
        p.fly();
        p.egg();
	System.out.println("Pigeon's legs are "+ p.legnum);
  }
}  

编译运行结果:

(2)拓展程序功能,应对需求变化

假设一个学校接待方面的程序,招待不同身份的人的食宿问题,其对应规则如下:

理论上,当然可以对每个不同身份的人各定义一个对应的类,并实现各自的方法,但是观察这写类,可以归纳出

其有一个共同的模板,即“人”的“食、宿”问题。这时候,就可以发挥接口的功能了。

具体实现代码如下:

interface Person{
    void eat();
    void sleep();
}  

class Student implements Person{
    public void eat(){
       System.out.println("学生去食堂吃饭!");
    }
    public void sleep(){
       System.out.println("学生回寝室睡觉!");
    }
}  

class Teacher implements Person{
    public void eat(){
       System.out.println("教师去教工餐厅吃饭!");
    }
    public void sleep(){
       System.out.println("教师回学校公寓睡觉!");
    }
}
 class Parents implements Person{
    public void eat(){
       System.out.println("家长去招待所饭馆吃饭!");
    }
    public void sleep(){
       System.out.println("家长回招待所睡觉!");
    }
}  

public class Test{
    public static void main(String[] args){
	   Person p1 = new Student();
	   p.eat();
	   p.sleep();  

	   Person p2 = new Teacher();
	   p.eat();
	   p.sleep(); 

	   Person p3 = new Parents();
	   p.eat();
	   p.sleep();
    }
}  

运行结果:

现在需要添加一些功能,即现在需要添加“外宾、上级领导”两类角色,并且以后工具需要还要添加相应的身份角

色的人进来,此时,只需要根据需要添加“外宾”类、“领导”类,而主类仍然可以拿来就用,无需进行更多的修改。此

时就可以显示出接口的作用了。

我们列表现在更新为:

在上面的程序中添加如下两个类即可:

class Foreign implements Person{
    public void eat(){
       System.out.println("外宾去酒店吃饭!");
    }
    public void sleep(){
       System.out.println("外宾回酒店睡觉!");
    }
}  

class Leader implements Person{
    public void eat(){
       System.out.println("领导去宾馆吃饭!");
    }
    public void sleep(){
       System.out.println("领导回宾馆睡觉!");
    }
}  

我们在主方法中添加的代码为:

	    Person p4 = new Foreign();
	    p4.eat();
	    p4.sleep(); 

	    Person p5 = new Leader();
	    p5.eat();
	    p5.sleep(); 

运行结果:

总结

时间: 2024-08-23 12:09:19

JavaSE入门学习21:Java面向对象之接口(interface)(二)的相关文章

JavaSE入门学习20:Java面向对象之接口(interface)

一Java接口 接口(英文:interface)是抽象方法和常量值的集合,在Java编程语言中是一个抽象类型,接口通常以interface来声 明.类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些 类里方法的实现细节,它只规定这些类里必须提供某些方法.一个类或接口通过继承接口的方式,从而来继承接口的 抽象方法. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念.类描述对象的属性和方法.接口则包含 类要实现的方法.除非实现接口的类是抽

JavaSE入门学习24:Java面向对象补充

一Java中的Object类 Object类是所有Java类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认 继承Object类. public class Person{ // } //等价于 public class Person extends Object{ // } Object类中的方法,适合所有子类. 1)toString()方法 在Object类中定义有public String toString()方法,其返回值是String类型,描述当前对

JavaSE入门学习7:Java基础语法之语句(下)

继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for. (5)Java循环语句之while 语法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 运行

JavaSE入门学习6:Java基础语法之运算符和语句(上)

继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age的值设置为20.这时候就 须要一个"=",告诉程序须要进行赋值操作. Java 语言中经常使用的运算符可分为例如以下几种:算术运算符,赋值运算符,比較运算符,逻辑运算符,条件运符. (1)算术运算符 算术运算符主要用于进行主要的算术运算.如加法.减法.乘法.除法等. Java 中经常使用的

JavaSE入门学习4:搭建Java开发环境(二)

在上一篇的博文JavaSE入门学习3:搭建Java开发环境(一)中说到我们配置了Path变量的一种方式,再来说说第 二种配置方式,这种配置方式是必须掌握的. path环境变量配置方式2 我们为什么要将第二种配置形式呢?那第一种的配置方式有什么缺点吗?假设我的计算机上安装了两个JDK,一 个是1.7,一个1.8,我刚才配置的是1.8的,那么我需要配置1.7,需要重新配置Path环境变量,有可能在修改Path环 境变量的同时误删其它的东西,所以不建议使用第一种. path环境变量的参照形配置方式的步

Java面向对象程序设计--接口和内部类

1.接口的定义: In the Java programming language, an interface is not a class but a set of requirements for classes that want to conform the interface. 说明: 1) Interface 不是class,虽然interface具有class的一些特点,例如能够继承,能够定义相同类型的变量,而且和C++的abstract class非常像,但Java 的inter

JavaSE入门学习45:文件传输基础之I/O流(四)

五字符流的使用 (1)编码问题 这个问题我们早就说过了,不再过多赘述. 参考:JavaSE入门学习42:文件传输基础之I/O流(一) (2)认识文本和文本文件 Java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码):而文件是byte byte byte ...的数据 :文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk等)序列化为byte的存储结果. (3)字符流(Reader Writer)---->操作的是文本文本文件 字符的

JavaSE入门学习15:Java面向对象之继承

今天我们来看Java三大面向对象特性中的继承. 一Java继承 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个 对象获取属性的过程. 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类C是从类A继承而来的.在Java中,类的继 承是单一继承,也就是说,一个子类只能拥有一个父类. 继承中最常使用的两个关键字是extends和implements.这两个关键字的使用决定了一个对象和另一个对象是否是 IS-A(是一个)关系.通过使

JavaSE入门学习17:Java面向对象之package(包)

一Java包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用: A把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. B如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包中的类的名字是 可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别.因此,包可以避免名字冲突. C包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类. Java使用包(package)这种机制是为了防止命名冲突