Cat c = new Cat();
Pet p = new Cat();
其中Pet是接口,Cat是实现了Pet接口的类。
以上两者在实现类功能上有什麽不同?
JAVA 接口问题
答案:6 悬赏:20 手机版
解决时间 2021-04-11 10:41
- 提问者网友:無理詩人
- 2021-04-10 12:35
最佳答案
- 五星知识达人网友:街头电车
- 2021-04-10 13:03
设Pet为接口,有一个接口方法: speak()//说话发声
类Cat 类Dog 都实现该Pet接口
静态类PetManager为宠物管理类。它有方法 public static Pet getPet(参数:声音类型){},访方法能生成(制造出)一个Dog或者Cat
其中Cat 对speak的实现为: public void speak(){ “喵一声”}
其中Dog 对speak的实现为: public void speak()(“汪一声”)
有个客户它想听一声猫叫,那么该客户就可以Cat c = new Cat(); c.speak();
有个客户它想听一声狗叫,那么该客户就可以 Dog d=new Dog(); d.speak();
可是很多情况下客户只想听个宠物叫一声,不管它是猫还是狗,只要能解解闷就行,那么就可以 :
Pet p; p= PetMager.getPet(); p.speak();
这时候前面的Cat c 和Dog d 就都不行了。因为 cat不能叫汪一声, dog不能叫喵一声; 随着时间变化,客户可能还想听牛叫,马叫,猪叫....
这个时候如果用写死的那个Cat 或Dog 客户端的代码就无法表现了。 如果要实现,就必须升级客户端的代码,如果这种产品己经卖了几千万份出去,那就会有几千万人排队来厂家门口升级他们的产品。
我们需要做到尽量让客户手上的产品少升级以方便用户。所以,我们不要太具体地指定 : Pet p;
至于p从哪里来,我们可以从公司的营销模式逻辑来调整,也就是getPet()方法。
以后,客户想听更多的声音,只要公司内部进行调整,把新产品加到目录就可以了。客户端不需做任何改变;客户想听什么声音都可以;
现在来实现PetManager的getPet():
public static Pet getPet(参数:声音类型){
if 猫: return new Cat();
if 狗: return new Dog();
if 猪: return new pig();
if 牛: .....
..............
}
在这种情况下 getPet()称之为Pet实例的工厂方法!它是工厂,由它来生产Pet。程序逻辑根据客户的需求来产生具体的宠物实例。客户不需要关心这个宠物到底是怎么产生的。
这样的程序称之为对客户透明性;
我们如果对工厂再进行一些高级拓展就可以向20多种设计模式发展,如抽象工厂、工厂的工厂等等....
现在总结: 在现实生活中,客户的需求是变化的,不确定的,所以我们需要灵活的机制来满足客户的需要。客户今天可能想要猫,明天可能想要狗,或者他只是想随便找个宠物来玩一玩。所以我们不能把写死了就是猫,改天他想要狗了我们只需把getPet方法里的逻辑改改就行了,而不需要去改客户的需求
接口和抽像类是java面向对象的精华部分,一定要弄明白!否则java就白学了!
而且在编程时尽量做到以下原则:
1。面向抽像编程,少用具体;
2。多用类的接口编程,少用类的继承! 大陆的书把类的继承讲很大的篇幅,给人一种很深的误解,可能认为继承是最重要的;
另外再讲一个例子:
1。假设电影是一个接口(电影是抽象的名词);
2。客户想看最新的电影(需要一个具体的电影名)
3.《色戒》,《赤壁》是具体的影片,实现了电影这个接口,都可以被影院放出来;
4。电影院的服务宗旨是:放影片(抽象)!绝不能说成宗旨是放《色戒》(具体)否则下次电影院就放不出赤壁了也没有客户愿意来看电影了。
类Cat 类Dog 都实现该Pet接口
静态类PetManager为宠物管理类。它有方法 public static Pet getPet(参数:声音类型){},访方法能生成(制造出)一个Dog或者Cat
其中Cat 对speak的实现为: public void speak(){ “喵一声”}
其中Dog 对speak的实现为: public void speak()(“汪一声”)
有个客户它想听一声猫叫,那么该客户就可以Cat c = new Cat(); c.speak();
有个客户它想听一声狗叫,那么该客户就可以 Dog d=new Dog(); d.speak();
可是很多情况下客户只想听个宠物叫一声,不管它是猫还是狗,只要能解解闷就行,那么就可以 :
Pet p; p= PetMager.getPet(); p.speak();
这时候前面的Cat c 和Dog d 就都不行了。因为 cat不能叫汪一声, dog不能叫喵一声; 随着时间变化,客户可能还想听牛叫,马叫,猪叫....
这个时候如果用写死的那个Cat 或Dog 客户端的代码就无法表现了。 如果要实现,就必须升级客户端的代码,如果这种产品己经卖了几千万份出去,那就会有几千万人排队来厂家门口升级他们的产品。
我们需要做到尽量让客户手上的产品少升级以方便用户。所以,我们不要太具体地指定 : Pet p;
至于p从哪里来,我们可以从公司的营销模式逻辑来调整,也就是getPet()方法。
以后,客户想听更多的声音,只要公司内部进行调整,把新产品加到目录就可以了。客户端不需做任何改变;客户想听什么声音都可以;
现在来实现PetManager的getPet():
public static Pet getPet(参数:声音类型){
if 猫: return new Cat();
if 狗: return new Dog();
if 猪: return new pig();
if 牛: .....
..............
}
在这种情况下 getPet()称之为Pet实例的工厂方法!它是工厂,由它来生产Pet。程序逻辑根据客户的需求来产生具体的宠物实例。客户不需要关心这个宠物到底是怎么产生的。
这样的程序称之为对客户透明性;
我们如果对工厂再进行一些高级拓展就可以向20多种设计模式发展,如抽象工厂、工厂的工厂等等....
现在总结: 在现实生活中,客户的需求是变化的,不确定的,所以我们需要灵活的机制来满足客户的需要。客户今天可能想要猫,明天可能想要狗,或者他只是想随便找个宠物来玩一玩。所以我们不能把写死了就是猫,改天他想要狗了我们只需把getPet方法里的逻辑改改就行了,而不需要去改客户的需求
接口和抽像类是java面向对象的精华部分,一定要弄明白!否则java就白学了!
而且在编程时尽量做到以下原则:
1。面向抽像编程,少用具体;
2。多用类的接口编程,少用类的继承! 大陆的书把类的继承讲很大的篇幅,给人一种很深的误解,可能认为继承是最重要的;
另外再讲一个例子:
1。假设电影是一个接口(电影是抽象的名词);
2。客户想看最新的电影(需要一个具体的电影名)
3.《色戒》,《赤壁》是具体的影片,实现了电影这个接口,都可以被影院放出来;
4。电影院的服务宗旨是:放影片(抽象)!绝不能说成宗旨是放《色戒》(具体)否则下次电影院就放不出赤壁了也没有客户愿意来看电影了。
全部回答
- 1楼网友:你可爱的野爹
- 2021-04-10 16:46
不同在于看待问题的视角,
就像你在你母亲面前是个乖孩子(接口),在老婆面前是好老公(接口)一样,其实只有一个你(实际对象),那是你的本质。
- 2楼网友:躲不过心动
- 2021-04-10 15:32
第一个语句就是一般的创建一个对象
第二个语句是利用对象的上转型对象,就是所谓的接口回调,就是把实现接口的类所创建的对象赋值给接口的对象,让其去调用类中的方法,完成相应的功能
- 3楼网友:青尢
- 2021-04-10 14:49
Pet p = new Cat();
其实是生成了一个Cat类的对象(无名对象),然后将该对象的引用赋给了p.
然后当p调用被Cat类实现的方法时,
其实是通知该Cat类的对象(无名对象)调用Cat类中实现的方法.
故,两者没有区别,最终实行方法的还是一个Cat类的对象. 硬要说的话,就是接口回调时多了个通知实现类的对象的过程吧.
以上,个人理解..
- 4楼网友:底特律间谍
- 2021-04-10 14:20
当你保证你的Cat类里的方法在以后的应用过程中永远不发生变化的话,那么用接口还是用具体类都可以。
用接口的好处就是,当你以后Cat类里的方法要改变的时候,你调到的方法永远符合你现在Pet接口的规范。
就像你加入现在用List l = new ArrayList();一样,以后你要是打算不用ArrayList了而换成LinkedList了,如果你不用接口的话就出问题了。
- 5楼网友:有你哪都是故乡
- 2021-04-10 14:00
public int a(int a)
{
return a*10;
}
把方法声明为public就行了
这是java规定的, 实现接口的方法只能声明为public
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