Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
关于oops基本概念的问题_Oop_Interface - Fatal编程技术网

关于oops基本概念的问题

关于oops基本概念的问题,oop,interface,Oop,Interface,我只是想找到这个问题的答案 设A为父类,B、C为子类 现在我们创建如下对象: A o1=新的A; B o2=新的B; C o3=新的C A o4=新的B B o5=新的A; co6=新的B; 所有这些都会产生错误,并说明原因。。我很困惑,因为从6我们知道这是一个错误,因为b可能有一些特殊的变量,7是可能的,8是不可能的 如果我错了,请纠正我 A o7=o4; b08=o5; 请给我正确的答案和解释,并给我此类谜题的教程链接。除了5和6之外,其他都可以。在第二组中,2不起作用,因为5不起作用,也因

我只是想找到这个问题的答案

设A为父类,B、C为子类

现在我们创建如下对象:

A o1=新的A; B o2=新的B; C o3=新的C

A o4=新的B

B o5=新的A; co6=新的B; 所有这些都会产生错误,并说明原因。。我很困惑,因为从6我们知道这是一个错误,因为b可能有一些特殊的变量,7是可能的,8是不可能的

如果我错了,请纠正我

A o7=o4; b08=o5;
请给我正确的答案和解释,并给我此类谜题的教程链接。

除了5和6之外,其他都可以。在第二组中,2不起作用,因为5不起作用,也因为08不是有效的变量名

5不起作用,因为B可能有不属于a的方法,所以新a不会返回与B兼容的对象

通常,您可以执行以下操作:

ChildOne c1 = new ChildOne();
Parent p1 = new ChildOne();
鉴于您不能:

ChildOne c1 = new ChildTwo();
ChildOne p1 = new Parent();

除了5和6之外,所有变量都可以工作。在第二组中,2不能工作,因为5不能工作,也因为08不是有效的变量名

5不起作用,因为B可能有不属于a的方法,所以新a不会返回与B兼容的对象

通常,您可以执行以下操作:

ChildOne c1 = new ChildOne();
Parent p1 = new ChildOne();
鉴于您不能:

ChildOne c1 = new ChildTwo();
ChildOne p1 = new Parent();

假设所有对象都是指针类型-

1. A *o1 = new A();   // Correct
2. B *o2 = new B();   // Correct
3. C *o3 = new C();   // Correct

4. A *o4 = new B(); // A pointer to a derived class is type-compatible with a pointer to its base class. This is up casting which acts by default.
5. B *o5 = new A(); // Wrong because the other-wise relationship of the above comment isn't true. Though there is a separate concept called Down-casting which isn't valid here.
6. C *o6 = new B();  // Wrong : C, B has no hierarchial relationships

7. A *o7 = o4;      // Correct because o4, o7 are both of same type
8. B *o8 = o5;      // Wrong. Since, 5 itself is wrong.
第4条和第5条的说明:

新的B调用A的构造函数,然后调用B的构造函数。因此,我们有类型为A*,B*的子对象。由于存在a*类型的子对象,左值可以指向它,它也等于a*类型的子对象。这有助于访问派生类中基类重写的虚拟方法

new A构造A*类型的对象并返回其地址。因此,返回类型为A*,但接收类型为B*。因此,它们都是不相容的,也是错误的

例如:

})

})

结果:

构造器A

构造器A

构造器B

构造器A

构造器C

析构函数A

析构函数B

析构函数A

析构函数C

析构函数A


请注意,销毁顺序与构造顺序相反。

假设所有对象都是指针类型-

1. A *o1 = new A();   // Correct
2. B *o2 = new B();   // Correct
3. C *o3 = new C();   // Correct

4. A *o4 = new B(); // A pointer to a derived class is type-compatible with a pointer to its base class. This is up casting which acts by default.
5. B *o5 = new A(); // Wrong because the other-wise relationship of the above comment isn't true. Though there is a separate concept called Down-casting which isn't valid here.
6. C *o6 = new B();  // Wrong : C, B has no hierarchial relationships

7. A *o7 = o4;      // Correct because o4, o7 are both of same type
8. B *o8 = o5;      // Wrong. Since, 5 itself is wrong.
第4条和第5条的说明:

