abstract类和接口

来源:互联网 发布:mac 解压缩rar 编辑:程序博客网 时间:2024/05/19 03:46

比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

接口:
属性:public static final
方法:public abstract

为什么接口中不能包含静态方法?
静态方法是不能被子类重写的.
接口中是不能有被实现的方法的,否则它就不是接口而是抽象类
一个类要实现接口中的方法,其实就是对接口方法的重写。而要实现静态方法,就必须重写接口中的静态方法,这和第一点产生冲突。

在子类中,可以定义与父类同名的静态方法,不过并不存在“多态”,严格的说,方法间没有多态就不能称作“覆盖”。所以说,子类的静态方法,并没有覆盖父类的方法。

在子类继承父类时,形构相同(返回值,方法名,参数都相同)的方法会被覆盖。 但这是有前提的,他针对的是实例方法,像static这样的方法就不能被”覆盖“。

根据Java Language Specification 的描述,子类在继承父类时,对于方法而言,存在两种关系:
1.override即覆盖,这是对实例方法(instance method)而言的;子类与父类中形构相同的方法会override父类中的那个方法。

2.hide 即隐藏,这是对类方法(class method)即static方法而言的。如果子类中定义了静态方法,则它会隐藏父类中形构相同的所有方法,但如果隐藏了父类中的实例方法,则会编译报错。

根据上面的规定,“override覆盖”的前提是 实例方法,只有实例方法在继承时才会出现override情况。 如果是static方法,在继承时出现的现象根本就不能用“override”这个词描述,如果static方法在父类和子类中形构一致,则被成为 hide(隐藏)

那什么是隐藏呢?隐藏 :child隐藏了parent的变量和方法,那么,child实例就不能访问parent中被隐藏的变量或者方法,但是,将child实例向上提升转换成parent,可以访问parent中被隐藏的变量或者方法了。 我的理解是被隐藏的东西就是只和类绑定的东西。当子类继承父类,在子类对象中是访问不到父类中的被隐藏的东西的。因为这些东西只和父类绑定了。

在从动态绑定的角度来看看这个覆盖问题,因为static方法是类方法,实现时是静态绑定的(引用“JAVA 核心技术 卷1 第六版”中149页内容“private、static、final”修饰的方法是静态绑定的,所以他们修饰的方法不能实现多态,当然不需要被子类覆盖了(子类覆盖父类方法是为了实现多态)。而其他的方法在运行时动态绑定。 同时,所有的变量也都是静态绑定的。

抽象类:
不管是成员变量,还是非抽象方法都不建议用private修饰,抽象方法是禁止使用private修饰。原因就是我们创建抽象类的目的就是要实现代码复用,方便子类继承,private修饰的是不能继承的,同时抽象类不能实例化对象,所以用private修饰的成员毫无用处。

java1.8实测,抽象类中的抽象方法和非抽象方法在不加修饰符的情况下,都是默认的default

abstract修饰符能放的地方:
一个类若有抽象方法,其本身也必须声明为抽象类;接口中的方法默认就是public abstract;综上所诉:abstract方法必须在abstract类或接口中。

原创粉丝点击