Java中的抽象类和接口

抽象类的概述:我们把一个不是具体的功能成为抽象的功能,而一个类中如果有抽象的功能就是抽象类

抽象类的特点:
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("猴子上蹿下跳");
    }
}

当抽象类和接口作为形式参数时,抽象类需要的是该抽象类的子类的对象,接口需要的是该接口实现类的对象

当抽象类和接口作为返回值时, 抽象类返回的是该抽象类的子类的对象,接口返回的是该接口实现类的对象

原文地址:https://www.cnblogs.com/losedMemory/p/6083605.html