抽象类的概述:我们把一个不是具体的功能成为抽象的功能,而一个类中如果有抽象的功能就是抽象类
抽象类的特点:
A:抽象类和抽象方法必须用abstract关键字修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
C:抽象类不能实例化
因为它不是具体的。
抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
用于子类访问父类数据的初始化
D:抽象的子类
a:如果不想重写抽象方法,该子类是一个抽象类。
b:重写所有的抽象方法,这个时候子类是一个具体的类。
抽象类的实例化其实是靠具体的子类实现的,是多态的方式。
举例:
abstract class Animal { //抽象方法 //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体 public abstract void eat(); public Animal(){} } //子类是抽象类 abstract class Dog extends Animal {} //子类是具体类,重写抽象方法 class Cat extends Animal { public void eat() { System.out.println("猫吃鱼"); } } class AbstractDemo { public static void main(String[] args) { //创建对象 //Animal是抽象的; 无法实例化 //Animal a = new Animal(); //通过多态的方式 Animal a = new Cat(); a.eat(); } }
注意:abstract不能和private final static这些关键字共存.
二 接口:在java中不允许一个类继承多个多个父类,但是要实现“一个类继承多个类的功能”就可以用接口,一个类实现多个多个接口从而间接实现多重继承。从本质上讲,接口也是一种抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。个人感觉和OC中的分类与拓展类似,当然具体细节还是不一样的
接口的特点:
A:接口用关键字interface表示 interface 接口名 {}
B:类实现接口用implements表示 class 类名 implements 接口名 {}
C:接口不能实例化
那么,接口如何实例化呢?
按照多态的方式来实例化。
D:接口的子类
a:可以是抽象类。但是意义不大。
b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
接口成员特点
成员变量;只能是常量,并且是静态的。
默认修饰符:public static final
建议:自己手动给出。
构造方法:接口没有构造方法。
成员方法:只能是抽象方法。
默认修饰符:public abstract
建议:自己手动给出。
所有的类都默认继承自一个类:Object。
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
//定义一个接口 interface Animal{ //接口的方法不能带有主体也就是不能有大括号 public abstract void jump(); } //抽象类实现接口 abstract class Dog implements Animal { //抽象类可以不实现方法 } //具体类实现接口 class Cat implements Animal{ //在这里必须要实现方法,不然会报错 public void jump(){ System.out.println("猫跳"); } } //超类 class Monkey extends Object implements Animal { public void jump(){ System.out.println("猴子上蹿下跳"); } }
当抽象类和接口作为形式参数时,抽象类需要的是该抽象类的子类的对象,接口需要的是该接口实现类的对象
当抽象类和接口作为返回值时, 抽象类返回的是该抽象类的子类的对象,接口返回的是该接口实现类的对象