A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© straw 中级黑马   /  2013-7-31 23:29  /  9394 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中一个类只能继承一个父类,一个父类可以被多个子类继承。这个大家皆知的问题,可是本人就点迷惑了,因为java中任何一个类都会继承Object根类
按照一个类只能继承一个父类的原则那就等于任何类都不能再继承任何父类了吗?可实际上不是这样!
本人疑惑这个原则是错的!应该改成java中一个类出除了继承了Object根类以外最多还能继承一个父类。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

11 个回复

倒序浏览
简直是扯谈,谁跟你说所有类都继承OBJECT?那是间接继承的,只能有一个类那是直接父类。

评分

参与人数 1黑马币 +3 收起 理由
神之梦 + 3 猫儿抢沙发的速度不错啊

查看全部评分

回复 使用道具 举报
肥猫 发表于 2013-7-31 23:47
简直是扯谈,谁跟你说所有类都继承OBJECT?那是间接继承的,只能有一个类那是直接父类。 ...

能举例那个不继承Object的类名吗?
回复 使用道具 举报
straw 发表于 2013-7-31 23:57
能举例那个不继承Object的类名吗?

枚举类.
回复 使用道具 举报
本帖最后由 xuaner0719 于 2013-8-1 23:45 编辑

java支持多继承应该这样回答。
类与类之间,不支持多继承
接口,支持多继承

评分

参与人数 1黑马币 +3 收起 理由
神之梦 + 3 赞一个!

查看全部评分

回复 使用道具 举报
毕老师的基础教程里面不是有一个关于Object类的equals方法的视频吗可以看下,我是这样理解的别的类可以继承使用Object类里面的方法
//package com.DuoTaiDemo;
/*
  Object
是所有对象的直接或者间接的父类
该类定义的是所有对象都具备的功能
Object 类中已经提供了对对象是否相同的比较方法equals
如果自定义类中也有比较相同的功能,没有必要重新定义,
只要沿袭丰父类中的功能,建立自己特有的比较内容即可,这就是覆盖
*/
class Demo
{
        private int num;
        Demo(int num)
        {
                this.num=num;
        }
        /*public boolean compare(Demo d)
        {
                return this.num==d.num;
        }*/
        public boolean equals(Object obj)//Object obj=new Demo();
        {
                if(!(obj instanceof Demo))//用于判断要比较的类型是否一样
                        return false;
                //return this.num==obj.num;
                //这样不可以的因为Object中没有定义num我们把Object强制转换成Demo类型               
                Demo d=(Demo)obj;
                return this.num==d.num;
        }
        public String toString()
        {
                return "demo:"+num;
        }
}
class Person
{}
public class ObjectDemo
{
        public static void main(String[] args)
        {
                Demo d1=new Demo(4);
                Demo d2=new Demo(5);
                Person p=new Person();
                System.out.println(d1.equals(d2));
                System.out.println(d1.equals(p));//Demo类型的d1和Person类型的p进行比较
                System.out.println(d1.toString());//d1.toString()把d1对象转换成字符串
                System.out.println(d1.hashCode());//d1.hashCode()d1对象的哈希值
        }

}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java是单继承的,意味着一个类只能从另一个类继承,被继承的类叫做父类(也叫做基类,base class),继承的类叫做子类。你说的是属于间接继承,就像人只能有一个父亲,但是父亲也得有父亲阿。object就可以当做是人类始祖。

评分

参与人数 1黑马币 +3 收起 理由
神之梦 + 3 赞一个!

查看全部评分

回复 使用道具 举报
额,如果是类的话,如果你不直接写继承语句的话,默认继承Object,如果你写了的,就继承你写的类,还是只继承一个类,新人,不知道对不对

评分

参与人数 1黑马币 +3 收起 理由
神之梦 + 3 赞一个!

查看全部评分

回复 使用道具 举报

