抽象类、接口

抽象类

由于继承这个显著特点,我们可以将子类设计的更加具体,而父类更加一般化,通用化。父类可以封装不同子类的共同特征或者共同行为.而有的时候,父类中封装的方法无法具体完成子类中需要的逻辑,因此我们可以将此方法设计成抽象方法,即使用关键字abstract进行修饰。而有抽象方法的类,也必须使用abstract关键字进行修饰,因此我们称之为抽象类

无{},有abstract
有抽象方法的类是抽象类
子类要实现父类的所有抽象方法,或子类也声明为抽象类
不能final
可以没有抽象方法
不能实例化(new)调用构造器,可以提供构造器
public abstract class Animal {
    private String name;
    private int age;
    private String color;

    public Animal() {}

    public Animal(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }
    // 抽象方法
    public abstract void noise();
}
class Dog extends Animal{

    public Dog() {
    }

    public Dog(String name, int age, String color) {
        super(name, age, color);
    }

    public void lookHouse(){
        System.out.println("~~看家~~");
    }
    public void noise(){
        System.out.println("~~汪汪汪~~");
    }
}
class Cat extends Animal{
    public void getMouse(){
        System.out.println("~~可以抓耗子~~");
    }
    public void noise(){
        System.out.println("~~喵喵喵~~");
    }
}
// 如果不想实现抽象类里的抽象方法,该类需要使用abstract修饰
abstract class Duck extends Animal{
    public void swim(){}
}

接口

接口特点

  • 使用interface进行定义
  • 可以提供成员变量,默认提供public static final进行修饰
  • 可以提供成员方法,默认使用public abtract进行修饰
  • 接口中不能存在构造器,接口不能实例化,没有任何意义

实现接口

1) 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。

2) 使用关键字implements进行实现,必须实现接口中的所有抽象方法

3) 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类

接口间的继承

1)接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个接口。

2)子接口继承了父接口中的所有抽象方法

public interface IntefaceA {
    double PI = 3.14;
    public static final double NUM = 0.618;

    void showInfo();
    public abstract int sum(int a, int b);
}

/**
 * 5. 一个类实现接口,需要使用关键字implements
 * 6. 一个类实现接口时,需要实现里面的所有抽象方法,否则需要使用abstract修饰class
 */
class ClassA implements IntefaceA {
    public void showInfo() {}
    public int sum(int a, int b) {
        return a + b;
    }
}
abstract class ClassB implements IntefaceA {
    public void showInfo() {}
}

JDK1.8以后的接口新特性

1. 提供了默认方法:使用default修饰词修饰的具有方法体的方法。
  --1)该方法,默认使用public修饰,
  --2)该方法,逻辑不能满足子类时,子类可以重写
2. 提供了静态方法:使用static修饰的具有方法体的方法
  --1)该方法,默认使用public修饰
public interface InterfaceM {
    default void print(){
        System.out.println("--欢迎来到中国,我的家--");
    }
    static void print2(){
        System.out.println("--地球只有一个,人人有责---");
    }
}
class classU implements InterfaceM{
    //重写接口里的默认方法
    @Override
    public void print(){
        System.out.println("--欢迎来到长春,我的家--");
    }

    //@Override   添加注解报错,因此print2方法不能重写,此时是自己独有的静态方法。
    static void print2(){
        System.out.println("--地球只有一个,人人有责---");
    }
}

其他接口

@Override
    public int compareTo(Person o) {
        //按照年龄比较,升序:   返回负数,证明this小,返回0,证明一样,返回正数,证明this大
        //return this.age - o.age;
        //按照身高比较,降序:
        //return o.height - this.height;
        //先按照年龄升序,如果年龄相同,按照身高降序
        int r = this.age - o.age;
        if(r == 0){
            r = o.height - this.height;
        }
        return r;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值