Java小的细节方面的整理与归纳
2016-03-26 19:31
204 查看
面试中对于Java有很多小的细节的考察,这里开一篇文章记录一下,顺便整理复习一下,也为以前的一些迷茫的地方进行一些填坑的操作。
1.向上转型
形如A a=new B()的创建实例方式我们称之为向上转型,A是B的父类(实体类或者抽象类皆可),或者是接口,为什么需要这种定义呢?我们直接使用B b=new B()不就好了?主要原因是因为面向对象思想的承载,当我们通过实例化A(严格意义上来说,这里并不算是实例化了一个A对象,而是相当于A维护一个指针指向了B对象,因此从层面上来说,相当于是实例化一个B对象)可以实现任何继承或者实现了A的子类,当用户需求变化的同时,是我们的代码有很强的适应性,只需要改变一个实例化的对象,如A a=new C(),其他代码无须作任何的改变。
那么问题来了,如果我们A a=new B(),那么关于代码中的输出调用的顺序是什么,可以先看一段代码:
输出结果如上图所示,这个是非常标准的输出,理论上来讲,一个子类默认调用父类的构造函数然后在调用自己的函数,即图中第一句话和第二句话产生的原因,然而我们在调用sys()方法的时候发现他调用的确是B的sys()方法,这是为什么呢?由于我们new 了一个B()出来,随后向上转型成一个A类,我们可以理解为实际上还是一个B()的类型,所以调用的还是B得sys方法。
以后陆续遇到的再添加。
1.向上转型
形如A a=new B()的创建实例方式我们称之为向上转型,A是B的父类(实体类或者抽象类皆可),或者是接口,为什么需要这种定义呢?我们直接使用B b=new B()不就好了?主要原因是因为面向对象思想的承载,当我们通过实例化A(严格意义上来说,这里并不算是实例化了一个A对象,而是相当于A维护一个指针指向了B对象,因此从层面上来说,相当于是实例化一个B对象)可以实现任何继承或者实现了A的子类,当用户需求变化的同时,是我们的代码有很强的适应性,只需要改变一个实例化的对象,如A a=new C(),其他代码无须作任何的改变。
那么问题来了,如果我们A a=new B(),那么关于代码中的输出调用的顺序是什么,可以先看一段代码:
A类 public class A { public A(){ System.out.println("这是A的构造函数"); } public void sys(){ System.out.println("这是A的输出函数"); } } B类 public class B extends A { public B(){ System.out.println("这是B的构造函数"); } @Override public void sys() { // TODO Auto-generated method stub super.sys(); System.out.println("这是B的输出函数"); } public void aa(){ System.out.println("aaaaa"); } } Main类 public class Main { public static void main(String[] args) { A a=new B(); a.sys(); } }
输出结果如上图所示,这个是非常标准的输出,理论上来讲,一个子类默认调用父类的构造函数然后在调用自己的函数,即图中第一句话和第二句话产生的原因,然而我们在调用sys()方法的时候发现他调用的确是B的sys()方法,这是为什么呢?由于我们new 了一个B()出来,随后向上转型成一个A类,我们可以理解为实际上还是一个B()的类型,所以调用的还是B得sys方法。
以后陆续遇到的再添加。
相关文章推荐
- 20145227 《Java程序设计》第4周学习总结
- 使用Java面向对象程序操作Oralce数据库实现界面增,删,改,查
- Eclipse修改默认编码格式:工作空间,工程,文件,某类文件(如jar)
- 在java中使用和创建自定义的native方法
- java集合框架
- java集合框架
- Java中的枚举类
- Java对象初始化
- 深入理解Java之反射
- 深入理解Java之集合框架
- java容器简单总结
- eclipse 配置ssh
- Java集合类常见问题(下)
- 深入理解Java之数据类型
- java开发 目录配置
- JAVA基础1 数组与方法
- SpringMVC+Spring+Mybatis整合程序之整合
- 使用注解的方法进行springMvc的配置
- Java实现OUT参数
- 复利计算C转java版