04、抽象类与接口

内容多,第二次复习时写的


一、抽象类

1、本质:

当一个类不能描述一个具体对象时我们把它叫做抽象类

2、与普通类的区别:

它跟普通类一样可以定义成员方法和变量,但是不能实例化它可以和普通类一样实现多态、向上转型、动态绑定以及拥有构造方法等等

(它的主要作用就是用来继承的)


这里举个实现的例子:

public abstract class Shape1 {
    public abstract void draw();
}
public class Cycle1 extends Shape1{
    public void draw(){
        System.out.println("打印一个圆形");
    }
}
public class Rect1 extends Shape1{
    public void draw(){
        System.out.println("打印一个矩形");
    }
}
public class java0712 {
    public static void func(Shape1 shape1){ //这里实际上就是向上转型
        shape1.draw();
    }
    public static void main(String[] args) {
        func(new Cycle1());
        func(new Rect1());
    }
}

我们可以注意到,子类如果继承了抽象类,一定要重写抽象类的抽象方法,在重写时子类修饰访问权限要大于等于父类的访问权限否则会报错


还有一个要注意的小例子:

public abstract class Shape1 {
    public abstract void draw();
}
 abstract class A extends Shape1{
     abstract void text();
}
 class B extends A{
    public void draw(){

    }
    public void text(){

    }
}

这里就是说如果是一个抽象类(A)继承了一个抽象类(Shape),那就不需要重写抽象方法了,但是当另一个不是抽象类的类继承了A,那就不仅要重写A的,而且也要重写Shape的抽象方法


小结:

1、回想之前的dog和cat都继承的animal就可以定义成一个抽象类,因为它没有具体的作用,并且不能准确指定一个对象

2、private、static、final修饰方法时不能被重写


二、接口

1、定义:

任何类型只要实现了接口定义的成员,就可以被当作接口来使用,从而实现多态和代码复用等功能

2、特点:

接口中的成员变量和成员方法前面默认加了这个(如下)

public interface IShape {
//   public static final int a = 10;
   int a = 10;
//  public abstract void draw();
   void draw();
}

这样就可以让代码变得简洁了

3、性质:

接口中的方法不能有具体的实现,并且也不能进行实例化

一个类可以通过关键字implement来实现多个接口

public class Cycle2 implements IShape{
    public void draw(){
        System.out.println("打印一个圆形");
    }
    public void find(){
        System.out.println("寻找一个圆形");
    }
}
public class java0713 {
    public static void func(IShape iShape){
        iShape.draw();
        if(iShape instanceof Cycle2){
            Cycle2 cycle2 = (Cycle2) iShape;//向下转型,此时就能调用Cycle2中的方法了
            cycle2.find();
        }
    }

    public static void main(String[] args) {
        func(new Cycle2());
    }
}

那接口跟抽象类的区别是什么?

答:接口不能写构造方法,并且成员方法和成员变量类型是默认的

04、抽象类与接口_第1张图片

了解完接口得到的拓展:

1、我们可以利用一个类可以实现多个接口(用逗号隔开)的性质来间接的实现多继承

2、我们可以通过接口来忘记类型,直接满足接口性质就使用。


4、接口间的多继承

本质就是把多个接口合并成一个接口

interface IRunning {
 void run();
 }
 interface ISwimming {
 void swim();
 }
 // 两栖的动物,青蛙

 interface IAmphibious extends IRunning, ISwimming {
 }
 class Frog implements IAmphibious {
 ...
 }

实现这个接口的类要把他们的方法都重写了


5、两种常见的比较接口

① Comparable接口

public class Student implements Comparable{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }   //重写接口中的方法,这里属于是写死了,格式是固定的
    
    }
public class java0716{
    public static void main(String[] args) {
        Student student1 = new Student("张三",20);
        Student student2 = new Student("李四", 19);


        int a = student1.compareTo(student2); //student1调用,传入student2
        if (a > 0){
            System.out.println("student1 > student2");
        }
    }

}

这里就是通过重写现成的接口方法来实现比较的

② Coparator接口

import java.util.Comparator;

public class Student implements Comparator {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int compare(Student student1,Student student2) {
        return student1.name.compareTo(student2.name);
    }   //String中正好有compareTo,避免了字符串直接相减报错
    
    }
public class java0716{
    public static void main(String[] args) {
        Student student1 = new Student("bit",20);
        Student student2 = new Student("hello", 19);


        int a = student1.compare(student1,student2);
        if (a > 0){
            System.out.println("student1 > student2");
        }else {
            System.out.println("student1 <= student2");
        }
    }

}

这里点开String类型后发现中有compareTo方法

04、抽象类与接口_第2张图片


你可能感兴趣的:(04、抽象类与接口)