VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: xujs0202

小女子初学对象时的小问题~~~!!!

[复制链接]

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-23 21:15:01 | 显示全部楼层
仔细想了一下:

你这句话有问题
b = new de();
这句话有问题
de b = new de();----------------显示de.show
da b = new de();----------------显示ba.show

总结:
关键在于
1.什么引用去"调用"方法
2.什么作为了接口的实现
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-1 01:00:01 | 显示全部楼层
搞对象并不难,呵呵
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-1 10:00:01 | 显示全部楼层
da b = new de();----------------显示ba.show


为什么?
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-1 16:15:02 | 显示全部楼层
其实在子类里用new是在你不知道父类有此方法的情况下用,如果你知道父类有此方法,你如果在子类不想override你大可以取其他名字。
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-2 16:30:01 | 显示全部楼层
da b = new de();----------------显示ba.show


为什么?
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-3-2 17:15:01 | 显示全部楼层
因为de继承了接口 所以
((Iaa)b).show(); // 调用自己de.show

如果
ba b = new de(); //b 仍为基类
b.show(); //调用 基类的 ba.show
((de)b).show(); //才会调用de.show
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-3 09:45:01 | 显示全部楼层
声明的是基类da b 当然首先调用基类的方法啦 不管你是什么运行时类型

da的show方法未声明为abstract或virtual 所以de的show方法与da的show方法没有override关系

((Iaa)b).show();
b的实际类型de继承自Iaa接口,在编译时实现了转换,所以运行时b就是de类型
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-6 14:30:01 | 显示全部楼层
da b = new de();----------------显示ba.show


为什么?

我这样理解:

1.方法是属于类的
2.对象是通过类去访问方法的
3.每个类中存在一张所有方法的引用表+父类的virtual,abstract方法引用表
4.如果在自己的方法表中没有找到方法引用,那么会去到父类中去寻找
5.new的关键字会再子类方法表中创建一个新方法
6.override的关键字会改写父类virtual,abstract方法表使其指向子类中的方法(即使采用父类访问也访问到子类中override的方法)
7.父类对象的引用是可以指向子类对象的,但采用的是父类的方法表

ba b = new de();
我们使用的方法表是ba的方法表,那么找到的方法就是ba中的方法ba.show
同样:
如果ba中virtual show,de中new show() --------------------- ba.show()
如果ba中virtual show,de中override show() -----------------de.show()
如果ba中show,de中new show() ------------------------------ba.show()(我们这种情况)
如果ba中show,de中override show() -------------------------编译不通过

-------------------------------------------思维混乱中,高手指正--------- -_-" ----
回复

使用道具 举报

0

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-3-27 19:00:02 | 显示全部楼层
我理解:因为ba中的show方法没有声明为virtual,所以声明为ba类型的b对象,调用就是自己的show实现。
接口那个必然会调用实现该接口的类的show方法。
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-5-16 14:00:02 | 显示全部楼层
da的show方法声明为abstract或virtual
de的show方法override
这时是调用的show方法是动态的 是运行时类型的方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表