问这种低级的问题,是因为我对继承这个概念模糊了.常在网上看到"一个类只能有一个父类"的帖子,可能网友也是想说一个类只能有一个直接父类,但
被我理解错了.关于继承问题,普通类只有单继承,而要实现多继承的话只有接口才可以实现.
关于不是所有java类都继承根类Object的问题,哥们你说错了,不是枚举.关于java类可分为普通另类抽象类接口注解枚举,但不是所有类都会继承Object
超类,比如接口和注解,下面我们用反射来证明这个问题:- //定义一个接口D
- public interface D {
- public void show();
- }
- //定义一个测试方法
- public class A implements D{
- public static voidmain(String[] ages){
- //获取A的Class
- Class a=A.class;
- //反射获取接口
- Class[] dClass=a.getInterfaces();
- //获取接口class的全部方法包括父类方法
- Method[] dMethods=dClass[0].getMethods();
- for(Method m:dMethods){
- //遍历接口全部方法包含继承的父类方法
- System.out.println(m.getName());
- }
- }
- //复写接口D的show方法
- public void show() {
- // TODO Auto-generated method stub
- }
-
- }
复制代码 执行程序输出 show
很显然接口没有继承Object类,我个人认为接口没有继承Object是因为接口本身不能创建对象也没有实现方法的功能,接口中方法的实现都是由实现类来实现的,
所以继承非接口类在接口中是没有意义的,所以接口没有继承Object类.
然而由于注解本身也是一种接口,注解中的属性相当于接口中的方法,获取属性值也是通过Method对象的getDefaultValue()来得到的.所以注解和接口一样没有
继承Object.不仅如此,注解也没有继承和实现接口的概念.
那么枚举有没有继承Object类呢?
下面我通过反射来获取枚举类的Class来说明情况:- //定义一个枚举C
- public enum C{
- //定义一个属性
- num;
- public static void main(String[] ages){
- //获取枚举的字节码对象
- Class c=C.class;
- //返回未知类型枚举数组
- Object[] objs=c.getEnumConstants();
- //只有一个枚举
- Class cEnum=objs[0].getClass();
- //返回枚举全部方法,包含继承的方法
- Method[] ms=cEnum.getMethods();
- for(Method m:ms){
- //遍历全部方法
- System.out.println(m);
- }
- }
- }
复制代码 输出结果:
public static C C.valueOf(java.lang.String)
public static C[] C.values()
public static void C.main(java.lang.String[])
public final int java.lang.Enum.hashCode()
public final boolean java.lang.Enum.equals(java.lang.Object)
public java.lang.String java.lang.Enum.toString()
public final int java.lang.Enum.compareTo(java.lang.Enum)
public int java.lang.Enum.compareTo(java.lang.Object)
public static java.lang.Enum java.lang.Enum.valueOf(java.lang.Class,java.lang.String)
public final java.lang.Class java.lang.Enum.getDeclaringClass()
public final java.lang.String java.lang.Enum.name()
public final int java.lang.Enum.ordinal()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
从结果中可以看出了,枚举类是继承Object的,而且枚举中可以有继承和实现接口的概念.枚举的出现是为了解决程序在编译之前防止错误的
参数传入而导致程序异常,在没有枚举出现之前我们可以用puplic static final来实现这个功能,但自从jdk1.5之后就出现了枚举,简单来说
枚举就是简化了这个功能实现的一种java类.
这是本人简单对提问的问题做从新学习之后的梳理.同时也是对提出这个傻瓜式的问题进行反省,希望没有耽误大家宝贵的时间.谢谢!
|