Java的接口与抽象类

一、接口

接口:用来描述类应该做什么,而不指定它们应该怎么做。一个类可以实现一个或多个接口,当有些要求符合一些接口时,就可以使用实现了这个接口的类。

接口的特点:

  • Java中,接口不是类,而是对希望符合这个接口的类的一组需求
  • 接口中的所有方法都是public方法,因此,在接口中声明方法时,可以省略public修饰符
  • 接口中的字段都是public static final
  • 不能用new实例化一个接口,但是可以声明一个接口
  • 可以用继承的方式扩展接口
  • 一个类可以同时实现多个接口,多个接口间通过逗号分隔

二、抽象类

抽象类:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类的特点:

  • 抽象类是不能被实例化的,但是它的其他功能和普通类类似,变量、方法等使用方式与普通类一样;
  • 也正是因为抽象类不能被实例化,所以,抽象类只能被继承使用。

废话少说,上代码:

  1. 首先看抽象类的代码,包括一个构造器、两个变量(公有及私有)、一个抽象方法、一个私有方法及两个公有方法。
/**
 * 抽象类(父类)
 */
public abstract class TestAbstract {
    //构造器
    public TestAbstract(){
        System.out.println("TestAbstract()");
    }

    //公有及私有变量
    String testStr1="testStr1";
    private String testStr2="testStr2";

    //抽象方法
    public abstract void testFun1();

    //私有方法
    private void testFun2(){
        System.out.println("testFun2()");
    }

    //获取私有变量
    public void testFun3(){
        System.out.println("testStr2:"+testStr2);
    }

    //调用私有方法
    public void testFun4(){
        testFun2();
    }
}
  1. 再来看子类的代码,包括一个构造器、一个重写父类的方法、一个main方法。
/**
 * 子类(继承抽象类)
 */
class TestAbstractSon extends TestAbstract{
    //构造器
    public TestAbstractSon(){
        System.out.println("TestAbstractSon()");
    }

    //重写父类的方法体
    @Override
    public void testFun1() {
        System.out.println("testFun1()");
    }

    //main方法
    public static void main(String[] args) {
        TestAbstractSon testAbstractSon=new TestAbstractSon();
        System.out.println("testStr1: "+testAbstractSon.testStr1);
//        System.out.println(testAbstractSon.testStr2);//父类的私有变量不能直接使用
        testAbstractSon.testFun1();
//        testAbstractSon.testFun2();//父类的私有方法不能直接使用
        testAbstractSon.testFun3();
        testAbstractSon.testFun4();
    }
}
  1. 结果展示如下,由结果可以看出,在实例化对象之前,子类会先去调用父类的构造器,然后再调用本类的构造器。
TestAbstract()//在实例化之前,先调用父类构造器
TestAbstractSon()//在实例化时,调用本类的构造器
testStr1: testStr1
testFun1()
testStr2:testStr2
testFun2()

抽象类虽然不能被实例化,但是它还是有构造器的,那么它为什么还会有构造器呢?这是因为子类只能访问自己的成员,而不能访问父类中的成员。只有父类的构造器才有权限来对自己的成员进行初始化。因此,必须让所有的构造器都得到调用,否则就不能正确构造出完整对象。

值得注意的是,如果一个子类继承了抽象类,那么子类就必须实现父类中所有的抽象方法,如果不这样做,那么子类也是抽象类,编译器会强制我们用abstract关键字来修饰这个类。


三、抽象类和接口的区别

  1. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;
  2. 抽象类中的方法可以有方法体,但是接口中的方法不能有方法体;
  3. 接口中不能含有静态代码块以及静态方法(JDK 1.8 以后,接口里可以有静态方法和方法体),而抽象类中可以有静态代码块和静态方法;
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值