V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Wangjl  ›  全部回复第 3 页 / 共 3 页
回复总数  56
1  2  3  
2019-08-16 15:28:47 +08:00
回复了 Wangjl 创建的主题 Java Java 中, new 对象时,用接口作为接收变量到底有什么好处呢?
@otakustay 哈哈哈,好像是这么回事。
2019-08-16 15:15:13 +08:00
回复了 Wangjl 创建的主题 Java Java 中, new 对象时,用接口作为接收变量到底有什么好处呢?
new 对象时用其接口类型变量来接收,这么做的好处是
1.统一规范
例如:我定义了一个接口,里面有 a、b、c 三个方法
然后别人实现了该接口
如果我用
实现类 对象名 = new 实现类 这种方式 new 对象
此时如果实现类中还定义了 d 方法,就可以通过该对象调用 d 方法
如果此时是多人开发的场景,我们发现实现类 d 方法有问题。然后别人就重写了该实现类,例如删除或修改了 d 方法
此时调用 d 方法的地方,我们全部都需要删除或修改

而如果是用接口作为接收类型创建的对象:
本身该接口就是我们定义的,我们明确知道我这个功能只需要 a、b、c 这三个方法
这时候,你拿去实现。你实现类中还定义了一个 d 方法
但我 new 对象的时候,用接口来接收,这样我就不管你实现类里实现了什么特有方法,我都不关心
我用接口接收,这样就只能调用我接口中定义的 a、b、c 三个方法,这样以后你实现类再改变
我都不需要去改变我的对象的调用
这样做的好处就是,限定只能调用接口中的方法。

不知道我这么理解对不对。
2019-08-16 14:35:30 +08:00
回复了 Wangjl 创建的主题 Java Java 中, new 对象时,用接口作为接收变量到底有什么好处呢?
按照
@lhx2008
@MikeLei
两位的说法,好像是和修改实现类后,不需要修改接口什么的有关。

那么,比如
```
接口类型 变量 = new 实现类 # 这种方式如果我修改了实现了,会有什么方便的地方? 或者说有什么好处
实现类类型 变量 = new 实现类 # 这种如果修改了实现类,会有什么不方便的地方吗?
```

没理解懂。
2019-08-16 14:31:15 +08:00
回复了 Wangjl 创建的主题 Java Java 中, new 对象时,用接口作为接收变量到底有什么好处呢?
感觉还是好绕,没听懂呢。
2019-04-27 10:31:15 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
#include <stdio.h>

void f(char* p)
{
printf("f 函数中 p 指针本身的地址是: %x\n\n", &p);
printf("f 函数中 p 指针里面存放的地址是: %x\n\n", *p);
printf("释放 f 函数中 p 指针里面存放的地址 %x 指向的内存空间\n\n", *p);
delete[] p;
p = new char[20000];

}

int main()
{

for (int i = 0; i < 1000; i++)
{
char *p = new char[2];
printf("外部 p 指针本身的地址是: %x\n\n", &p);
printf("外部 p 指针里面存放的地址是: %x\n\n", *p);
f(p);
printf("释放外部 p 指针里面存放的地址 %x 指向的内存空间\n\n", *p);
delete[] p;

}
getchar();
return 0;
}

以上代码就可以看出原因。
2019-04-27 10:13:52 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
这可能和 vs 有关,我现在又无法重现了,之前 for1000 次都没问题,可昨天晚上,我 for1 次就不行了。 但我做过测试,如果函数内的 p 的本身地址和函数外的 p 的地址一样的话,就不会出问题,我估计我之前那是偶然现象,可能是 vs 的问题。
只要函数内的指针地址和外面的不一样,那一定会挂,因为二次释放。
2019-04-26 18:55:34 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
解决方法就是用双重指针或者引用
2019-04-26 18:27:06 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
@nonkr
@AngryMagikarp
@wutiantong
@bb123
一语道破玄机, 就是这样的。 因为指针传递,相当于值传递,进去的 p 已经不是原来的 p 指针了,而是局部变量的 p,
当在函数中释放一次后,新申请的空间实际上是给了局部变量的 p,而局部变量随着函数的销毁而销毁,因此在外部
再次 delete 的时候,相当于进行了二次 free,所以会出问题。v 站大神真多啊,学到了。
2019-04-26 16:45:03 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
2019-04-26 16:39:55 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
懂了,感谢各位的回复。 这让我这个初学者难了好久,一直想不通。现在经各位指点已经想通了,应该用引用,否则会变成值传递。 造成二次释放。c++真的感觉比其他语言好难啊,坑比较多哦。
2019-04-26 16:30:31 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
搞不懂了,我 vs 里跟踪的时候,发现在 for 循环里的 p 遍历的地址,和 f 函数里,重新分配的地址是一样的。
2019-04-26 16:20:45 +08:00
回复了 Wangjl 创建的主题 C 一段神奇的 C++代码,大家觉得有没有问题?
@wutiantong 为什么呢? 我 p 用的是指针啊,而且我调试的时候,看内存发现确实被释放掉了啊
2018-11-26 14:35:32 +08:00
回复了 Wangjl 创建的主题 Python wxPython 如何捕获 alt+tab 切换窗口事件和 ctrl+c 强制中断事件?
关闭窗口的问题倒是解决了,利用 EVT_CLOSE 这个事件即可。但 alt+tab 切换的问题始终没找到解决办法。各位大侠有思路吗?
2018-11-26 13:14:32 +08:00
回复了 Wangjl 创建的主题 Python wxPython 如何捕获 alt+tab 切换窗口事件和 ctrl+c 强制中断事件?
是我自己弱智了,应该用异常处理哈。我去研究研究。谢谢
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5394 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 25ms · UTC 06:59 · PVG 14:59 · LAX 23:59 · JFK 02:59
Developed with CodeLauncher
♥ Do have faith in what you're doing.