一、抽象方法:我们从具有相同属性和行为的子类中抽取出来形成一个共同的父类。我们可以定义共同的属性,但是对于子类共同的方法,我们没有一个同一的描述(也就是说父类没有办法描述每一个子类的行为具体表现形式属性,但是子类的行为都具有共同的行为属性)
抽象方法的定义格式如下:
abstract public 返回值类型 方法名();
如:动物的叫声,狗的叫声是汪汪、猫的叫声是喵喵,但是都具备叫这个功能。通过将猫和狗的“叫”的这个方法(猫和狗之间的共同的协议抽象为一个抽象的方法)
- 第一步
class Animal
{
String name;
public abstract void sound();
}
注意上面只是第一步,通过将动物“叫”的方法抽象出一个抽象方法,java中同时规定只要一个类中有一个abstract方法,那么这个类就要声明成一个abstract类。
- 第二步
abstract class Animal
{
String name;
public abstract void sound();
}
二、抽象方法和抽象类之间的关系
一个abstract类可能没有声明任何的abstract方法,也可能生命了部分的abstract方法
一个abstract类中如果包含abstract方法,那么这个类一定要声明为一个abstract类
三、继承中的抽象
- 当父类是抽象的时候,子类如果不是抽象类,那么在子类在继承父类的所有属性和方法的同时,如果子类没有将父类的抽象方法进行抽象,那么子类任然是一个abstract类
- 如果父类是抽象的,一级子类也是抽象的,二级子类不抽象,那么二级子类必须实现它所继承所有父类和一级子类的抽象方法,否则二级子类仍是一个abstract类,但是这里的一级子类并不需要实现父类所有的abstract方法。
示例:
abstract class Animal
{
String name;
public abstract void sound();
public abstract void eat();
}
abstract class Canine extends Animal
{
public abstract void toe();
}
class Poppy
{
public void sound()
{
System.out.println("汪汪");
}
public void eat()
{
System.out.println("shit");
}
public void toe()
{
System.out.println("五趾");
}
}
四、抽象和对象实例化
对于一个抽象类是不能实例化的,如果我们要进行实例化,我们必须声明一个子类将父类的所有抽象方法实现,对子类声明一个对象实例化。
class Test1
{
public static void main(String[] args)
{
Animal a = new Animal();
}
}
这里Animal是一个abstract类,我们在main函数中对其声明之后,系统编译出现下满的错误
Animal是抽象的:无法实例化
Animal a = new Animal();
五、接口
当众多子类继承同一个父类,父类中包含的属性和方法是子类共同制定的一个协议,但是在这众多的子类中有一子类又有着共同的行为属性。(这个方法不能用一个统一的语句表示,因为子类的行为属性相同,但是行为具体表现形式不同。具体的例子就是猫和狗都会叫这个共同的行为属性,但是表现形式不同。)
这时我们不能将这些部分拥有相同行为属性的方法写进父类的abstract方法中,此时我们用一个完全的抽象类来实现部分子类拥有的相同行为属性。
接口的标准形式
Interface 接口名
接口中是一个完全的抽象类,对于接口中的方法,继承接口的子类(如果我们不想将直接继承的子类全部定义为abstract类)需要将接口中的全部方法进行实现。
六、接口中的继承关系
在子类继承父类时我们一个子类有且只能继承一个父类,但是在继承中,一个类可以在extends一个父类的同时implement多个接口,具体的形式如下:
class A extends B implement C,D