java中抽象类和接口区别

抽象类

抽象类前使用abstract关键字修饰,则该类为抽象类
应用场景
在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确的知道这些子类如何实现这些方法。
从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性
作用
限制规定子类必须实现某些方法,但不关注实现细节
规则
1.含有抽象方法的类,一定是抽象类; 抽象类中可以声明成员变量、常量、成员方法、抽象方法,抽象类中不一定要有抽象方法; 抽象类不能被实例化;
2.抽象类可以被继承;
3. 可以通过两种方式获得抽象类对象:父类引用指向子类对象、匿名内部类;
4.子类必须重写抽象父类的所有抽象方法,或者是把子类也定义为抽象类;
5.如果一个类继承的抽象父类还有上级抽象父类,那么子类中需要要重写所有抽象父类的所有抽象方法;
6. 抽象类也可以继承非抽象类,同时继承了父类的所有非私有的属性和方法;

//定义一个抽象类
public abstract class Animal {
    //抽象方法只能进行声明
    public abstract void eat();
    public abstract void sleep();
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("dog吃东西");
    }

    @Override
    public void sleep() {
        System.out.println("dog睡觉");
    }
}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("cat吃东西");
    }

    @Override
    public void sleep() {
        System.out.println("cat睡觉");
    }
}
public class Initail {
    public static void main(String[] args) {

        Animal animalDog=new Dog();
        animalDog.eat();
        animalDog.sleep();
        Animal animalCat=new Cat();
        animalCat.eat();
        animalCat.sleep();
    }
}

对于抽象类的一些简单认知:
什么时候使用抽象类和抽象方法,例如你定义了一个动物类,这个动物类有吃饭和睡觉的方法,但其他具体的动物比如猫狗猪这些动物继承动物类,它们同时也继承了动物类吃饭睡觉的方法,但每个动物的吃饭和睡觉的方式都不同,他们都要进行对其父类方法进行重写,那么父类的方法就要定义为抽象方法,有抽象方法的就要是抽象类,那有些人就会问,我们不把父类的方法定义为抽象方法,只对其进行重写不也一样吗?答案是的,你使用抽象类可以提高代码的维护性,你只需要在抽象父类定义每个子类都会用到的抽象方法,那么在子类继承父类的时候,子类重写父类的抽象方法,方法的具体实现都在子类中进行完成,减少代码量。

接口

  • 接口可以理解为一种特殊的类,由全局常量和公共的抽象方法组成。
  • 接口表示类所要遵守的规范,接口不关心类的具体数据,也不关心类方法中的实现细节,只规定这些类中所必须提供的方法。
  • 接口在定义时,不在使用class关键字,而是使用interface关键字
  • 接口就是用来被继承,被实现的,修饰符一般大都为public,不能使用
    private和Protected修饰接口。
  • 接口中的属性都是常量,你在定义时就算不添加Public static final修饰符,系统也会自动加上。
  • 方法不加修饰符,系统也会自动给你添加上。
    实现接口
    实现接口时需要注意,如果你这个类需要继承一个父类,那么继承父类要写在实现接口的前面:
    修饰符 class 类名 extends 父类名 implement 接口名{
    }
    小代码:
package com.company.test0507;

public class Phone {//老版本的手机
    public  void  mv(){
        System.out.println("打电话");
    }
    public  void  song(){
        System.out.println("发短信");
    }
}

package com.company.test0507;

public interface ListenSong {//注意接口时特殊的抽象类,这里省略了abstract关键字,可以写也可以不写,系统会为你添加上
    void song();//系统会自动为你添加修饰符
}

package com.company.test0507;

public class NewPhone extends Phone implements ListenSong{//新版手机含有老版手机没有的功能比如听歌
    //已经继承了父类中的方法

    @Override
    public void song() {
        System.out.println("使用新版手机进行听歌");
    }
}

package com.company.test0507;

public class Mp4  implements ListenSong{//mp4只能进行听歌
    @Override
    public void song() {
        System.out.println("使用Mp4听歌");
    }
}

package com.company.test0507;

public class Until {
    public static void main(String[] args) {
        ListenSong mp4=new Mp4();
        mp4.song();
        ListenSong newPhone=new NewPhone();
        newPhone.song();
    }
}

可以使用接口去描述连个不同类型的类具有的相同的特征。
接口的另一种实现
与匿名类的结合:
语法的格式:
第一种:
接口名 i=new 接口名(){
public void method(){
//代码执行块
}
};//注意分号结尾
第二种:
new 接口名(){
public void method(){
//代码执行块
}
}.method();

区别

接口是一种特殊的抽象类,抽象类描述的是类的本质,接口描述的是不同类型的类的共有特征,抽象类解决了子类继承父类的随意性,接口解决了单继承的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值