Java抽象类和接口

抽象类

        new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。

基本概念:含有抽象方法的类就是抽象类,抽象类必须使用abstract关键字声明。

抽象方法:即没有方法体的方法,同时使用abstract修饰。

继承抽象类的关键字是extends

//定义一个抽象类
abstract class A{
    
    public void fun(){
        System.out.print("hello world");
    }
    
    public abstract void print();//抽象方法,没有方法体,有关键字abstract修饰。
}

注意

         1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

         2、抽象方法必须由子类来进行重写。

         3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

         4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

         5、子类中的抽象方法不能与父类的抽象方法同名。

         6、abstract不能与final并列修饰同一个类。

         7、abstract 不能与private、static、final或native并列修饰同一个方法。

        8、抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,
那么子类也必须定义为抽象的。换句话说,在继承自抽象类的非抽象子类中,必须
实现所有的抽象方法。还要注意到,抽象方法是非静态的。
 

        实例

abstract  class Animal {//定义一个抽象类
    public abstract void eat();  //抽象方法
}

class Cat extends Animal{

    public void eat(){//子类重写抽象方法

        System.out.println("我吃鱼");
    }
}

class Dog extends Animal{

    public void eat(){

        System.out.println("我吃骨头");
    }

    public void run(){
        System.out.println("我会跑");
    }
}

public class book {

    public static void main(String[] args) {

        Animal a1 = new Cat(); //向上转型
        Animal a2 = new Dog();     
        a1.eat();
        a2.eat();
    }
}

//输出
//我吃鱼
//我吃骨头

接口

基本概念

          接口是一种比抽象类更加抽象的“类”。但是它的目的是指明相关或者不相关类的对象的共同行为。例如,使用适当的接口,可以指明这些对象是可比较的、可食用的或者可克隆的。
        就比如,动物可以吃东西,人类也可以吃东西,但两者时不同的类,有本质的区别,但吃东西是都会进行的行为,这是就可以把吃东西定义为一个接口,而人类和动物都是抽象类。生活中的USB就可以看作一个接口。

        定义接口的关键字是interface,实现接口的关键字是 implements。

//定义一个接口
interface Demo {
    void method1();
    void method2();
}

注意:

        1、接口中的所有方法都是public,抽象方法。一个类可以实现一个或者多个接口。

        2、不能使用new操作符实例化一个接口, 而且在接口中所列的所有方法必须在别处被重写。

        3、接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。

        4、在实现多接口的时候一定要避免方法名的重复。

实例:

interface Animal {//定义一个接口
     void eat();  
}

class Cat implements Animal{//引用接口

    public void eat(){

        System.out.println("我吃鱼");
    }
}

class Dog implements Animal{//引用接口

    public void eat(){

        System.out.println("我吃骨头");
    }

    public void run(){
        System.out.println("我会跑");
    }
}

public class book {//实现

    public static void main(String[] args) {

        Animal cat = new Cat(); 
        Animal dog = new Dog();     
        cat.eat();
        dog.eat();
    }
}
//我吃鱼
//我吃骨头

抽象类和接口的区别

接口和抽象类很像,它们都具有如下特征。

  • 接口和抽象类都不能被实例化,主要用于被其他类实现和继承。
  • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

接口是对动作的抽象,抽象类是对本质的抽象。

抽象类接口
实现子类使用 extends 关键字来继承抽象类,如果子类不是抽象类,则需要提供抽象类中所有声明的方法的实现。子类使用 implements 关键字来实现接口,需要提供接口中所有声明的方法的实现。
访问修饰符可以用 public、protected 和 default 修饰默认修饰符是 public,不能使用其它修饰符
方法无限制可以包含public的抽象实例方法。静态方法以及默认方法
变量无限制所有变量必须是public static final
构造方法抽象类里的构造方法并不是用于创建对象,而是让其子类调用这些构造方法来完成属于抽象类的初始化操作没有构造方法

Java只允许为类的继承做单一继承,但是允许使用接口做多重继承。

接口可以继承其他接口但不能继承类。一个类可以继承它的父类同时实现多个接口。

所有的类共享同一个根类object,但是接口没有共同的根。

使用方向

  • 当你关注一个事物的本质的时候,用抽象类;
  • 当你关注一个操作的时候,用接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值