javaSE学习-面向对象10-抽象类与接口

抽象类

java中,对象都是用类表示的,但是有的类却不能表示描述对象;比如,动物,这个本身不是一个具体的事物,猫是动物,狗也是动物,所以动物不是对象,他是抽象的,那动物在java中怎么表示,这时候就用到抽象类了

我们可以将动物定义为抽象的,将所有是动物的行为给一个声明,而不给出具体实现,这时动物类就可以被定义为一个抽象类

java中,将不是具体的对象定义为抽象类,不是具体功能的方法定义成抽象方法

抽象类定义

使用关键字 abstract 定义抽象类和抽象方法

1
2
3
public abstract class{
public abstract int methodDemo();
}

抽象类是特殊的类,一般是为了被继承,只声明方法,不实现,方法的具体实现由子类实现

抽象类特点

  • 抽象类和抽象方法必须被 abstract 修饰
  • 抽象类中可以有抽象方法和非抽象方法,但是如果一个类中有抽象方法,这个类必须定义为抽象类
  • 自己不能被实例化,不能创建对象,但是可以通过多态方式用子类实例化
  • 抽象类中有构造方法,但是不能用于实例化,是为了子类访问父类数据的初始化
  • 抽象方法只声明,没有实现,没有方法体;只能由子类重写实现
  • 抽象的子类
    • 如果不想重写抽象类的抽象方法,将子类定义为抽象类
    • 子类是一个普通的类,必须重写抽象类的所有抽象方法
  • 抽象方法中的构造方法和 static 类方法不能声明为抽象方法

抽象类的方法,抽象方法,是要求子类必须做的事情,非抽象方法,是提高代码复用性,子类可以使用也可以不使用

抽象类的注意事项

abstract 不能和关键字 private、final、static组合

  • 被 private和final 修饰的方法,不能被子类重写,但是被 abstract 修饰的方法必须被子类重写,会冲突
  • 被 static 修饰的方法,能被类直接调用,但是 abstract 修饰的方法只是声明,而没有实现,不能调用执行

抽象类例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package test;

public class AnimalTest {
public static void main(String[] args) {
Animal aDog = new Dog("狗狗",1);
aDog.eat();
Animal aCat = new Cat("猫猫",1);
aCat.eat();
}
}

abstract class Animal{
private String name;
private int age;
public Animal() {}
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }

public abstract void eat();
}

class Dog extends Animal{
public Dog() {}
public Dog(String name,int age) {
super(name,age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
class Cat extends Animal{
public Cat() {}
public Cat(String name,int age) {
super(name,age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}

接口

抽象类,是将不是具体的事物定义为抽象类,但是有共有的特性,比如动物,都有吃,叫等行为,而后天形成的一些行为,有的动物有,有的动物没有,这时用到接口

接口是所有抽象方法的集合

接口的定义

使用关键字 interface 定义,代替类关键字 class

1
public interface InterfaceName{}

接口是抽象类的扩展但不是抽象类;从定义方式可以看出,接口没有关键字 class,说明接口并不是一个类

接口的特点

  • 接口访问权限默认 public ,如果显示指为 private 或 protected
  • 接口中的成员变量会被默认指定为 “public static final”,所以接口中的方法都是常量
  • 接口中的所有方法都是抽象的,必须是声明,不能有实现的方法
  • 接口不能被实例化,也没有构造方法
  • 接口的实现类使用 implements 关键字实现接口,并且必须实现接口中的所有方法

类和接口的关系

类与类:单继承,多层继承
类与接口:类实现接口,可以多实现 (可以再一个类中实现多个)
接口和接口:可以单继承和多继承

抽象类和接口的区别

  1. 成员区别
    • 抽象类
      • 成员变量:常量、变量
      • 构造方法:有
      • 成员方法:可以有抽象和非抽象成员方法实现
    • 接口
      • 成员变量:仅可以有常量
      • 构造方法:无
      • 成员方法:只能存在抽象方法,不能存在方法的实现
  2. 修饰符区别
    • 抽象类:成员方法可以有public、protected和default修饰符
    • 接口:默认修饰符是public。不可以使用其它修饰符
  3. 实现类区别
    • 抽象类:被继承 - 一个类只能继承一个抽象类
    • 接口:被实现 - 一个类可以实现多个接口
  4. 设计目的
    • 抽象类:被继承时是is a的关系,抽象类是对继承体系的共性功能,是对类根源的抽象;如:男人女人的抽象类 - 人,男人很女人都是人,只能单独继承人抽象类,而不可能继承机器人抽象类
    • 接口:被实现时是hive a的关系,接口是对动作的抽象,是对某个具体的类扩展类功能