Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的继承概念_Java_Interface_Multiple Inheritance - Fatal编程技术网

java中的继承概念

java中的继承概念,java,interface,multiple-inheritance,Java,Interface,Multiple Inheritance,嗨,我是java新手…从objective c(iphone背景)迁移过来 我们只知道 这里我们不能使用多重继承 另一种方法是接口 我的问题是。。。。。。通过接口进行继承有意义吗……因为我们必须在类中定义函数的代码……这里唯一有帮助的部分是变量。。。 这就像是一个单一的。h类的目标c 我说的只是那个接口的函数…为什么要在那个里声明…只是为了保存2到3行…就是这样 请告诉我为什么没有多重继承(原因很简单…) 我知道这可能是个不好的问题,但是 我有点迷茫,请帮帮我 我喜欢斯蒂芬·施密特的回答。他对此

嗨,我是java新手…从objective c(iphone背景)迁移过来

我们只知道 这里我们不能使用多重继承

另一种方法是接口

我的问题是。。。。。。通过接口进行继承有意义吗……因为我们必须在类中定义函数的代码……这里唯一有帮助的部分是变量。。。 这就像是一个单一的。h类的目标c

我说的只是那个接口的函数…为什么要在那个里声明…只是为了保存2到3行…就是这样

请告诉我为什么没有多重继承(原因很简单…)

我知道这可能是个不好的问题,但是


我有点迷茫,请帮帮我

我喜欢斯蒂芬·施密特的回答。他对此解释得很清楚,
http://codemonkeyism.com/java-interview-questions-mutliple-inheritance/

Java支持多重继承吗? 很明显,Java没有经典意义上的多重继承。所以正确的答案应该是“不”,或者“不,但是”或者“是,但是”。从那里可以探索几种方法。我首先要问的是,Java语言设计人员是否太愚蠢而无法实现多重继承?为什么C++的人会实现它呢?我们主要在钻石反模式着陆,然后: 在具有多重继承和知识组织的面向对象编程语言中,菱形问题是当两个类B和C继承自A,而类D继承自B和C时产生的歧义。如果D中的方法调用A中定义的方法(并且不重写该方法),B和C以不同的方式重写了该方法,那么它从哪个类继承:B还是C

探索的另一种方式是Java如何“模拟”多重继承?答案可能已经浮出水面,是ist接口。然后,我们通常讨论Java中的接口,候选人过去是否、何时以及如何使用这些接口。界面有什么用,他喜欢吗?我可以探索他在建模方面有多出色,有时还可以让他画一个带有界面的图表。我们继续讨论Java中的接口问题,以及当两个接口具有相同的静态字段,而一个类同时实现这两个字段时会发生什么——Java中的某种“多重继承”:

public interface I1 {
   String NAME = "codemonkeyism";
}

public interface I2 {
   String NAME = "stephan";
}

public class C implements I1, I2 {
   public static void main(String[] args) {
      System.out.println(NAME);
   }
}
保持不变,语言设计师认为这在Java中不起作用:

C.java:3: reference to NAME is ambiguous, both variable NAME
              in I1 and variable NAME in I2 match
      System.out.println(NAME);
                         ^
1 error
还有很多方法可以与候选者一起探讨,例如,接口方法的修饰符是什么。对于diamand问题,mixin或traits比接口更好吗?或者它们和多重继承一样糟糕?由于我不再非常喜欢继承,并且认为大多数使用都是一种代码味道,因此也可以与候选者讨论继承的不利方面——例如,thight耦合。 为什么?

为什么我要问这个问题?我从中学到了什么?继承是OO中一个非常基本的概念,每个Java开发人员都应该理解它。反思他的作品并超越对语法的理解也是一个基本特征,因此多重继承问题也就出现了。我更喜欢有很多机会去探索的问题。继承问题就是其中之一:多重继承、语言设计、代码气味、解决方案、接口、基于角色的开发


我想对前面的答案补充一点

正如您从Tilsan给出的深入解释中所理解的,Java不支持多重继承

或者,您应该使用一种委托设计模式。我知道有时候代码看起来比使用多重继承的代码更冗长,但这是我们必须付出的代价

您问了一个问题,为什么需要创建实现多个接口的类?我想问你一个问题,为什么你需要界面?我认为答案是,这允许您将接口(契约)与具体实现分离,使模块独立,简化重新分解,并使程序更加灵活:只有在接口隐藏了具体实现时,您才能切换实现

如果您的类可以在不同的上下文中用作A和B(其中A和B是接口),那么该类应该实现2个接口

示例:假设您有一个只声明一个方法的业务接口Foo

int foo(String str);
现在,您创建了两个实现Foo的类a和B:

public class A implements Foo {
    public int foo(String s) {
        return s.length();
    }
}

public class B implements Foo {
    public int foo(String s) {
        return s.hashCode();
    }
}
现在您要创建Foo的集合:

Collection<Foo> collection = new ArrayList<Foo>();
collection.add(new A());
collection.add(new B());
集合将根据compareTo()中定义的规则进行排序

现在您可能希望序列化A和B的实例。为此,您必须实现另一个可序列化的接口。幸运的是,Serializable是一个不声明任何方法的特殊接口。JVM知道对作为可序列化实例的对象进行序列化和理想化

public class A implements Foo, Comparable<Foo>, Serializable {
    public int foo(String s) {
        return s.length();
    }
    public int compareTo(Foo o) {
        return getClass().getName().compareTo(o.getClass().getName());
    }
}
并将我们的对象存储在文件
/tmp/foo.dat
中。我们可以稍后读取对象


我试图说明为什么我们需要实现几个接口的类:每个接口都为类提供其行为。Compariable允许对此类实例的集合进行排序。可序列化允许序列化等。

赏金?在一个已经被回答的问题上?由给出上述答案的人提供?原因可能是为了引导交通流向这个问题并获得一些选票。
Collections.sort(collection);
public class A implements Foo, Comparable<Foo>, Serializable {
    public int foo(String s) {
        return s.length();
    }
    public int compareTo(Foo o) {
        return getClass().getName().compareTo(o.getClass().getName());
    }
}
DataOutputStream os = new DataOutputStream(new FileOutputStream("/tmp/foo.dat"));
os.writeObject(new A());
os.writeObject(new B());
os.flush();
os.close();