当一个抽象类中的方法全是抽象的时候,这时可以将该抽象类用
另一种形式定义和表示,就是接口,关键字 interface
这时定义接口使用的关键字就不是class,而是interface
接口中常见的成员都有固定的修饰符:
1.全局常量:
public static final
2.抽象方法:
public abstract
由此得出结论,接口中的成员都是公共的权限。
实现关键字:implements
接口是不可以被实例化的。
只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化。
否则,这个子类就是一个抽象类。
在Java中不直接支持多继承,因为会出现调用的不确定性(如两个父类中的函数完全相同时)
所以Java将多继承机制改良,在Java中变成多实现。
即一个类可以实现多个接口。
比如:
子类实现时会将两个抽象函数都覆盖来定义方法体。就不会出现调用的不确定性了。
类与类之间是继承关系,类与接口之间是实现关系。
接口与接口之间是继承关系,而且可以多继承。
所以,java中是可以多继承的,只不过是接口之间才能多继承。
比如:
相同点:
都是不断向上抽取而来的。
不同点:
1.抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2.抽象类中可以定义抽象方法和非抽象方法,子类继承后,非抽象方法可直接调用。
接口中只能定义抽象方法,必须由子类去实现。
3.抽象类的继承,是is a关系。是在定义该体系的基本共性内容。
接口的实现,是Like a关系。是在定义该体系的额外功能。
另一种形式定义和表示,就是接口,关键字 interface
这时定义接口使用的关键字就不是class,而是interface
接口中常见的成员都有固定的修饰符:
1.全局常量:
public static final
2.抽象方法:
public abstract
由此得出结论,接口中的成员都是公共的权限。
比如:
interface YuEr
{
public static final int NUM=9;
public static final double NUMBER=9.5;
//以上在接口类中,全局常量的代码定义,public static funal不写的话JVM虚拟机也会自动添加这些关键字
//但是一般我们会将其写上,是为了提高阅读性。
public abstract void show();
public abstract void work();
//同样,public abstract这两个关键字不写虚拟机也会自动添加,我们一般还是得将其写上。
}
类与类或抽象类之间是继承关系,类与接口之间是实现关系。
实现关键字:implements
接口是不可以被实例化的。
只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化。
否则,这个子类就是一个抽象类。
class DemoYuer implements YuEr
{
public void show()
{
System.out.println("月球上的人"+NUM);
}
public void work()
{
System.out.println("粤语残片");
}
}
多实现:
在Java中不直接支持多继承,因为会出现调用的不确定性(如两个父类中的函数完全相同时)
所以Java将多继承机制改良,在Java中变成多实现。
即一个类可以实现多个接口。
比如:
interface A
{
public abstract void show();
}
interface B
{
public abstract void show();
}
class LingHan implements A,B
{
public void show()
{
System.out.println("你好。");
}
}
因为接口中的方法没有方法体(抽象函数都没有方法体),所以当两个接口里出现了完全相同的函数时,
子类实现时会将两个抽象函数都覆盖来定义方法体。就不会出现调用的不确定性了。
一个类在继承另一个类的同时,还可以实现多个接口。
比如:
interface C
{
public abstract void haha();
}
interface D
{
public abstract void hehe();
}
class Fu
{
void heihei()
{
System.out.println("Tony你好。");
}
}
class Zi extends Fu implements C,D
{
public void haha()
{
System.out.println("Jack你好。");
}
public void hehe()
{
System.out.println("Rose你好");
}
}
接口的出现避免了单继承的局限性。
类与类之间是继承关系,类与接口之间是实现关系。
接口与接口之间是继承关系,而且可以多继承。
所以,java中是可以多继承的,只不过是接口之间才能多继承。
比如:
interface E extends A,B,C,D //接口E继承了接口A,B,C,D
{
public abstract void qie();
}
class Duo implements E// 类Duo实现接口E相当于同时实现了接口A,B,C,D
{
public void show()
{
System.out.println("明年今日");
}
public void haha()
{
System.out.println("富士山下");
}
public void hehe()
{
System.out.println("海阔天空");
}
public void qie()
{
System.out.println("情人");
}
}
抽象类和接口的异同点:
相同点:
都是不断向上抽取而来的。
不同点:
1.抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2.抽象类中可以定义抽象方法和非抽象方法,子类继承后,非抽象方法可直接调用。
接口中只能定义抽象方法,必须由子类去实现。
3.抽象类的继承,是is a关系。是在定义该体系的基本共性内容。
接口的实现,是Like a关系。是在定义该体系的额外功能。
class InterfaceDemo
{
public static void main(String[] args)
{
LingHan l=new LingHan();
l.show();
System.out.println("--------------------");
DemoYuer d=new DemoYuer();
System.out.println(d.NUM);
d.show();
d.work();
System.out.println("--------------------");
Zi z= new Zi();
z.haha();
z.hehe();
z.heihei();
System.out.println("--------------------");
Fu f=new Fu();
f.heihei();
System.out.println("--------------------");
Duo c=new Duo();
c.hehe();
c.haha();
c.show();
c.qie();
}
}