JAVA反射机制主要提供了以下哪些功能?
A 在运行时判断一个对象所属的类
B 在运行时构造一个类的对象
C 在运行时判断一个类所具有的成员变量和方法
D 在运行时调用一个对象的方法
参考答案:Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态***。 因此,答案为:ABCD
关于下面的程序,说法正确的是:
1. class StaticStuff
2 {
3. static int x = 10;
4.
5. static { x += 5; }
6.
7. public static void main(String args[])
8. {
9. System.out.println(“x = ” + StaticStuff .x);
10. }
11. static
12. {x /= 3; }
13.}
A 第5行和12行不能编译,因为该方法没有方法名和返回值。
B 第12 行不能编译,因为只能有一个static初始化块。
C 代码编译并执行,输出结果x = 10.
D 代码编译并执行,输出结果 x = 5.
E 代码编译并执行,输出结果 x = 15.
参考答案:选D。考察的是代码执行的顺序。 第5、12行属于static修饰的静态代码块。所以A、B说法错误。 静态代码块以及静态变量自上而下的顺序依次随着类加载而执行,所以依据题目的变量初始化: x初始为10 x+5赋值x,结果为15 x/3赋值给x,结果为5。
public class Test {
public static void main(String args[]) {
int x = -5;
int y = -12;
System.out.println(y % x);
}
}
官方解析:模运算余数的符号跟被除数符号相同,本题中:
-12=(-5)*2+(-2),余数为-2,答案 输出结果为-2
单例模式中,两个基本要点是
A 构造函数私有
B 静态工厂方法
C 以上都不对
D 唯一实例
答案:AD
public class ThreadTest extends Thread {
public void run() {
System.out.println("In run");
yield();
System.out.println("Leaving run");
}
public static void main(String []argv) {
(new ThreadTest()).start();
}
}
答案:程序运行输出先有In run后有Leaving run
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。 结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:( )
A Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下
B 通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法
C 通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成员
D Java反射机制提供了字节码修改的技术,可以动态的修剪一个类
E Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多
F Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率
正确答案:ADF
答案解析:
A Class类在java.lang包
B 动态代理技术可以动态创建一个代理对象,反射不行
C 反射访问私有成员时,Field调用setAccessible可解除访问符限制
D CGLIB实现了字节码修改,反射不行
E 反射会动态创建额外的对象,比如每个成员方法只有一个Method对象作为root,他不胡直接暴露给用户。调用时会返回一个Method的包装类
F 反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化。
ArrayLists和LinkedList的区别,下述说法正确的有?
A
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
B
对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要迭代器。
C
对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
D
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
答案:ABCD
Collection 接口常用的方法
- size():返回集合中元素的个数
- add(Object obj):向集合中添加一个元素
- addAll(Colletion coll):将形参coll包含的所有元素添加到当前集合中
- isEmpty():判断这个集合是否为空
- clear():清空集合元素
- contains(Object obj):判断集合中是否包含指定的obj元素
① 判断的依据:根据元素所在类的equals()方法进行判断
②明确:如果存入集合中的元素是自定义的类对象,要去:自定义类要重写equals()方法 - constainsAll(Collection coll):判断当前集合中是否包含coll的所有元素
- rentainAll(Collection coll):求当前集合与coll的共有集合,返回给当前集合
- remove(Object obj):删除集合中obj元素,若删除成功,返回ture否则
- removeAll(Collection coll):从当前集合中删除包含coll的元素
- equals(Object obj):判断集合中的所有元素 是否相同
- hashCode():返回集合的哈希值
- toArray(T[] a):将集合转化为数组
①如有参数,返回数组的运行时类型与指定数组的运行时类型相同。 - iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历。
- 数组转换为集合:Arrays.asList(数组)
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
参考答案:输出 null new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。 创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null( new Sub()先执行父类的构造方法,父类构造方法调用callName()方法,子类对其进重写。执行子类的callName()方法。输出的成员变量也就是子类的成员变量。但是由于子类还没执行构造函数。所以输出null。)