[think in java] 第9章 接口

9.1抽象类和抽象方法

在应用继承时,基类的很多方法是子类的通用接口,其本身并无实际意义。创建基类对象没有意义,我们甚至需要组织用户这么做。但是,如果用户这么做了,我们将在运行时才会发现错误。为了使错误信息在编译时就可以被捕获,我们可以将基类定义为抽象类。

抽象的关键字为abstract,java提过了抽象方法机制,这种方法是不完整的;仅有声明没有方法体。如:

abstract void f();

包含抽象方法的类叫抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。如果一个从抽象类继承,并想创建为该新类创建对象,那么就必须为基类中的所有抽象方法提供方法定义。否则该类依然是抽象的,编译器会强制你加上abstract关键字。

9.2接口

接口的关键字为interface,这个关键字产生一个完全抽象的类。接口只提供方法的声明,而未提供方法体。接口被用来建立类与类之间的协议。

关键接口就像创建类,只是需要用interface替换class关键字。可以在interface前添加public关键字(仅限与该接口在与其同名的文件中,这也与类类似)。如果不添加public关键字,则只有包访问权限。此外,接口也可以包含域,但是这些域是隐式的是static 和 final的,同时接口中的域自动是public的。

接口中定义的方法必须是public的,即使没有明确显示定义,他们默认也是public的。

9.4java中的多重继承

java中的继承是单继承的,但是如果需要从多个地方继承接口,可以选择用接口来实现。implement关键字可以继承多个接口。下面是一个例子。

interface CanFight{
	void fight(); //默认为public
}

interface CanSwim{
	void swim();
}

interface CanFly{
	void fly();
}

class ActionCharacter{
	public void fight(){}
}

class Hero extends ActionCharacter
	implements CanFight, CanFly, CanSwim{
	//fight方法从ActionCharacter继承而来。
	public void swim(){}
	public void fly(){}
}

public class Adventure {
	public static void t(CanFight x) {x.fight();}
	public static void u(CanSwim x) {x.swim();}
	public static void v(CanFly x)  {x.fly();}
	public static void w(ActionCharacter x) {x.fight();}

	public static void main(String [] args){
		Hero x = new Hero();
		t(x);
		u(x);
		v(x);
		w(x);
	}
}

Hero组合具体类和接口时,具体类必须放在前面,后面跟着的才是接口。(否则编译器会报错)。

这里带来一个问题,我们应该使用接口还是抽象类?如果要创建不带任何方法定义和成员变量的基类,那么应该选择接口而不是抽象类。事实上,如果知道某食物应该成为一个基类,我们第一选择应该是使他成为一个接口。

9.5接口继承可以用来扩展接口

9.8嵌套接口

几口可以嵌套在类或其他接口中。特别要注意的是,当实现某个接口时,并不需要实现嵌套在其内部的任何接口。而且private接口不能在定义它的类之外被实现

在进行设计时,恰当的原则应该是优先选择类而不是接口。从类开始,如果接口的必需性变得非常明确,那么就进行重构。接口是一种重要的工具,但是容易被滥用。

时间: 2024-10-09 22:20:21

[think in java] 第9章 接口的相关文章

[Java学习笔记] Java核心技术 卷1 第六章 接口与内部类

第6章 接口与内部类 6.1 接口 一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象. 在接口声明中,方法自动public,可以不写修饰符.在实现接口时必须把方法声明为public. 一个接口中可以包含多个方法,还可以定义常量,自动设置public static final 声明在接口中的内部类自动成为static和public类. 接口中不能含有实例域,也不能在接口中实现方法.提供实例域和方法实现的任务应该由实现接口的那个类来完成. 可以将接口看成是没有实例域的抽

Java核心技术 第六章 接口和内部类

Java核心技术  第六章  接口与内部类 接口: 任何实现Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整数数值. 在Java SE 5.0中,Comparable接口已经改进为泛型类型. 接口中所有的方法自动的属于public.因此,在接口中声明方法时,不必提供关键字public. 接口中决不能含有实例域,也不能在接口中实现方法. 要让一个类使用排序服务,必须让它实现compareTo方法,因此必须实现Comparable

Java编程思想---第九章 接口(上)

第九章 接口 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 9.1 抽象类和抽象方法 Java提供一个叫做抽象方法的机制,这个机制是不完整的,仅有声明而没有方法体,抽象方法的语法如下: abstract void f(); 包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象的,否则编译器就会报错. 如果一个抽象类不完整,那么当我们试图产生该类的对象时,由于抽象类创建对象时不安全的,所以我们会从编译器那里得到一条出错消息,这样编译器会确保抽象类

Java核心技术第六章--接口

一.接口 1.1.接口概念 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念.类描述对象的属性和方法.接口则包含类要实现的方法. 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法. 接口无法被实例化,但是可以被实现.一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类.另外,在

Thinking in Java 第七章 3-1

Thinking in Java第七章研读3-1总结 问题引入:如何复用代码 1.新的类是由现有类的对象所组成,方法称为组合.(该方法只是复用了现有程序代码的功能,而非他的形式) 2.按照现有类的类型创建新类.方法称为继承.(该方法无需改变现有类的形式,采用现有类的形式并在其中添加新代码) 3.代理proxy 组合Demo(存在问题:对象引用的初始化) 1 package com.thxy.section.seven; 2 3 public class Compo { 4 public stat

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

java第四章编程题(初学篇)

代码: 1 /* 2 test.java 3 */ 4 package test; 5 public class test { 6 public static void main(String args[] ) 7 { 8 CPU ccp= new CPU(); 9 HardDisk hhd=new HardDisk(); 10 PC pc =new PC(); 11 ccp.setSpeed(2200); 12 hhd.setAmount(200); 13 pc.setCPU(ccp); 14

第11章 接口与内部类

1.接口的定义和实现2.内部类的使用3.接口和内部类的意义 Java程序设计中的接口,也是一种规范.这个接口定义了类应该做什么?但不关心如何做?即接口中只有方法名,没有具体实现的方法体. 用关键字"interface"来声明. interface school{ void setSchoolName(String schoolName); void setClassName(String schoolClassName);} 类实现接口时要使用implements关键字.class s