#抽象类
- 在面向对象的概念中,所有的对象都是通过类来描绘的,
但是反过来,并不是所有的类都是用来描绘对象的,
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
##抽象类的声明格式:
- public abstract class 类名{}
public abstract class Animal { //这是一个抽象类
public Animal(){} //这是抽象类的构造方法,用于创建子类对象时对父类数据的初始化
public final int x; //这是一个常量
public int x; //这是一个变量
public void show(){} //这是一个非抽象方法
public abstract show2(); //这是一个抽象方法
}
##特点
-
抽象类和抽象方法必须用abstract修饰
-
抽象类不一定有抽象方法,但有抽象方法的类一定要定义为抽象类
-
抽象类不能被实例化,但是可以通过具体的子类实现,是多态的方式
但是抽象类有构造方法,抽象类的构造方法用于创建子类对象时对父类数据的初始化 -
抽象类的子类:
- 抽象类
- 具体类,重写所有的抽象方法
##抽象方法
没有方法体的方法,即不带花括号。
用abstract修饰
定义为:修饰符 abstract 返回值类型 方法名 ();
##成员特点
-
成员变量:
既可以是常量,也可以是变量,当然也可以没有 -
构造方法:
有,用于创建子类对象时对父类数据的初始化 -
成员方法:
既可以是抽象的,也可以不是抽象的
##成员方法特性
抽象方法: 强制要求子类做的事情,因为子类必须重写父类的所有抽象方法
非抽象的方法: 子类继承的事情,提高代码复用性
##抽象类不能和哪些关键字共存 -
private 冲突
原因:被private修饰的方法不能重写
-
final 冲突
>原因:被final修饰的方法不能被重写 -
static 无意义
>原因:被static修饰的方法却可以直接被类名调用,但抽象方法没有方法体,所以无意义
#接口
##定义
- 接口的主体包含着抽象方法,但所有方法在接口内(定义上)都是抽象(Abstract)方法,所以abstract的关键字在接口内则不被需要。由于接口代表着一个对外行为的集合,所以任何方法在接口内都是public(公开的)。
##特点 - 用关键字interface表示
- interface 接口名{}
- 类实现接口用implements表示
- class 类名 implements 接口名{}
- 接口的实现类名一般格式:接口名+Impl
- 接口不能被实例化,但可以通过实现类来实例化,多态的方式
- 接口的子类:
- 抽象类
- 具体类,要重写接口中所有抽象方法
interface Study { //这是一个接口
//这是一个静态常量,接口中的所有变量默认为静态常量
public static final int x;
//接口中不存在构造方法
//这是一个抽象方法,接口中所有成员方法默认为公共抽象方法
public abstract void study();
}
class People implements Study { //这是接口的实现类
@Override
public study(){
System.out.println("learn English");
}
}
##成员特点
- 成员变量:
- 只能是常量,并且是静态的
- 默认被public static final修饰
建议自己手动给出
- 构造方法:
- 没有构造方法
- 成员方法
- 只能是抽象方法
- 默认被public abstract修饰
- 建议自己给出
所有的类都默认继承自Object类, Object类是所有类层次的根类
##类与类,类与接口,接口与接口的关系
-
类与类:
继承关系,只能单继承,但是可以多层继承
-
类与接口:
实现关系,可以单实现,可以多实现
并且还可以在继承一个类的同时实现多个接口
格式:class 子类名 extends 父类名 implements 接口名1,接口名2{} -
接口与接口:
继承关系,可以单继承,可以多继承
格式:interface 接口名 extends 接口名1,接口名2 {}
##抽象类和接口的区别
- 成员区别
- 抽象类:
- 成员变量:可以是变量,可以是常量
- 成员方法:可以是抽象方法,也可以是非抽象方法
- 构造方法:有,用于创建子类对象时对父类数据的初始化
- 接口:
- 只能是常量,并且是静态的
- 只能是抽象方法
- 没有构造方法
- 抽象类:
- 关系区别
- 类与类是继承关系
- 类与接口是实现关系,可以单实现,可以多实现
- 接口与接口是继承关系,可以单继承,可以多继承
- 设计理念区别
-
抽象类定义的是共性关系
将几个类中相同的部分抽取出来写成一个类
-
接口定义的是扩展关系
定义原本不具备的功能,然后令其实现
-
interface Jump {
public abstract void Jump();
}
interface Study {
public abstract void Study();
}
interface Other extends Jump,Study {}
public abstract class Animal {
public abstract eat();
public void sleep() {
System.out.println("sleep");
}
}
public class Dog extends Animal implements Jump,Study {
@Override
public void eat(){
System.out.println("狗吃肉");
}
@Override
public void Study(){
System.out.println("狗学钻火圈");
}
@Override
public void Jump (){
System.out.println("狗会跳高");
}
}