JAVA抽象类与接口

一、抽象类

抽象类(Abstract Class)是一种不能被实例化的类,用于定义共性行为模板。通过`abstract`关键字声明,可以包含抽象方法(无实现)和具体方法(有实现)。

public abstract class Animal {
    // 抽象方法:无实现体
    public abstract void run();
    
    // 具体方法:有实现体
    public void eat() {
        System.out.println("动物在吃东西");
    }
}

抽象类的核心特点


-- 构造方法:可以定义构造器,供子类初始化。
-- 成员变量:可以包含实例变量和静态变量。
-- 代码复用:通过继承实现方法复用。

二、接口

接口(Interface)定义了一组行为契约,通过`interface`关键字声明。在Java 8后,接口支持默认方法(`default`)和静态方法。

public interface Flyable {
    // 抽象方法(默认public abstract)
    void fly();
    
    // 默认方法(Java 8+)
    default void glide() {
        System.out.println("滑翔中...");
    }
}

特点


-- 多实现:一个类可实现多个接口。
-- 无构造器:不能定义构造方法。
-- 行为抽象:定义“能做什么”,而非“是什么”。

接口与抽象类区别

特性        抽象类接口
继承/实现单继承多实现
构造器
方法类型抽象方法+具体方法抽象方法+默认方法
设计目的代码复用+定义模板定义契约行为
访问问修饰符方法可为任意访问修饰符默认public,不可为private

如何选择

抽象类:存在明确继承关系,需要共享代码或状态。

接口:定义多个无关类的共同行为,或者实现多态。

实际应用

假设有一个`Person`类,需支持按年龄或姓名排序。通过接口`Comparator`和抽象类`AbstractList`分别实现。

代码示例

Person定义

public class Person implements Comparable<Person> {
    public String name;
    public int age;
    public double height;

    public Person(String name,int age,double height){
        this.name = name;
        this.age = age;
        this.height = height;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
     // 其余构造方法、getter、setter省略
}

排序接口定义

import java.util.Comparator;

// 按年龄排序
Comparator<Person> ageComparator = new Comparator<>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
};

// 按姓名排序
Comparator<Person> nameComparator = (p1, p2) -> 
    p1.getName().compareTo(p2.getName());

main函数

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class SortExample {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("小花", 10, 187.4),
            new Person("小蓝", 20, 184.5),
            new Person("小黄", 30, 186.7),
            new Person("小绿", 40, 189.0)
        );

        // 按年龄排序
        Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge);
        people.sort(ageComparator);
        System.out.println("按年龄排序:");
        people.forEach(System.out::println);

        // 按姓名排序
        Comparator<Person> nameComparator = Comparator.comparing(Person::getName);
        people.sort(nameComparator);
        System.out.println("\n按姓名排序:");
        people.forEach(System.out::println);
    }
}

输出结果

按年龄排序:
Person{name='小花', age=10, height=187.4}
Person{name='小蓝', age=20, height=184.5}
Person{name='小黄', age=30, height=186.7}
Person{name='小绿', age=40, height=189.0}

按姓名排序:
Person{name='小蓝', age=20, height=184.5}
Person{name='小绿', age=40, height=189.0}
Person{name='小花', age=10, height=187.4}
Person{name='小黄', age=30, height=186.7}

代码详解

- 使用`Comparator.comparingInt`和`Comparator.comparing`方法创建比较器。
- `people.sort()`方法根据传入的比较器对列表进行排序。
- 排序结果通过`forEach`方法输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值