今天的单元开卷考试结束时,我被问到了这个问题,结果发现自己迷路了。我正在阅读Head first Java
,这两个定义似乎完全相同。我只是想知道我自己的主观差异是什么。我知道有很多与此类似的问题,但是我没有看到能提供明确答案的问题。
今天的单元开卷考试结束时,我被问到了这个问题,结果发现自己迷路了。我正在阅读Head first Java
,这两个定义似乎完全相同。我只是想知道我自己的主观差异是什么。我知道有很多与此类似的问题,但是我没有看到能提供明确答案的问题。
Answers:
继承是指“类”源自现有的“类”。所以,如果你有一个Person
类,那么你有一个Student
扩展类Person
,Student
继承了所有的事情Person
了。您在“个人”中的字段/方法上放置的访问修饰符有一些详细信息,但这是基本思想。例如,如果您在上有一个私有字段Person
,Student
则不会看到它,因为它的私有字段和私有字段对子类不可见。
多态性处理程序如何决定其应使用的方法,具体取决于程序具有的类型。如果您有一个Person
,其中有一个read
方法,并且您有一个Student
扩展Person
,有其自己的实现read
,则由运行时为您确定要调用的方法,这取决于您有一个Person
还是一个Student
。这有点棘手,但是如果您执行类似的操作
Person p = new Student();
p.read();
学生的read方法被调用。多数民众赞成在行动。您可以进行分配,因为a Student
是a Person
,但是运行时足够聪明,可以知道a的实际类型p
是Student。
请注意,语言之间的细节有所不同。例如,您可以在javascript中进行继承,但是它与Java中的工作方式完全不同。
Person
的read
方法使用公共访问修饰符,Student
对象将无法访问它们吗?然后Student s = new Student();
会不会更容易?实际上,我仍然还没有真正从多残症中受益。
Person p = new Student();
而不是Student p = new Student();
?
继承是指在子类中使用超类的结构和行为。
多态性是指更改子类中超类的行为。
m
(static
和instance
)”(后接有关继承的详细信息)。在我看来,这听起来像是“代码重用”。
import static
了消除接口误用的方法。)对于Java中的纯多态性,使用的工具是接口,而不是类继承。
多态性:以类似方式处理不同类型对象的能力。示例:长颈鹿和鳄鱼都是动物,而动物可以Move
。如果您有an的实例,Animal
则可以在Move
不知道或不关心它是哪种动物的情况下打电话。
继承:这是同时实现多态和代码重用的一种方法。
其他形式的多态性:还有其他实现多态性的方式,例如接口,仅提供多态性,而没有代码重用(有时代码有很大不同,例如Move
Snake与Move
与Dog,在这种情况下在这种情况下,接口将是更好的多态选择。
在其他动态语言中,可以通过Duck Typing实现多态,这是这些类甚至不需要共享相同的基类或接口,它们只需要一个具有相同名称的方法即可。甚至像Javascript一样更具动态性,您甚至根本不需要类,只需使用具有相同方法名称的对象即可进行多态使用。
在Java中,两者密切相关。这是因为Java使用一种称为“动态调度”的方法进行技术调用。如果我有
public class A {
public void draw() { ... }
public void spin() { ... }
}
public class B extends A {
public void draw() { ... }
public void bad() { ... }
}
...
A testObject = new B();
testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A
然后,我们看到B继承spin
自A。但是,当我们尝试像对待对象是A类型那样操作对象时,仍然会得到B的行为draw
。该draw
行为是多态的。
在某些语言中,多态性和继承关系不那么紧密。例如,在C ++中,未声明为virtual的函数是继承的,但不会动态分派,因此即使使用继承,也不会获得该多态行为。
在javascript中,每个函数调用都是动态分派的,并且您的输入类型很弱。这意味着您可能有一堆不相关的对象,每个对象都有自己的对象,draw
有一个对它们进行迭代的函数并调用该函数,并且每个对象的行为都很好。您将拥有自己的多态绘制而无需继承。
多态性:假设您在一家销售笔的公司工作。因此,您创建了一个非常好的类,称为“笔”,该类处理了您需要了解的有关笔的所有信息。您可以使用Pen类编写用于计费,运输,创建发票的各种类。一天,老板来了,说道:“好消息!公司正在成长,我们现在正在出售书籍和CD!” 这不是一个好消息,因为现在您必须更改每个使用Pen的班级,同时还要使用Book&CD。但是,如果您最初创建了一个名为“ SellableProduct”的接口,而Pen则实现了该接口,该怎么办。然后,您可能已经编写了所有运输,发票等类,以使用该接口而不是Pen。现在,您要做的就是创建一个名为Book&CompactDisc的新类,该类实现了SellableProduct接口。由于多态性,所有其他类都可以继续工作而无需更改!合理?
因此,这意味着使用继承是实现多态的一种方法。
多态可以在类/接口中实现,但继承总是在2个或更多类/接口之间。继承始终符合“ is-a”关系,而并非总是具有多态性(多态性可以同时满足“ is-a” /“ has-a”关系。
如果您使用JAVA,就这么简单:
多态使用的是继承的方法,但是“覆盖”它们可以做一些不同的事情(或者,如果您调用super,则它们是相同的,因此从技术上讲不会是多态的)。
如我错了请纠正我。
继承是一种多态性,实际上继承是动态多态性。因此,当您删除继承时,就无法覆盖。
使用继承,实现是在超类中定义的-因此行为是继承的。
class Animal
{
double location;
void move(double newLocation)
{
location = newLocation;
}
}
class Dog extends Animal;
使用Polymorphism,实现是在子类中定义的-因此仅继承了接口。
interface Animal
{
void move(double newLocation);
}
class Dog implements Animal
{
double location;
void move(double newLocation)
{
location = newLocation;
}
}
多态性是通过实现继承在Java
。
├── Animal
└── (instances)
├── Cat
├── Hamster
├── Lion
└── Moose
├── interface-for-diet
│ ├── Carnivore
│ └── Herbivore
├── interface-for-habitat
│ ├── Pet
│ └── Wild
public class Animal {
void breath() {
};
}
public interface Carnivore {
void loveMeat();
}
public interface Herbivore {
void loveGreens();
}
public interface Pet {
void liveInside();
}
public interface Wild {
void liveOutside();
}
public class Hamster extends Animal implements Herbivore, Pet {
@Override
public void liveInside() {
System.out.println("I live in a cage and my neighbor is a Gerbil");
}
@Override
public void loveGreens() {
System.out.println("I eat Carrots, Grapes, Tomatoes, and More");
}
}
public class Cat extends Animal implements Carnivore, Pet {
@Override
public void liveInside() {
System.out.println("I live in a cage and my neighbr is a Gerbil");
}
@Override
public void loveMeat() {
System.out.println("I eat Tuna, Chicken, and More");
}
}
public class Moose extends Animal implements Herbivore, Wild {
@Override
public void liveOutside() {
System.out.println("I live in the forest");
}
@Override
public void loveGreens() {
System.out.println("I eat grass");
}
}
public class Lion extends Animal implements Carnivore, Wild {
@Override
public void liveOutside() {
System.out.println("I live in the forest");
}
@Override
public void loveMeat() {
System.out.println("I eat Moose");
}
}
Hamster
类继承结构从Animal
,Herbivore
并Pet
表现出多晶型行为主义家养宠物的。
Cat
类继承结构的Animal
,Carnivore
并且Pet
还具有多态行为主义家养宠物的。