首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中创建对象(继承和多态性)

在Java中创建对象(继承和多态性)
EN

Stack Overflow用户
提问于 2013-12-07 19:35:09
回答 5查看 310关注 0票数 3

这两种物体创造的区别是:汽车是超类,丰田是子类.

汽车t=新丰田();丰田t=新丰田();

(我相信我们不能这样做:丰田t=新车();.为什么?)

遗传令我困惑,多态也是如此.如能提供任何帮助,将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-12-07 19:37:20

区别在于对象t的类型:在第一种情况下,只有car的方法可用,而在第二种情况下,您也可以得到toyota-specific方法(如果有的话)。

下面是一个示例:

代码语言:javascript
运行
复制
public class car {
    public void drive() {...}
    public void stop() {...}
}
public class toyota extends car {
    public void drive() {... /*toyota-specific code*/}
    public void stop() {... /*toyota-specific code*/}
    public void rollUpWindows() {...}
}

如果你宣布

代码语言:javascript
运行
复制
car c = new toyota();

您可以调用drivestop,但不能调用rollUpWindows。如果你宣布

代码语言:javascript
运行
复制
toyota c = new toyota();

您可以调用所有三种方法。

有一个https://stackoverflow.com/a/384067/335858的一般概念,类似于上面的案例#1。

票数 3
EN

Stack Overflow用户

发布于 2013-12-07 19:42:07

创造是一样的。访问创建的对象的方式不同。让我们使用一个稍微修改过的示例:

代码语言:javascript
运行
复制
Car c = new ();
AutomaticTransmissionCar a = new AutomaticTransmissionCar();
StandardTransmissionCar s = new StandardTransmissionCar();
Car c = new AutomaticTransmissionCar();

a.drive();
s.drive();
c.drive();

想必,用于drive()AutomaticTransmissionCar方法与StandardTransmissionCardrive()方法有很大的不同。这是多态性的关键:当我们调用c.drive()时,car会自动确定要使用的正确的drive()方法。

(请注意,这可能不是最好的设计,只用于说明这里的概念。)

票数 1
EN

Stack Overflow用户

发布于 2013-12-07 19:45:28

让我们从第二个创建开始(这是最简单的):这里您创建了一个丰田对象,在您的整个程序过程中,它将是一个丰田,它将拥有他所有的特定属性和方法,以及它从car继承的受保护的/公共的属性和受保护的/公共的方法。

第一个创造也是有效的,但是多多益善的,缺点是你将无法解决丰田的具体属性和方法,因为它只被宣布为一辆汽车。不管在内心深处是辆丰田车,所以当你这么做的时候

代码语言:javascript
运行
复制
Toyota t2 = (Toyota)t; 

你把它换成了丰田。

第一个创意之所以行得通,是因为丰田也是一辆汽车。相反,它不起作用,因为汽车不总是丰田,它可以是宝马的雷克萨斯,.因为编译器没有明确的方法来说明是什么,所以这是不允许的。

小贴士:如果你画继承树,继承是很容易的。将超类放在顶部,子类放在下面,等等。进位是向下移动,而不是向上移动。

希望这能把它弄清楚一点

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20445655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档