新的B调用A的构造函数,然后调用B的构造函数。因此,我们有类型为A*,B*的子对象。由于存在a*类型的子对象,左值可以指向它,它也等于a*类型的子对象。这有助于访问派生类中基类重写的虚拟方法

new A构造A*类型的对象并返回其地址。因此,返回类型为A*,但接收类型为B*。因此,它们都是不相容的,也是错误的

例如:

})

})

结果:

构造器A

构造器A

构造器B

构造器A

构造器C

析构函数A

析构函数B

析构函数A

析构函数C

析构函数A


请注意,破坏的顺序与构造的顺序相反。

这不是对你问题的直接回答,因为我认为其他人已经回答了你的问题。但是,我注意到您似乎有一种错觉,即对象会根据内存分配进行类型检查

它们不需要根据类定义进行检查。让我举一个例子,希望能给大家带来理解:

假设我们有两个在同一命名空间中定义的类,它们具有相同的方法和属性。唯一的区别是它们的类名。就编译器和运行时而言,这两个类没有任何关系

您必须定义另一种OOP方式来关联它们。例如,您可以让两个类继承相同的父类,或者让它们都实现相同的接口

使用接口方法通常是可取的,因为许多没有什么关系的类可以实现接口,以便其他对象可以通过接口方法与它们交互


OOP很难理解,因为它实际上是关于抽象的,与金属编码几乎没有关系。一旦您了解了抽象的用途以及它们是如何一起使用的,事情就会变得简单。祝你好运。

这不是对你问题的直接回答,因为我认为其他人已经回答了你的问题。但是,我注意到您似乎有一种错觉,即对象会根据内存分配进行类型检查

它们不需要根据类定义进行检查。让我举一个例子,希望能给大家带来理解:

假设我们有两个在同一命名空间中定义的类,它们具有相同的方法和属性。唯一的区别是它们的类名。就编译器和运行时而言,这两个类是 r没有任何关系

您必须定义另一种OOP方式来关联它们。例如,您可以让两个类继承相同的父类,或者让它们都实现相同的接口

使用接口方法通常是可取的,因为许多没有什么关系的类可以实现接口,以便其他对象可以通过接口方法与它们交互


OOP很难理解,因为它实际上是关于抽象的,与金属编码几乎没有关系。一旦您了解了抽象的用途以及它们是如何一起使用的,事情就会变得简单。祝你好运。

在你的问题中,正如你提到的

A是超类, B、 C是A的两个不同的子类,即B扩展A,C扩展A

让我们一步一步走

现在,您对不同对象的引用的联想到了第四步。 i、 e

现在在第五步

B o5 = new A();   //Will not compile since a superclass object is assigned to a subclass reference.  
                  //This is not allowed in Java.    
原因:这是因为超类不知道它的子类在继承时添加了哪些特性。因此,将超类对象指定给子类引用是不正确和无效的

现在在第六步

C o6 = new B();  // There isn't any hiearchical relationship between B and C. 
                 // They are just subclass of class A. This won't compile.  
A o7 = o4;      //Correct. Because both the references i.e o4 & o7 are of same type (A).
                // Hence, will compile.  
现在在第七步

C o6 = new B();  // There isn't any hiearchical relationship between B and C. 
                 // They are just subclass of class A. This won't compile.  
A o7 = o4;      //Correct. Because both the references i.e o4 & o7 are of same type (A).
                // Hence, will compile.  
现在在第八步

B 08 = o5;     // It is wrong because the 5th step was itself wrong.  
               // So it will produce a compile time error.

在你的问题中,正如你提到的

A是超类, B、 C是A的两个不同的子类,即B扩展A,C扩展A

让我们一步一步走

现在,您对不同对象的引用的联想到了第四步。 i、 e

现在在第五步

B o5 = new A();   //Will not compile since a superclass object is assigned to a subclass reference.  
                  //This is not allowed in Java.    
原因:这是因为超类不知道它的子类在继承时添加了哪些特性。因此,将超类对象指定给子类引用是不正确和无效的

现在在第六步

C o6 = new B();  // There isn't any hiearchical relationship between B and C. 
                 // They are just subclass of class A. This won't compile.  
A o7 = o4;      //Correct. Because both the references i.e o4 & o7 are of same type (A).
                // Hence, will compile.  
现在在第七步

