接口:
接口:当一个抽象类,如果抽象类中的所有方法都是抽象的,那么我们就可以把它定义为一个接口,接口是对行为的抽象。类是对属性和行为的抽象。
代码表示:
interface 接口名{
方法定的定义;
….
}
定义普通的类或者抽象类可以使用class关键字,定义接口必须interface关键字完成
interface class Demo
{
abstract void show1();
abstract void show2();
}
接口的特征:
1、接口中的方法的定义不需要Abstract来修饰,默认就是抽象的。
2、接口是不可以实例化的,需要有类来实现接口的语法。
class 类名 implements 接口名,接口名,…{
//实现每一个接口中的方法
}
接口中成员的特点:
- 接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以
接口中的变量也称之为常量。- 接口中可以定义方法,方法也有固定的修饰符,public abstract
- 接口中的成员都是公共的。
- 接口不可以创建对象。
- 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽
象类
interface Demo//定义一个名称为Demo的接口。
{
public static final int NUM = 3;
public abstract void show1();
public abstract void show2();
}
/*定义子类去覆盖接口中的方法。子类必须和接口产生关系,类与类的关系是继承,类与接口之间的关系是 实现。通过 关键字 implements
*/
class DemoImpl implements Demo//子类实现Demo接口。
{
//重写接口中的方法。
public void show1(){}
public void show2(){}
}
接口最重要的体现:
解决多继承的弊端。将多继承这种机制在java中通过多实现完成了.
弊端:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性。
其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容。
因为接口中的功能都没有方法体,由子类来明确。故可以很好的解决多继承的问题。
子类继承父类的同时实现接口:
class Fu
{
public void A(){}
}
interface C
{
pulbic void B();
}
class Zi extends Fu implements C
{
public void B()
{
}
}
接口的出现避免了单继承的局限性。
父类中定义事物的基本功能,接口中定义事物的扩展功能。
接口之间的多继承:
多个接口之间可以使用extends进行继承
interface A{//接口A
void show();
}
interface B{//接口B
void show1();
}
interface C{//接口C
void show2();
}
interface D extends A,B,C{//接口D继承接口A,B,C
void show3();
}
如果遇到多个接口中有相同的方法,若此时有一个类实现了这些接口,那么就要实现接口中的方法,但是接口中的方法时抽象方法,所以子类实现后也不会发生调用的不确定性。
抽象类:
抽象类由来
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的行为方
式,那么这些方法都有具体的方法体。
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类
如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算
法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声
明相同,但功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那
么此方法就是一个抽象方法。
描述狗:行为:吼叫
描述狼:行为:吼叫
狗和狼之间有共性,可以进行向上抽取。抽取它们的所属共性类型:犬科。由于狗和狼
都具有吼叫功能,但是他们具体怎么吼叫却不一样。这时在描述犬科时,发现了有些功能
(吼叫)不具体,这些不具体的功能,需要在类中标识出来,通过java中的关键字
abstract(抽象)。
当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽
象类
abstract class 犬科
{
static abstract void 吼叫();//抽象函数。需要abstract修饰,并分
号;结束
}
class Dog extends 犬科
{
void 吼叫()
{
System.out.println("汪汪汪汪");
}
}
class Wolf extends 犬科
{
void 吼叫()
{
System.out.println("嗷嗷嗷嗷");
}
}
抽象类的特点
- 抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
- 抽象类不可以创建实例,原因:调用抽象方法没有意义。
- 只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。否则该子类还是一
个抽象类。
4、抽象类一定是一个父类。
5、抽象类有构造函数,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始哈。
抽象类和一般类的异同点:
相同:
它们都是用来描述事物的。
它们之中都可以定义属性和行为。
不同:
一般类可以具体的描述事物。抽象类描述事物的信息不具体
抽象类中可以多定义一个成员:抽象函数。
一般类可以创建对象,而抽象类不能创建对象。
抽象类中可以不定义抽象方法。
抽象关键字abstract不可以和哪些关键字共存?
final:fianl修饰的类是无法被继承的,而abstract修饰的类一定要有子类.final
修饰的方法无法被覆盖,但是abstract修饰的方法必须要被子类去实现的。
static:静态修饰的方法属于类的,它存在与静态区中,和对象就没关系了。而
抽象方法没有方法体,使用类名调用它没有任何意义。
private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和
private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类
根本无法得到父类这个方法。互相矛盾