Java中的抽象类和接口

  • 抽象类
  • 接口
  • 抽象类和接口的区别

抽象类

抽象方法:没有实际工作的方法。abstract关键字定义。不能是privata(一定被重写)

abstract void f();

抽象类:包含抽象方法的类。不能加final(一定被继承)

ps:
1、抽象类和普通类最大的区别是抽象类包含抽象方法。
2、抽象类不能被实例化 new
3、存在的意义就是要被继承提前检查代码的错误(向上转型--父类不能被new)(防止客户端程序员创建该类的对象)
4、抽象类一旦被继承,一定要重写抽象方法
5、一个类继承了抽象类,如果不想重写抽象方法。那么当前类必须也设置成抽象类(可重写也可不重写)

接口

接口:interface定义一个接口。接口中包含的方法都是抽象方法,字段都是静态常量。

ps:
1、定义的成员方法默认是 public abstract
2、定义的成员属性默认是 public static final
3、类和接口的关系是实现:implements; 接口和接口的关系是extend
4、实现了接口必须重写抽象方法
5、使用接口的核心原因:为了能够向上转型为多个基类型。还有一个原因是防止客户端程序员创建该类的对象。

接口不仅仅是一种更纯粹的抽象类,接口没有任何具体的实现,因此多个接口可以自由组合。组合多个类的接口的行为称为多重继承。

抽象类和接口的区别

核心区别:抽象类可以包含普通方法和普通字段,这样的方法和字段可以被子类直接使用(不必重写),而接口不能包含普通方法,子类必须重写所有的抽象方法。

no区别抽象类(abstract)接口(interface)
1结构组成普通方法+抽象方法抽象方法+全局变量
2子类使用使用extends关键字继承抽象类使用implements关键字实现接口
3关系一个抽象类可以实现若干个接口

接口不能继承抽象类,但是接口可以使用extends关键字继承多个父接口

4子类限制一个子类只能继承一个接口一个子类可以实现多个接口
5权限各种权限public

=================================================

接口使用示例:

1、如果要排序自定义类型,需要手动实现comparable接口。
①该类实现(implements)comparable接口
②重写comparaTo方法

package com.test;

import java.util.Arrays;

public class Student implements Comparable<Student> {
    public String name;
    public int age;
    public double score;
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    @Override
    public int compareTo(Student o) {
//        return this.age - o.age;
        return this.name.compareTo(o.name);
    }

    public static void main(String[] args) {
        Student[] student = new Student[2];
        student[0] = new Student("b",18,66.6);
        student[1] = new Student("a",16,33.3);
        Arrays.sort(student);
        System.out.println(Arrays.toString(student));
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

}

2、接口实现clone
①实现conleable接口
②重写object clone(); 方法
③如果当前类包含引用类型,在当前类(Person)的克隆方法内不仅要克隆自己本身还需要克隆引用类型 (Money)。

package com.test;

class Money implements Cloneable{
  double money = 12.5;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Person implements Cloneable {
    public String name;
    public Money m;
    public Person() {
        this.m  = new Money();
    }


    @Override
    protected Object clone() throws CloneNotSupportedException {
       // return super.clone();
        Person per = (Person) super.clone();
        per.m = (Money)this.m.clone();
        return per;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        person.name = "caocao";
        Person person1 = (Person) person.clone();
        System.out.println(person.name);
        System.out.println(person1.name);
        person1.name = "hh";
        System.out.println(person.name);
        System.out.println(person1.name);
    }
}

( ̄▽ ̄)~*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值