首先,我将介绍一下抽象类,他是介于普通类和接口之间。尽管我们再构建默写未实现方法的类时,我们的第一个想法总是创建接口,但时抽象类仍是一种必须的工具。
抽象类和抽象方法
在我们生活中,也有很多抽象得到概念。一个通用接口建立一种基本的形式,来表示所有导出类的共同部分,不同的子类可以用不同的方式来表达这个接口。然而这个通用类又被称为抽象基类,或者交抽象类。
比如:
- 人类(有男人,有女人)
- 鸟类(有咕咕咕,有八哥)
再组织这种关系的时候我们可以使用extennds的方式继承:
- 图中food是一个抽象基类,下面的bread,rice,noodles都是food的子类,
- food类都有eat()的方法。但这个动作是抽象的(没有具体的方法),每种不同的食物都有不同的吃法,需要每个类对food类的eat()进行覆盖。
public class Test2 {
public static void main(String[]args){
Rice r= new Rice();
Bread b = new Bread();
Noodles n = new Noodles();
r.eat();
r.feeling();
b.eat();
b.feeling();
n.eat();
n.feeling();
}
}
abstract class food{
public abstract void eat();
public void feeling(){
System.out.println("吃饱了");
}
}
class Rice extends food{
public void eat(){
System.out.println("米饭烧熟了吃");
}
public void feeling(){
System.out.println("吃米饭没有配菜");
}
}
class Bread extends food {
public void eat() {
System.out.println("面包直接吃");
}
public void feeling() {
System.out.println("面包没有营养");
}
}
class Noodles extends food {
public void eat() {
System.out.println("面条烫嘴");
}
public void feeling() {
System.out.println("没有大排面好吃");
}
}
从上述代码中可以看到,Java提供一种叫抽象方法的机制,这种方法是不完整的;仅有方法声明而没有方法主体。如下:
abstarct void f();
包含抽象方法的类,叫做抽象类。如果一个类包含一个或者多个抽象方法,这个类必须添加abstract。当然抽象类中并不需要所有方法都是抽象的,仅需要将某些方法声明为抽象就OK。
接口
interface这个关键字是是产生一个更加抽象的类。允许创建者确定方法名,参数列表,返回类型,但是没有任何具体实现。
实现
- 接口可以包含域,但这些域都是隐式的static和final的,
- 接口中默认的方法声明是public,当要实现一个接口时,接口被定义的方法必须定义是public的。
- 为了实现某个特定的接口,需要医用implements关键字来实现,一旦实现类某个接口,实现后就会变成一个普通类,然后可以通过继承或者组合的方法来调用他。
Java存在的“多重继承”
interface存在着“多重继承”,此处的“多重继承”其实是多重实现的意思,可以将所有接口名都制约implements的后面用逗号隔开
interface CanFight {
void fight();
}
interface CanSwim {
void swim();
}
interface CanFly {
void fly();
}
class ActionCharacter {
public void fight() {}
}
class Hero extends ActionCharacter
implements CanFight, CanSwim, CanFly {
public void swim() {}
public void fly() {}
}
public class Adventure {
static void t(CanFight x) { x.fight(); }
static void u(CanSwim x) { x.swim(); }
static void v(CanFly x) { x.fly(); }
static void w(ActionCharacter x) { x.fight(); }
public static void main(String[] args) {
Hero i = new Hero();
t(i); // Treat it as a CanFight
u(i); // Treat it as a CanSwim
v(i); // Treat it as a CanFly
w(i); // Treat it as an ActionCharacter
}
}
扩展
我们不仅可以在接口中添加新的方法声明,还可以通过继承在新的接口中组合数个接口。
Java接口可以从另外一个Java接口中继承,就像类可以从其他类中继承一样。你可以使用extends
来指定继承。下面是一个简单的接口继承示例:
public interface MySuperInterface {
public void saiHello();
}
public interface MySubInterface extends MySuperInterface {
public void sayGoodbye();
}
MySubInterface接口继承于MySuperInterface接口。这意味着,MySubInterface将继承MySuperInterface所有的属性和方法,实现接口的类必须实现MySubInterface和MySuperInterface接口中所有的方法。
在子接口中可以定义与父接口中具有相同签名(名称+参数)的方法。
与类的继承不同是,子接口可以继承多个父接口。列出所有你想要继承的接口名称,以逗号分隔。要实现继承多个父接口的子接口,实现接口的类必须实现子接口与所有父接口中的所有方法。
下面是一个继承多个父接口的示例:
public interface MySubInterface extends
SuperInterface1, SuperInterface2 {
public void sayHello();
public void sayGoodBye();
}
回调
//这一节之后的时间里在进行总结。