【1.4 多态的应用以及注意事项】
-
在多态中:父类指向子类对象时
成员函数的特点:
编译看左边 运行看右边
在编译时期 参阅引用型变量所属的类中是否有调用的方法 如果有,编译通过;如果没有, 编译失败
在运行时期 参阅对象所属的类中是否有调用的方法
在堆内存中
实例对象:子类包含父类 子类对父类说"你的就是我的 我的还是我的"
成员方法 动态绑定(根据对象的实际类型确定执行哪个方法)
成员变量的特点:
编译看左边 运行看左边
成员变量不具备多态性 通过引用变量来访问其包含的实例变量
当父类 子类出现重名变量的时候 多态状态下看的是 父类
因为在创建子类对象时 堆内存中其实是有两个变量的
一个是父类的num 一个是子类的num
你再拿父类的引用 去找num的时候 他就找到自己的了
成员变量是静态绑定(只根据当前表示类型决定使用那个变量)
成员变量(属性)不算重写 父类中已经有属性了 就不调用子类属性了
静态成员函数
编译看左边 运行看左边 静态绑定 绑定在方法所属的类上了
总结:*****
成员方法 编译看左边 运行看右边
成员变量 编译看左边 运行看左边
静态成员方法 编译看左边 运行看左边
-
package Day11;
public class Test_05 {
public static void main(String[] args) {
MainBoard mb = new MainBoard();
mb.run();
// mb.useNetCard( );
// mb.useSoundCard( );
mb.useNetCard(new NetCard());//没必要创建引用了
mb.useSoundCard(new soundCard());
}
}
interface PCI {
public void open();
public void close();
}
class NetCard implements PCI {
public void open() {
System.out.println("启动网卡");
}
public void close() {
System.out.println("关闭网卡");
}
}
class soundCard implements PCI {
public void open() {
System.out.println("关闭声卡");
}
public void close() {
System.out.println("关闭声卡");
}
}
class MainBoard {
public void run() {
System.out.println("启动主板");
}
public void useNetCard(NetCard n) {//引用子类的方法
n.open();
n.close();
}
public void useSoundCard(soundCard n) {//引用
n.open();
n.close();
}
//接口型引用,指向自己的子类对象,接口不能创建对象,只能用子类
public void usePCI(PCI p) {//PCI p= new NetCard()....
if (p != null) {//如果有什么传入进来就显示什么
p.open();
p.close();
}
}
}
-