上海定制网站开发营销推广小兵cms个人网站模板
web/
2025/9/26 13:59:01/
文章来源:
上海定制网站开发营销推广,小兵cms个人网站模板,porto wordpress汉化版,免费加入微商代理首先是方法的参数是父类对象#xff0c;传入子类对象是否可行 然后引出Parent p new Children(); 这句代码不是很理解#xff0c;google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定 程序绑定的概念#xff1a; 绑定指的是一个方法的… 首先是方法的参数是父类对象传入子类对象是否可行 然后引出Parent p new Children(); 这句代码不是很理解google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定 程序绑定的概念 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说绑定分为静态绑定和动态绑定或者叫做前期绑定和后期绑定 静态绑定 在程序执行前方法已经被绑定此时由编译器或其它连接程序实现。例如C。 针对java简单的可以理解为程序编译期的绑定这里特别说明一点java当中的方法只有finalstaticprivate和构造方法是前期绑定 动态绑定 后期绑定在运行时根据具体对象的类型进行绑定。 若一种语言实现了后期绑定同时必须提供一些机制可在运行期间判断对象的类型并分别调用适当的方法。也就是说编译器此时依然不知道对象的类型但方法调用机制能自己去调查找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为它们都要在对象中安插某些特殊类型的信息。 动态绑定的过程 虚拟机提取对象的实际类型的方法表 虚拟机搜索方法签名 调用方法。 关于绑定相关的总结 在了解了三者的概念之后很明显我们发现java属于后期绑定。在java中几乎所有的方法都是后期绑定的在运行时动态绑定方法属于子类还是基类。但是也有特殊针对static方法和final方法由于不能被继承因此在编译时就可以确定他们的值他们是属于前期绑定的。特别说明的一点是private声明的方法和成员变量不能被子类继承所有的private方法都被隐式的指定为final的(由此我们也可以知道将方法声明为final类型的一是为了防止方法被覆盖二是为了有效的关闭java中的动态绑定)。java中的后期绑定是有JVM来实现的我们不用去显式的声明它而C则不同,必须明确的声明某个方法具备后期绑定。 java当中的向上转型或者说多态是借助于动态绑定实现的所以理解了动态绑定也就搞定了向上转型和多态。 前面已经说了对于java当中的方法而言除了finalstaticprivate和构造方法是前期绑定外其他的方法全部为动态绑定。而动态绑定的典型发生在父类和子类的转换声明之下 比如Parent p new Children(); 其具体过程细节如下 1编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法并且x已经被声明为C类的对象那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法 2接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配那么就调用这个方法这个过程叫做“重载解析” 3当程序运行并且使用动态绑定调用方法时虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类)如果D类定义了f(String)那么该方法被调用否则就在D的超类中搜寻方法f(String),依次类推 上面是理论下面看几个示例示例来自网络 Java代码 view plaincopy to clipboardprint? public class Father { public void method() { System.out.println(父类方法对象类型 this.getClass()); } } public class Son extends Father { public static void main(String[] args) { Father sample new Son();//向上转型 sample.method(); } } 声明的是父类的引用但是执行的过程中调用的是子类的对象程序首先寻找子类对象的method方法但是没有找到于是向上转型去父类寻找 Java代码 public class Son extends Father { public void method() { System.out.println(子类方法对象类型 this.getClass()); } public static void main(String[] args) { Father sample new Son();//向上转型 sample.method(); } } 由于子类重写了父类的method方法根据上面的理论知道会去调用子类的method方法去执行因为子类对象有method方法而没有向上转型去寻找 前面的理论当中已经提到了java的绑定规则由此可知在处理java类中的成员变量时并不是采用运行时绑定而是一般意义上的静态绑定。所以在向上转型的情况下对象的方法可以找到子类而对象的属性还是父类的属性。 代码如下 Java代码 public class Father { protected String name父亲属性; public void method() { System.out.println(父类方法对象类型 this.getClass()); } } 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); } } 结论调用的成员为父亲的属性。 这个结果表明子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确运行时动态绑定针对的范畴只是对象的方法。 现在试图调用子类的成员变量name该怎么做最简单的办法是将该成员变量封装成方法getter形式。 代码如下 Java代码 public class Father { protected String name 父亲属性; public String getName() { return name; } public void method() { System.out.println(父类方法对象类型 this.getClass()); } } 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()); } } 结果调用的是儿子的属性 转载于:https://www.cnblogs.com/Fc-ios/p/3793989.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82230.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!