java中的抽象与接口

简介

抽象方法中没有方法体,方法体被一个分号代替,是用来让子类重写的方法,所以不能声明为final.必须声明为public或protected,默认情况下是public.

    public abstract void method();//抽象类中的抽象方法.

    void inter();//接口中的抽象方法,默认为public.

抽象类与接口生来就是要被继承与实现的,所以首先它们不能声明为final.

抽象类里面不一定有抽象方法,但是抽象方法所在的类一定是抽象类,如果一个类有抽象方法,那它必须声明为抽象类.抽象类不能被new,也就是不能创建对象,所以如果不想让自己编写的类被创建对象,也可以将其声明为abstract.

public abstract class AnClass {

    public abstract void output();

    abstract void test();

    public void out(){
        System.out.println("抽象类中的非抽象方法");
    }
}

接口就是比抽象类还抽象的类,在JDK1.8之前,接口中的方法不能有方法体,JDK1.8之后,接口中的静态方法与非public方法必须拥有方法体(只有一种情况,就是default,即包访问权限).接口中的方法默认就是public的,若非要加上IDE会提示你没有这个必要,且接口中不允许protected与private方法.接口中的变量默认为常量且必须初始化,加上public final的话IDE会提示你没有必要.与抽象类一样,接口也不能创建对象.

public interface AnInterface {
    String str = "接口中的变量默认是常量.";

    static void setup(){
        System.out.println("接口中的静态方法必须有方法体.");
    }

    default void def(){
        System.out.println("接口中的default方法必须有方法体.");
    }

    void test(); //默认是public方法
}

 一些注意事项

1.接口与接口之间叫做extends,类与接口叫implements,详情可以查看下面抽象类的应用里面摘录的集合框架的源码.

2.抽象类的子类必须实现所有的抽象方法,否则也必须声明为抽象类.

抽象类的应用

我们在查阅集合框架源码的时候,经常会发现一个叫AbstractXxx的类,一般都实现了框架的接口,比如:

public interface Collection<E> extends Iterable<E>
    |
    public abstract class AbstractCollection<E> implements Collection<E> 

public interface Map<K,V>
    |
    public abstract class AbstractMap<K,V> implements Map<K,V>

public interface List<E>
    |
    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>

一般来说这些类实现了一些通用方法, 而且如果想自制一个集合类型比如MyList,比起实现List不如继承AbstractList,因为实现List的话你要写所有的方法,继承AbstractList的话只需要实现所有的抽象方法就可以了.

抽象类主要是用来提供一个模板,一般来说抽象类中都有拥有方法体的方法体,这是共通的部分,而抽象方法就是留给子类自由发挥的平台.比如将一台电脑主机视为抽象类,带有具体实现的方法就是保证主机能正常使用的硬件都有什么,而CPU型号,内存型号,硬盘容量,显卡型号等就是抽象方法:你需要安装它,但是安装什么样的由你自己决定.这个类只提供了主机都有什么,但是只是一个框架,所以不能拿来使用(创建对象).

public abstract class AbstractComputer {
    public void struct(){
        System.out.println("PC应该具有的硬件如下...");
    }
    
    abstract void cpu(String brand, int cores, long frequency);
    abstract void memory(String brand, String type, long size, long frquency);
    abstract void hardDrive(String brand, String type,long size);
    abstract void gpu(String brand, String type);
}

接口的应用

接口跟抽象类相比,主要是突出一部分的细节,比如上面的PC机,每一个硬件都可以抽象为一个接口,如果想拥有一台可以正常使用的PC,就需要实现这些接口:

    public class MyPc implements CPU, Memory, HardDrive, Graphics{}

拿源码来举例,比如I/O流框架的顶层类:InputStream,OutputStream;Reader,Writer都实现了若干接口:

public abstract class InputStream implements Closeable

public abstract class OutputStream implements Closeable, Flushable

public abstract class Reader implements Readable, Closeable

public abstract class Writer implements Appendable, Closeable, Flushable

通过实现的接口我们可以了解每一个类具体都实现了什么功能与特性,比如四个类都具有Closeable(可以关闭)的特性,OutputStream与Writer都具有Flushable(可刷写)的功能等等等.

接口可以多实现,所以如果想让你的类具有更多功能,就可以实现可用的接口,比如想要让你的类可以序列化就实现Serializeable接口,想让你的类可以被克隆就实现Cloneable接口等.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值