Java 构造器与多态
来源:互联网 发布:数码宝贝3网络进化 编辑:程序博客网 时间:2024/06/05 04:23
纸上得来终觉浅
Think in Java第八章 多态
1.实现向上转型的原因是由于动态绑定的存在,就是在运行时根据对象的类型对其进行绑定,编译器不知道对象的类型,但是运行中,能根据对象类型调用正确的方法并调用;
2.除了Static和Final(Private方法属于final,和final一样,不能被重写)方法,其他所有方法都是动态绑定;这两种方法无法实现多态(无法实现动态绑定),但是更详细的原因如下:
1)Static的访问是根据类直接访问,它不会根据基类存储的类型调用相关的方法,而是直接调用类中的方法,但是还是可以被重写的;
2)Final因为不能重写,所以即使子类中有,也是新的方法,也无法实现多态;
这里总结下Final作用:
1)上篇说到的防止被覆盖;
2)关闭动态绑定,告诉编译器不需要对其进行动态绑定,这样编译器可以为final方法调用生成更有效的代码(没有测试过。。。)
3.构造器中调用的方法最好是Final类型(Private)的方法:
如果构造器中调用普通的方法,那么根据上篇文章中讲述的类的初始化顺序,那么顺序是:父类非静态成员变量初始化-->父类构造函数-->子类非静态成员变量初始化-->子类构造函数,在执行父类构造函数时,调用了普通的方法, 而子类重写了这个方法,所以它就是去调用子类的这个方法,如果子类这个方法中用到了非静态成员变量,这个时候其实还没有到子类非静态成员变量初始化, 就可能导致不想要的后果,如下:
package roadArchitectWeb.Test;class Test extends Test1{private int a = 10;public void doTest(){System.out.println("Test.doTest()extend:"+a);}public Test(){System.out.println("Test.Test():"+a);}}public class Test1{public void doTest(){System.out.println("Test1.doTest()");}public Test1(){doTest();}public static void main(String[] args) {Test test = new Test();}}结果如下:
Test.doTest()extend:0Test.Test():10第一行结果,这个时候a还没有初始化,所以为0;这可能不是原来想要的结果
0 0
- Java构造器与多态
- Java 构造器与多态
- 构造器与多态
- 构造器与多态
- Java构造器与继承
- JAVA构造器+继承+重载与重写+自动转型与多态
- Java子类的构造方法与多态
- Java 继承与多态(三)—构造器的调用顺序
- java构造器内部的多态
- java中构造器的多态
- Java构造器内部的多态
- Java的初始化与构造器
- java中初始化与构造器
- Java基础----构造器与方法重载
- java--构造器与static,初始化顺序
- Java赋值与构造
- 构造函数与多态
- 实例构造与结构构造(Java/C#)
- 编译Boost 详细步骤
- MySQL分库分表的技巧
- 274. H-Index
- wildfly10 append postgresql driver & datasource
- count2array_count_values .php
- Java 构造器与多态
- array used and char`s array and string`s array
- ajax
- Android 模拟器的创建
- 汉诺塔
- 虚拟机已死,容器才是未来?
- 浅谈盒模型
- 《java入门第一季》之面向对象(匿名对象)
- php 函 数