一个关于接口的问题,想不通,代码帝进来讲解下~ 本帖最后由 Amo860129 于 2011-11-17 04:04:23 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是在Application 里传了实参了么 this.plugin=p; p.tranferString("the String from father");执行到这两句了呗 典型的多态原理:根据多态性,Mainapp本质就是Plugin的子类,而Application的构造函数的参数是父类Plugin,因为你在main函数里有这么一句new Application(new Mainapp());即用了子类Mainapp来实例化了Application构造函数的参数,根据多态性原理可知,当执行Application构造函数中的p.tranferString("the String from father")时,此时p这个引用会在运行时指向plugin的子类Mainapp,,进而也就调用了子类Mainapp的tranferString方法。其实关于接口,可以完全理解为一个类,一个抽象父类,所以它也遵从多态性原理。 确实没看出问题在哪里。Mainapp实现了Plugin接口,属于此接口的子类。new了一个Application对象直接把Mainapp的实例传了进去,调用了Application类中带参的构造函数,构造函数中把传进来的Mainapp实例赋给了Application类的私有成员plugin,然后打印了这句话 public Application(Plugin p){ this.plugin=p; p.tranferString("the String from father");}}这里不是调用了p.tranferString("the String from father");当然会打印啦 告诉你一个很实用的办法,你在ECLIPSE中,点击你实现类Mainapp中的方法或参数,自动会跳转到其他地方。这样你就真正了解了调用层次。其实就是传了参数的了。 new Application(new Mainapp());你在new Mainpp的时候已经生成了一个对象然后传到Application里面去了,传给了Plugin,就等于是Mainpp对象向上转型了,因为你的Mainpp实现了Plugin接口因此你用Plugin的对象p调用的话就实际是Mainpp的对象在调用这就是运行时类型,也就是后期绑定,根据你不同的向上转型前的对象来调用不同的方法,这就是多态 Plugin plugin = new Mainapp(); 父类的引用指向子类的对象。多态,,, 主要就是执行了public Application(Plugin p){ this.plugin=p; p.tranferString("the String from father");}就是给str赋值为"the String from father" 用spring的技术来解释这个就叫"控制反转"也叫"依赖注入", 注入有很多种,楼主所学习的是:使用构造函数进行注入。public static void main(String[] arc){ new Application(new Mainapp());} new Application(new Mainapp());这时就构造了一个w Application实例并且实例化的时候就会调用Application中的构造函数:public Application(Plugin p){ this.plugin=p; p.tranferString("the String from father");}这样,new Application(new Mainapp());中的new Mainapp()这个实例就传给了构造函数的参数p,将p再赋给plugin之后下面那行:p.tranferString("the String from father");其实下面这样写是等效的:this.plugin.tranferString("the String from father");用到的原理: 1:注入(构造注入)深入点说: 把接口的具体实现的类的实例赋给接口对象,这样接口对象就具有了具体的功能。 Deutche is schwer zu verstehen。 还是中文好,大家一讲我就理解多了。。 JCreator的调试问题 请问JTextField跟KeyListener相关问题. HttpClient4.0 的post和get 重载,重写只是多态的体现怎么理解? 给大家推荐一个好东西Java Tutorial 关于java访问数据库的问题 基本上我已写好了一个P2P软件(用JAVA写的) 类似VC里信号量的功能在JAVA里如何实现? tell me Access的表中建的Group字段为什么用sql语句无法修改 协变返回类型 Map类中的Key变值问题
p.tranferString("the String from father");
执行到这两句了呗
即用了子类Mainapp来实例化了Application构造函数的参数,根据多态性原理可知,当执行Application构造函数中的p.tranferString("the String from father")时,此时p这个引用会在运行时指向plugin的子类Mainapp,,进而也就调用了子类Mainapp的tranferString方法。
其实关于接口,可以完全理解为一个类,一个抽象父类,所以它也遵从多态性原理。
Mainapp实现了Plugin接口,属于此接口的子类。new了一个Application对象直接把Mainapp的实例传了进去,调用了Application类中带参的构造函数,构造函数中把传进来的Mainapp实例赋给了Application类的私有成员plugin,然后打印了这句话
this.plugin=p;
p.tranferString("the String from father");
}
}
这里不是调用了p.tranferString("the String from father");当然会打印啦
其实就是传了参数的了。
你在new Mainpp的时候已经生成了一个对象
然后传到Application里面去了,传给了Plugin,就等于是Mainpp对象向上转型了,因为你的Mainpp实现了Plugin接口
因此你用Plugin的对象p调用的话就实际是Mainpp的对象在调用
这就是运行时类型,也就是后期绑定,根据你不同的向上转型前的对象来调用不同的方法,这就是多态
this.plugin=p;
p.tranferString("the String from father");
}
就是给str赋值为"the String from father"
public static void main(String[] arc){
new Application(new Mainapp());
}
new Application(new Mainapp());这时就构造了一个w Application实例
并且实例化的时候就会调用Application中的构造函数:
public Application(Plugin p){
this.plugin=p;
p.tranferString("the String from father");
}
这样,new Application(new Mainapp());中的new Mainapp()这个实例就传给了构造函数的参数p,
将p再赋给plugin之后下面那行:
p.tranferString("the String from father");
其实下面这样写是等效的:
this.plugin.tranferString("the String from father");用到的原理:
1:注入(构造注入)深入点说: 把接口的具体实现的类的实例赋给接口对象,这样接口对象就具有了具体的功能。