问这种低级的问题,是因为我对继承这个概念模糊了.常在网上看到"一个类只能有一个父类"的帖子,可能网友也是想说一个类只能有一个直接父类,但
被我理解错了.关于继承问题,普通类只有单继承,而要实现多继承的话只有接口才可以实现.
关于不是所有java类都继承根类Object的问题,哥们你说错了,不是枚举.关于java类可分为普通另类抽象类接口注解枚举,但不是所有类都会继承Object
超类,比如接口和注解,下面我们用反射来证明这个问题:
  1. //定义一个接口D
  2. public interface D {
  3.         public void show();
  4. }

  5. //定义一个测试方法
  6. public class A implements D{
  7.    public static voidmain(String[] ages){
  8.      //获取A的Class
  9.      Class a=A.class;
  10.      //反射获取接口
  11.      Class[] dClass=a.getInterfaces();
  12.      //获取接口class的全部方法包括父类方法
  13.      Method[] dMethods=dClass[0].getMethods();
  14.      for(Method m:dMethods){
  15.         //遍历接口全部方法包含继承的父类方法
  16.         System.out.println(m.getName());  
  17.      }
  18.    }
  19.    //复写接口D的show方法
  20.    public void show() {
  21.         // TODO Auto-generated method stub       
  22.    }

  23. }
复制代码
执行程序输出  show

很显然接口没有继承Object类,我个人认为接口没有继承Object是因为接口本身不能创建对象也没有实现方法的功能,接口中方法的实现都是由实现类来实现的,
所以继承非接口类在接口中是没有意义的,所以接口没有继承Object类.
然而由于注解本身也是一种接口,注解中的属性相当于接口中的方法,获取属性值也是通过Method对象的getDefaultValue()来得到的.所以注解和接口一样没有
继承Object.不仅如此,注解也没有继承和实现接口的概念.

那么枚举有没有继承Object类呢?
下面我通过反射来获取枚举类的Class来说明情况:
  1. //定义一个枚举C
  2. public enum C{
  3.         //定义一个属性
  4.         num;
  5.         public static void main(String[] ages){
  6.                 //获取枚举的字节码对象
  7.                 Class c=C.class;
  8.                 //返回未知类型枚举数组
  9.                 Object[] objs=c.getEnumConstants();
  10.                 //只有一个枚举
  11.                 Class cEnum=objs[0].getClass();
  12.                 //返回枚举全部方法,包含继承的方法
  13.                 Method[] ms=cEnum.getMethods();
  14.                 for(Method m:ms){
  15.                         //遍历全部方法
  16.                         System.out.println(m);
  17.                 }
  18.         }
  19. }
复制代码
输出结果:
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类.

这是本人简单对提问的问题做从新学习之后的梳理.同时也是对提出这个傻瓜式的问题进行反省,希望没有耽误大家宝贵的时间.谢谢!
回复 使用道具 举报
java只支持单继承,不过可以多实现。(此处的继承说的是直接继承)
上面你说的“所有的类都集成继承Object类”中的继承是间接集成,不是直接继承,相当于当前类的爷爷、太爷等等(Object类可能是当前类父类的父类的....父类)
而直接集成只能集成一个相当于爸爸,爸爸当然只会有一个了!
回复 使用道具 举报
java和C有个改版就是不可以多继承,
但是在很多时候就会还需要用到,
因此引用实现接口,其实也是变相的多继承
   Object
是所有对象的直接或者间接的父类
该类定义的是所有对象都具备的功能
Object 类中已经提供了对对象是否相同的比较方法equals
如果自定义类中也有比较相同的功能,没有必要重新定义,
只要沿袭丰父类中的功能,建立自己特有的比较内容即可,这就是覆盖
回复 使用道具 举报
straw 中级黑马 2013-8-18 14:37:19
12#
封号了... 发表于 2013-8-7 19:13
java只支持单继承,不过可以多实现。(此处的继承说的是直接继承)
上面你说的“所有的类都集成继承Object ...

你的帖子很幽默
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马