面向对象进阶(抽象类,接口)

抽象方法:

将共性的方法/行为抽取到父类之后,由于每一个子类执行的内容是不一样的,所以在父类中不能确定具体的方法体,该方法就可以定义为抽象方法。

格式:

抽象方法:public abstract 返回值类型 方法名(参数列表) 

抽象类:
一个类中存在抽象方法,那么该类就必须声明为抽象类

格式:

抽象类:public abstract class 类名{}

注意事项:

  1. 抽象类不能创建对象
  2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  3. 抽象类可以有构造方法
  4. 抽象类的子类 要么重写抽象类中的所有抽象方法,要么是抽象类(多采用前者)

接口:

1.用关键字interface来定义

public interface 接口名{} 

2.接口不能实例化(不能创建对象)

3.接口和类之间是实现关系,通过implements关键字表示

public class 类名 implements 接口名{}

4.接口的子类(实现类)

要么重写接口中的所有抽象方法

要么是抽象类

注意:
1.接口和类的实现关系,可以单实现,也可以多实现

public class 类名 implements 接口名1,接口名2{}

2.实现类还可以在继承一个类的同时实现多个接口

public class 类名 extends 父类 implements 接口名1,接口名2{}

接口中成员的特点

1.成员变量

只能是常量

默认修饰符(没有写但存在):public static final

2.构造方法

没有。因为接口不能创建对象也不能赋值,,

3.成员方法

只能是抽象方法

默认修饰符:public abstract

JDK7以前:接口中只能定义抽象方法

接口和类之间的关系:

类和类的关系:

继承关系,只能单继承,不能多继承,但是可以多层继承

类和接口的关系

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口(一个实现类实现了两个接口,则要重写两个接口中的所有抽象方法。若其中有重名方法,重名的方法只用写一遍就可以了)

接口和接口的关系:

继承关系,可以单继承,也可以多继承(如果实现类实现了最下面的子接口,就需要重写所有的抽象方法,若inter3继承了inter1和inter2,实现类实现(implements)inter3,则实现类要重写inter1,2,3中所有的抽象方法)

接口和抽象类有以下区别:

  1. 定义方式:接口使用interface关键字进行定义,而抽象类使用abstract关键字进行定义。

  2. 实现方式:一个类可以实现多个接口,但只能继承一个抽象类。

  3. 方法实现:接口中的方法都是抽象方法,没有方法体,而抽象类可以包含抽象方法和具体方法的实现。

  4. 构造函数:接口不能有构造函数,而抽象类可以有构造函数。

  5. 成员变量:接口中的成员变量默认是public static final类型的常量,而抽象类可以有各种类型的成员变量。

  6. 继承关系:一个类实现接口时,必须实现接口中的所有方法;而抽象类可以包含一些已经实现的方法,子类只需要实现抽象类中的抽象方法即可。

  7. 使用场景:接口用于定义一组相关的方法,用于实现多态性和解耦;抽象类用于定义一些通用的属性和方法,用于代码复用和继承。

下面是一个示例,展示了接口和抽象类的定义和使用:

// 定义接口
interface Animal {
    void eat();
    void sleep();
}

// 定义抽象类
abstract class Shape {
    String color;
    
    Shape(String color) {
        this.color = color;
    }
    
    abstract double getArea();
    
    void display() {
        System.out.println("This is a " + color + " shape.");
    }
}

// 实现接口
class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("The dog is eating.");
    }
    
    @Override
    public void sleep() {
        System.out.println("The dog is sleeping.");
    }
}

// 继承抽象类
class Circle extends Shape {
    double radius;
    
    Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
    
    @Override
    double getArea() {
        return Math.PI * radius * radius;
    }
}

// 使用接口和抽象类
public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat();
        animal.sleep();
        
        Shape shape = new Circle("red", 5.0);
        shape.display();
        System.out.println("Area: " + shape.getArea());
    }
}

使用接口而不使用抽象类的情况 

1. 需要实现多态

2. 要实现的方法(功能)不是当前类族的必要(属性).

3. 要为不同类族的多个类实现同样的方法(功能).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值