C o6 = new B();  // There isn't any hiearchical relationship between B and C. 
                 // They are just subclass of class A. This won't compile.  
A o7 = o4;      //Correct. Because both the references i.e o4 & o7 are of same type (A).
                // Hence, will compile.  
现在在第八步

B 08 = o5;     // It is wrong because the 5th step was itself wrong.  
               // So it will produce a compile time error.

这种东西你真的应该在你的本地机器上试用。现在IDE和编译器非常有用。然后,如果你仍然不知道为什么某些东西起作用或不起作用,发布一些细节,SOER会非常乐意提供帮助。这种东西你真的应该在你的本地机器上试用。现在IDE和编译器非常有用。然后,如果你仍然不明白为什么有些东西起作用或不起作用,发布一些细节,SOER会非常乐意提供帮助。嗨,安德鲁,非常感谢你的回复。我只想让你澄清一下。如果ChildOne比Parent中有新的成员变量和方法,那么就不会有内存分配问题。这适用于[code]ChildOne p1=新的父项;[code]也是。我认为专门化的子类可以使用父对象,反之亦然。请澄清。对不起,我不太清楚你在问什么,我想你可能是想说ChildOne没有新会员…。另外,使用backticks`标记代码。我很清楚,父对象可以接受子对象,因为子对象比父对象具有更多的专门化,反之亦然。这是我从你和mahesh的回答中得到的。非常感谢。希望你们能为我提供网站或书籍等资源的链接,在这些资源中,我可以改进我的基础知识,这一直是一个很好的起点,但筛选起来可能会很麻烦。如果你想找一本关于面向对象设计的好书,一定要看看,虽然那肯定不是介绍,也超出了基础。对不起,我现在想不出任何关于OOP的好教程。谢谢你的帮助。。我想在这一点上我现在是肯定的嗨,安德鲁,非常感谢你的回复。我只想让你澄清一下。如果ChildOne比Parent中有新的成员变量和方法,那么就不会有内存分配问题。这适用于[code]ChildOne p1=新的父项;[code]也是。我认为专门化的子类可以使用父对象,反之亦然。请澄清。对不起,我不太清楚你在问什么,我想你可能是想说ChildOne没有新会员…。另外,使用backticks`标记代码。我很清楚,父对象可以接受子对象,因为子对象比父对象具有更多的专门化,反之亦然。这是我从你和mahesh的回答中得到的。非常感谢。希望你们能为我提供网站或书籍等资源的链接,在这些资源中,我可以改进我的基础知识,这一直是一个很好的起点,但筛选起来可能会很麻烦。如果你想找一本关于面向对象设计的好书,一定要看看,虽然那肯定不是介绍,也超出了基础。对不起,我现在想不出任何关于OOP的好教程。谢谢你的帮助。。我想我现在对这一点很确定Hi Mahesh,请不要为这个问题感到难过,它可能也很荒谬。我只是想澄清一下。嗨,马赫什,非常感谢你的帮助。这是我的
理解,由于A分配的内存足以容纳B的内存[A需要基本内存+其自身成员的额外内存],这是可能的,而B*o5=新A的情况并非如此;as B的引用比其需要的内存少。另外,请给我提供更多的细节向下铸造。方法不会占用对象的空间。。这是正确的吗。我真的很感谢你的回答。我想,不要去想那些让你困惑的记忆。考虑一下对象构造的顺序。感谢mahesh的帮助。你能给我一个链接,我可以在网上找到这些东西来提高我的水平吗?我个人更喜欢MSDN教程,尽管它们是微软特有的。嗨,马赫什,请不要为这个问题感到难过,它可能也很荒谬。我只是想澄清一下。嗨,马赫什,非常感谢你的帮助。这是我的理解,因为A分配的内存足以容纳B的内存[需要A的基本内存+自身成员的额外内存],这是可能的,而B*o5=新A的情况并非如此;as B的引用比其需要的内存少。另外,请给我提供更多的细节向下铸造。方法不会占用对象的空间。。这是正确的吗。我真的很感谢你的回答。我想,不要去想那些让你困惑的记忆。考虑一下对象构造的顺序。感谢mahesh的帮助。你能给我一个链接,我可以在网上找到这些东西来提高我的水平吗?我个人更喜欢MSDN教程,尽管它们是微软特有的。