Java抽象类和接口

1.抽象类

定义

当一个类中不想写具体的成员方法和成员变量时,此时我们就可以在class前面加一个abstract,进行修饰,名为抽象类。

abstract class Shape{
    public abstract  void func();//抽象方法不用写{}
}

抽象类的使用

1.抽象类存在最大的意义就是被继承。抽象类中可以有普通的成员方法,也可以有抽象方法,和抽象类一样,也是在方法返回值类型前面加一个abstract。
2.抽象类A可以被抽象类B继承,在被继承后,抽象类B可以不用重写抽象类A中的抽象方法,而普通类如果继承了抽象类B,那么需要把抽象类A和抽象类B中的所有抽象方法都要重写一遍,否则就会报错。
3.抽象类是不能够进行实例化的,所以它的意义就是被继承吧。
4.抽象类可以发生向上转型,进而发生多态

 public static void drawmap(Shape shape){
        shape.func();
    }
    public static void main(String[] args) {
        //    Shape shape=new Shape();//抽象类不能进行实例化
        /*Shape shape=new Cycle();
        shape.func();*/
        Cycle cycle=new Cycle();
        drawmap(cycle);
    }

接口

定义

接口是一种行为规范和标准。

接口使用

1.接口使用interface关键字进行修饰
2.在接口中,它里面的方法默认都是抽象方法,public abstract
所以我们写方法的时候,前面直接可以不用加
3.在接口中,它里面的成员变量默认都是静态常量,public static final
4.如果要在接口中实现具体的成员方法,可以加一个default。

interface Shape1{
    void  draw();//抽象类中的方法默认都是抽象方法 public abstract
    public  static final int a=10;//成员变量默认静态常量
    default void func(){//想要有具体的实现方法,可以加个default
        System.out.println("少年和我");
    }
}

5.接口中的静态方法可以有具体实现方式

interface Shape1{
   public static void func1(){
        System.out.println("某某某");
    }
}

6.类实现接口是通过implements,并且实现多个接口的时候用逗号隔离。

class A implements Shape1,Shape2{
    @Override
    public void draw() { //方法必须要重写
        System.out.println("A");
    }

    @Override
    public void write() {
        System.out.println("写");
    }
}

7.接口和接口之间我们需要用extends 来扩展

三个重要的接口

Comparable

当我们创建了一个Student类,成员变量中含有姓名、年龄、分数。写一个含有以上三个成员变量的构造方法,并重写toString 方法。
在主类中,定义了一个数组,students[0]、students[1]、students[2]
我们直接使用Array.sort(students),进行排序,那么结果就会编译不通。
通过给出的提示,我们可以看到有个Comparable接口,所以我们需要让Student类implements Comparable

class Student implements Comparable<Student>

同时我们还需要重写comparetTo 方法,在这个里面可以根据我们的需要来写是根据年龄或者成绩或者名字来进行判断

 public int compareTo(Student o) {
        return this.age-o.age;
    }

那么等我们再去调用这个Arrays.sort 的时候,我们就可以成功进行排序了。

Comparator比较器

有了这个comparable这个接口,自然是可以进行排序,但是我们发现对类的入侵性过大,可以随意更改。所以我们就有了ComParator这个比较器。
我们可以重新写一个类,来implements Comparator ,在这个类里面我们可以根据自己的想法,是按照姓名或者年龄或者成绩排名都可以,所以我们可以重新写三个类,这样想用哪个用哪个

class AgeComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        return o1.age- o2.age;
    }
}
class StringComparator implements Comparator<Student>{

    @Override
    public int  compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}
class ScoreComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        return (int)(o1.score- o2.score);
    }
}

主类进行调用

  StringComparator studentComparator=new StringComparator();
        Arrays.sort(students,studentComparator);
        System.out.println(Arrays.toString(students));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值