抽象类和接口
抽象类和接口简单对比
(1)抽象类和接口都不能直接实例化。若要实例化,抽象类必须指向实现其所有抽象方法的子类对象。接口变量必须指向实现其所有接口方法的类对象。
【注:即使抽象类里面没有任何抽象方法,也是不能以普通类的实例化手段直接实例化的,如下】
package org.devsong.test;

public class Test {

    public static void main(String[] args) {

        MyAbstractClass absc = new MyAbstractClass() {};  //即使没有抽象方法需要实现,大括号也不能省略
        absc.sayHi();

    }
}

/**
*不包含抽象方法的抽象类
*/
abstract class MyAbstractClass{
    public void sayHi() {
        System.out.println("hi");
    }
}

(2)抽象类里面的抽象方法必须被子类实现,如果不能实现,那么子类只能是抽象类。同样,一个类实现接口的时候,也必须实现其所有的接口方法,否则该类也只能是抽象类。

(3)接口只能作方法声明,不能作方法实现。抽象类可以包含实体方法。

(4)接口内部定义的变量只能是公有的静态常量(final static, 默认限定就是这个,即使省略不写也是这个,比如写 int a = 10;实际上是final static int a = 10)。而抽象类中的变量与普通类一致,即其中定义的变量是普通变量。

(5)抽象类可以没有抽象方法,但即使这样也是不能以普通类的实例化手段直接实例化的(请看第一条)。

(6)一个类如果有抽象方法,那么该类只能是抽象类。

(7)抽象方法是要被子类实现的,所以不能是静态的,也不能是私有的。同样,接口方法也不能是私有的,只能支持关键字public,abstract,default,static, strictfp(strict float point, 精确浮点型)

(8)接口可以继承接口,并且可以多继承接口。而类的继承是能是单继承。
也就是说以下写法是正确的:
package org.devsong.test;

/**
*接口多继承
*那么如果某个类实现InterfaceThree, 其就要实现InterfaceOne\InterfaceTwo\InterfaceThree的所有接口方法
*/
public interface InterfaceThree extends InterfaceOne, InterfaceTwo{

    //interface method
    ... ...
	
}

简单总结一下:
抽象类和接口都是用来抽象具体对象的,但各自又有侧重点。接口主要用来抽象功能,抽象类主要用来抽象类别。接口的抽象级别最高, 因为抽象类可以有自己的实体方法和属性,而接口严格规定不能有方法实现,并且其中定义的量只能是公有静态常量。另外,抽象类的使用还是有很多地方需要考虑的,因为类只能有单继承,一个类继承了一个抽象类就无法再集成其他类,那么这个抽象类如何包含所有子类共有的东西,需要花时间规划。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门