抽象类和接口

抽象类

本小节我们将了解,如何将一个类定义为抽象?定义抽象类有什么用? 

抽象方法的定义格式如下:

abstract 返回值类型 方法名称(参数);

我们使用关键字abstract

abstract class Animal{
    abstract void shout();
}
class Dog extends Animal{
    void shout(){
        System.out.println("汪汪");
    }
}
public class test1 {

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.shout();
    }
}

抽象类的定义规则如下:

  1. 抽象类不能被实例化,即不能通过 new 关键字创建抽象类的对象。
  2. 抽象方法只需声明而不需要实现
  3. 如果一个非抽象类继承了抽象类,那么该子类必须实现抽象类中的全部抽象方法
  4. 抽象类和抽象方法都要使用abstract关键字声明
  5. 抽象类不仅可以包含抽象方法,也可以包含非抽象(具体实现)的方法,这些方法可以直接被子类继承和使用。

定义抽象类的作用:

当定义一个类时,常常需要定义一些成员方法描述类的行为特征,但有时候这些方法的实现方式是无法确定的。例如,前面在定义Animal类时,shout()方法用于描述动物的叫声,但是不同的动物叫声是不同的,因此在shout()方法中无法准确地描述动物的叫声,所以我们就需要用抽象类来满足这种需求,并且抽象类能够实现代码的复用

接口

如果一个抽象类的所有方法都是抽象的,则可以将这个类定义接口。接口中除了默认方法和静态方法(也叫做类方法),默认使用default修饰,静态方法使用static修饰,且这两种方法都允许有方法体。

接口使用interface关键字声明,接口中变量默认使用“public static final”进行修饰。定义的方法默认使用“public abstract”进行修饰,即抽象方法。如果接口声明为public,则接口中的常量和方法全部为public。

注意:不管写不写访问权限,接口方法的访问权限永远是public。在接口中定义常量时,可以省略前面的“public static final”,此时,接口会默认常量添加“public static final”

接口中可以包含三类方法:抽象方法,默认方法,静态方法。静态方法可以通过“接口名.方法名”的形式来调用,而抽象方法和默认方法只能通过接口实现类的对象来调用。接口实现类的定义方式比较简单,只需要定义一个类,该类使用implements关键字实现接口,注意:一个类可以在继承另一个类的同时实现多个接口,并且多个接口之间需要使用英文逗号分隔,接口是不允许继承抽象类的

定义类的实现类,语法格式如下:

修饰符 class 类名 implement 接口1,接口2,...{
    ...
}

下面是一段示例代码 

//定义接口Animal
interface Animal{
    int ID = 1;
    String NAME = "牧羊犬";
    void shout();//定义抽象方法shout()
    static int getId(){
        return Animal.ID;
    }
    public void info();//定义抽象方法info()
}
interface Action{
    public void eat();//定义抽象方法eat()
}
class Dog implements Animal,Action{
    public void eat(){
        System.out.println("喜欢吃骨头");
    }
    //重写Animal接口中的抽象方法shout()
    public void shout(){
        System.out.println("汪汪");
    }
    public void info(){
        System.out.println("名称:"+NAME);
    }
}
public class test1 {
    public static void main(String[] args) {
        System.out.println("编号"+Animal.getId());
        Dog dog = new Dog();//创建Dog类的实例对象
        dog.info();
        dog.shout();//调用Dog类中重写的shout()方法
        dog.eat();//调用Dog类中重写的eat()方法
    }
}
  1. 关于方法的重写:返回值一样,方法名一样,参数列表一样(个数,顺序,类型)
  2. 静态方法不能被重写
  3. 被private修饰的方法不能被重写
  4. 被final修饰的不能被重写[密封方法]
  5. 如果方法被重写,那么子类的访问权限必须大于等于父类的权限

权限的从小到大:private<default<protected<public

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值