Java继承多态、String、反射(六)
1.面试题
两个子类继承一个父类。父类能调用子类的成员变量或方法不?两个子类之前能互相调用不?
多态给解释一下?可以举一个现实生活中的例子不?
都不能。
所谓继承,为子类继承父类的一切(不包private和构造方法),
即子类可以调用父类的方法或变量。但父类无权调用子类的方法或变量。
不过在实例化子类时,会自动调用父类的构造方法,也可通过 super 调用父类的构造方法。
现实中,男人和女人分别继承 “人” 类 ,人所具备的特性,男人和女人都有,
如四肢,说话,以及思考等。但女人能生孩子,男人可不行。
这是女人特有的方法。生只有女人能调用。所以你不能说人能生孩子。
2.在一个静态方法内调用一个非静态成员为什么是非法的?
由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
3.String
String 类中使用final关键字修饰字符数组来保存字符串,
private final char value[]
在 Java 9 之后,String 类的实现改用 byte 数组存储字符串
private final byte[] value;
String 的对象是不可变的,也就可以理解为常量、线程安全,
4.StringBuffer和StringBuilder
- 这两个都继承子AbstractStringBuilder类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
StringBuffer因为加了同步锁,所以线程安全,相反,StringBuilder就不安全,但性能好一些
总结
- 操作少量的数据: 适用 String
- 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer
5.静态编译和动态编译
静态编译: 在编译时确定类型,绑定对象
动态编译: 运行时确定类型,绑定对象
6.反射
这样的话反射属于动态编译
- 什么是Java的反射?
在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;
- 反射的作用?
如果给定一个类名,就可以通过反射机制来获取类的所有信息,也可以动态的创建对象和编译;
- 反射的原理?
Java语言在编译之后会生成一个class文件,反射就是通过字节码文件找到其类中的方法和属性等;
反射的实现主要借助以下四个类:
1、Class:类的对象;
2、Constructor:类的构造方法
3、Field:类中的属性对象
4、Method:类中的方法对象
7.反射的应用场景
反射是框架设计的灵魂。
在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。
举例:
- 我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序;
- Spring 框架的 IOC(动态加载管理 Bean)创建对象以及 AOP(动态代理)功能都和反射有联系;
- 动态配置实例的属性;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 时间海!
评论