15、反射创建对象的两种方式 A、使用 Class 对象的 newInstance()方法来创建该 Class 对象对应的实例,这种方式要求该 Class 对象的对应类有默认构造器; B、先使用 Class 对象获取指定的 Construtor 对象,再调用 Constructor 对象的 newInstance()方法来创建该 Class 对象对应类的实例。 16、反射的理解 当一个程序在编译时根本无法预知该对象和类可能属于哪个类,程序只依靠运行时信息来发现该对象和类的真 实信息,这就必须使用反射;一旦获得了某个类所对应的 Class 对象之后,程序就可以调用 Class 对象的方法来获得该对象和该类的真实信息了。 17、数组的理解 A、在一个数组中,数组的元素类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种数 据类型的数据; B、一旦数组初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变; C、数组既可以存储基本类型的数据,也可以存储引用类型的数据。 18、equals 与==的区别 ==比较两个对象在内存里是不是同一个对象,就是说在内存里的存储位置一致。两个 String 对象存储的值是一样的,但有可能在内存里存储在不同的地方 。 ==比较的是引用而 equals 方法比较的是内容。public boolean equals(Object obj) 这个方法是由 Object 对象提供的, 可以由子类进行重写。默认的实现只有当对象和自身进行比较时才会返回 true,这个时候和==是等价的。String, BitSet, Date, 和 File 都对 equals 方法进行了重写,对两个 String 对象 而言,值相等意味着它们包含同样的字符序列。对于 基本类型的包装类来说,值相等意味着对应的基本类型的值一样。 19、finalize、final、finally 三者之间的关系 final: 常量声明。接口里声明的变量默认是 final 的。final 类无法继承,也就是没有子类。这么做是出于基础类 型的安全考虑,比如 String 和 Integer。这样也使得编译器进行一些优化,更容易保证线程的安全性。final 方法无法 重写。final 变量的值不能改变。 finalize: 帮助进行垃圾回收。finalize()方法在一个对象被销毁和回收前会被调用。 finally: 通常用于异常处理,不管有没有异常被抛出都会执行到。比如,关闭连接通常放到 finally 块中完成。 20、在 System.out.println()里面,System, out, println 分别是什么? System 是系统提供的预定义的 final 类,out 是一个 PrintStream 对象,println 是 out 对象里面一个重载的方法。 21、Java 的访问修饰符是什么? 访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法或者变量的访问权限。它们包含: public: 所有类都可以访问 protected: 同一个包内以及所有子类都可以访问 private: 只有归属的类才能访问 默认: 归属类及相同包下的子类可以访问。
22、静态类型有什么特点? 静态变量是和类绑定到一起的,而不是类的实例对象。每一个实例对象都共享同样一份静态变量。也就是说, 一个类的静态变量只有一份,不管它有多少个对象。类变量或者说静态变量是通过 static 这个关键字来声明的。类变量通常被用作常量。静态变量通常通过类名字来进行访问。当程序运行的时候这个变量就会创建直到程序结束后才会被销毁。类变量的作用域和实例变量是一样的。它的初始值和成员变量也是一样的,当变量没被初始化的时候根据它的数据类型,会有一个默认值。类似的,静态方法是属于类的方法,而不是类对象,它的调用并不作用于类 对象,也不需要创建任何的类实例。静态方法本身就是 final 的,因为重写只会发生在类实例上,静态方法是和类绑定在一起的,不是对象。父类的静态方法会被子类的静态方法屏蔽,只要原来方法没有声明为 final。非静态方法不能重写静态方法,也就是说,你不能在子类中把一个静态方法改成实例方法。 非静态变量在每一个对象实例上都有单独的一份值。 23、StringBuffer 和 StringBuilder 的区别 相同点:都表示一个字符序列可变的字符串; 区别:StringBuffer 是线程安全的,StringBuilder 是线程不安全的,性能略高。 24、增强 for 循环与普通 for 循环的区别 增强 for 循环必须有被遍历的目标(如集合或数组)。普通 for 循环遍历数组的时候需要索引。 增强 for 循环不能获取下标,所以遍历数组时最好使用普通 for 循环。 特点:书写简洁。对集合进行遍历,只能获取集合元素,不能对集合进行操作,类似迭代器的简写形式,但是迭代器可以对元素进行 remove 操作(ListIterator 可以进行增删改查的操作)。 25、throws 和 throw 的区别 throws:声明抛出只能在方法签名中使用,可以声明抛出多个异常类,一旦使用了 throws 语句声明抛出该异常,程序就无须使用 try…catch 块来捕获该异常了。 throw:如果需要在程序中自行抛出异常,则应该使用 throw 语句,throw 语句可以单独使用,throw 语句抛出 的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。 26、什么是泛型 泛型就是允许在定义类、接口、方法时 类型形参,这个类型形参在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。 包含泛型声明的类型可以在定义变量。创建对象时传入一个类型实参,从而可以动态地生成无数多个逻辑上的子类,但这种子类在物理上并不存在。 27、多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU 不会因为某个线程需要等待资源而进入空闲 状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子, Servlets 比 CGI 更好,是因为 Servlets 支持多线程而 CGI 不支持。 28、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里? Java 的每个对象中都有一个锁(monitor,也可以成为监视器) 并且 wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在 Java 的线程中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法 是 Object 类的一部分,这样 Java 的每一个类都有用于线程间通信的基本方法。 29、同步方法和同步块,哪个是更好的选择? 同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。
|