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就不安全,但性能好一些

总结
  1. 操作少量的数据: 适用 String
  2. 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

5.静态编译和动态编译

静态编译: 在编译时确定类型,绑定对象
动态编译: 运行时确定类型,绑定对象

6.反射

这样的话反射属于动态编译

  • 什么是Java的反射?
      在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;
  • 反射的作用?
      如果给定一个类名,就可以通过反射机制来获取类的所有信息,也可以动态的创建对象和编译;
  • 反射的原理?
      Java语言在编译之后会生成一个class文件,反射就是通过字节码文件找到其类中的方法和属性等;

反射的实现主要借助以下四个类:

1、Class:类的对象;
2、Constructor:类的构造方法
3、Field:类中的属性对象
4、Method:类中的方法对象

7.反射的应用场景

反射是框架设计的灵魂。

在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

举例:

  1. 我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序;
  2. Spring 框架的 IOC(动态加载管理 Bean)创建对象以及 AOP(动态代理)功能都和反射有联系;
  3. 动态配置实例的属性;