java的动态绑定与静态绑定
2016-11-18 13:42
260 查看
静态绑定:
在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定
动态绑定:
在运行时根据具体对象的类型进行绑定。
动态绑定的典型发生在父类和子类的转换声明之下
比如:Parent p = new Children();
总结:
声明的是父类的引用,但是执行过程中调用的是子类的对象,程序先寻找子类对象的method方法,但是没有找到,于是向上转型去父类寻找。
但是子类的对象调用的是父类的成员变量。 所以必须明确,运行时绑定,针对的只是对象的方法。 如果试图调用子类的成员变量name,该怎么做? 最简单的就是将该成员变量封装成方法getter形式
example1:
输出:
父类方法,对象类型:class test.Son.
example2:
输出:
子类方法,对象类型:class test.Son1
example3:
输出:
调用的成员:父亲属性
子类方法,对象类型:class test1.Son
example4:
输出:
调用的成员:儿子属性
在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定
动态绑定:
在运行时根据具体对象的类型进行绑定。
动态绑定的典型发生在父类和子类的转换声明之下
比如:Parent p = new Children();
总结:
声明的是父类的引用,但是执行过程中调用的是子类的对象,程序先寻找子类对象的method方法,但是没有找到,于是向上转型去父类寻找。
但是子类的对象调用的是父类的成员变量。 所以必须明确,运行时绑定,针对的只是对象的方法。 如果试图调用子类的成员变量name,该怎么做? 最简单的就是将该成员变量封装成方法getter形式
example1:
package test; public class Father { public void method(){ System.out.println("父类方法,对象类型:"+this.getClass()+"."); } }
package test; /** * 声明的是父类的引用,但是执行过程中调用的是子类的对象, * 程序先寻找子类对象的method方法,但是没有找到, * 于是向上转型去父类寻找 * @author Administrator * */ public class Son extends Father{ public static void main(String[] args) { Father sample=new Son();//向上转型 sample.method(); } }
输出:
父类方法,对象类型:class test.Son.
example2:
package test; public class Father { public void method(){ System.out.println("父类方法,对象类型:"+this.getClass()+"."); } }
package test;
/**
* 由于子类重写了父类的method方法,所以会调用子类的method方法
* 执行,因为子类对象有method方法而没有向上转型去寻找
*
* @author Administrator
*
*/
public class Son1 extends Father{
public void method(){
System.out.println("子类方法,对象类型:"+this.getClass());
}
public static void main(String[] args) {
Father sample=new Son1();
sample.method();
}
}
输出:
子类方法,对象类型:class test.Son1
example3:
package test1; public class Father { protected String name="父亲属性"; public void method(){ System.out.println("父类方法,对象类型:"+this.getClass()); } }
package test1; /** * 这个结果表明,子类的对象调用的是父类的成员变量。 * 所以必须明确,运行时绑定,针对的只是对象的方法。 * 如果试图调用子类的成员变量name,该怎么做? * 最简单的就是将该成员变量封装成方法getter形式 * @author Administrator * */ public class Son extends Father{ protected String name="儿子属性"; public void method(){ System.out.println("子类方法,对象类型:"+this.getClass()); } public static void main(String[] args) { Father sample=new Son(); System.out.println("调用的成员:"+sample.name); sample.method(); } }
输出:
调用的成员:父亲属性
子类方法,对象类型:class test1.Son
example4:
package test2; public class Father { protected String name="父亲属性"; public String getName(){ return name; } public void method(){ System.out.println("父类方法,对象类型:"+this.getClass()); } }
package test2; /** * 如果试图调用子类的成员变量name,该怎么做? * 将该成员变量封装成方法getter形式 * @author Administrator * */ public class Son extends Father{ protected String name="儿子属性"; public String getName(){ return name; } public void method(){ System.out.println("子类方法,对象类型:"+this.getClass()); } public static void main(String[] args) { Father sample=new Son();//向上转型 System.out.println("调用的成员:"+sample.getName()); } }
输出:
调用的成员:儿子属性
相关文章推荐
- java的动态绑定与静态绑定
- Java中的动态绑定和静态绑定
- 学习笔记之 java的动态绑定与静态绑定
- Java 基础(8)—— 向上转型、向下转型、动态绑定、静态绑定
- java动态绑定和静态绑定(分步验证)
- 从Java静态绑定和动态绑定中得到优化启示
- Java的动态绑定和静态绑定
- Java学习笔记之深入理解动态绑定和静态绑定
- java的动态绑定与静态绑定
- c++动态绑定、静态绑定与java中动态绑定与静态绑定的比较
- Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)
- Java中静态绑定与动态绑定详解
- Java静态绑定与动态绑定 隐藏 多态
- java的动态绑定与静态绑定
- java的动态绑定与静态绑定
- java中的动态绑定和静态绑定
- Java方法的动态绑定与静态绑定
- 【Java学习】Java方法的静态绑定与动态绑定讲解
- java动态绑定静态绑定
- Java静态绑定与动态绑定