目录
一、动态代理
1、Java中的String,StringBuilder,StringBuffer三者的区别
2、抽象类(abstract class)和接口(interface)有什么异同?
4、String s = new String("xyz");创建了几个字符串对象?
一、代码题
1.Cglib动态代理
/**
* 目标类,没有接口,不是final修饰类,方法也不能用final修饰
*/
public class PersonOperation {
public int add(int i) {
System.out.println("调用了PersonOperation的add方法");
return i;
}
public void delete() {
System.out.println("调用了PersonOperation的delete方法");
}
}
/**
* 方法拦截器类
*/
public class MyMethodInterceptor implements MethodInterceptor {
/**
* 当代理类调用方法时,会触发此方法
*
* @param o 代理类对象
* @param method 传入的目标类对象的方法
* @param objects 传入的实参
* @param methodProxy 代理方法对象,性能比method好,所以建议使用此对象
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//增强了逻辑代码
System.out.println("方法之前增强逻辑代码");
//调用目标类的方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("方法之后增强逻辑代码");
return result;
}
}
public class CglibProxyTest {
public static void main(String[] args) {
//创建Enhance对象
Enhancer enhancer = new Enhancer();
//Enhance对象设置父类
enhancer.setSuperclass(PersonOperation.class);
//Enhance对象设置方法拦截器对象
enhancer.setCallback(new MyMethodInterceptor());
//Enhance对象创建代理对象(字节码技术)
PersonOperation proxy = (PersonOperation) enhancer.create();//PersonOperation的代理对象
//代理对象调用对应的方法
System.out.println(proxy.add(10));
proxy.delete();
}
}
二、Java基础题
1、Java语言具有许多优点和特点,下列选项中,哪个反映了Java 程序并行机制的特点?
A:安全性
B:多线程
C:跨平台
D:可移植
答案:B
2、下列哪个类声明是正确的?( )
A:abstract final class H|{}
B:abstract private move(){.. }
C:protected private number;
D:public abstract class Car{}
答案:D
A:abstract和final不能共存
- final:修饰类代表不可以继承, 修饰方法不可重写
- abstract:修饰类就是用来被继承的,修饰方法就是用来被重写的。
B 、C:不属于类
3、在Java语言中,下列哪些语句关于内存回收的说明是正确的?( )
A:程序员必须创建一个线程来释放内存;
B:内存回收程序负责释放无用内存
C:内存回收程序允许程序员直接释放内存
D:内存回收程序可以在指定的时间释放内存对象
答案:B
4、下列Object 类中的方法,哪一项不是完全跟线程有关: ( )
A: String toString()
B: void notify()
C: void notifyAll()
D: void wait()
答案:A
String toString() 此方法返回字符串本身。
5、下列说法中正确的是?( )。
A:导入包会影响程序的性能
B:包存储在类库中
C:包是类的容器
D:上述说法都不对
答案:C
6、下列不是String类的常用方法是?( )。
A:boolean equals(String str)
B:int compareTo(String str)
C:int SetindexOf(String str)
D:int lastIndexOf(String str)
答案:C
A:equals 判断字符串是否相等
B:compareTo 比较字符串
C:SetIndexOf java字符串无此方法
D:lastIndexOf 从字符串末尾开始检索
7、表达式: (x>y) ? (z>w) ?x:z:w(其中 x=5,y=9,z=1,w=9)的值为?( )。
A:5
B:8
C:1
D:9
答案:D
(x>y)?[【(z>w)?x:z】:w]
x>y为假,所以值为w=9
8、欲构造ArrayList类的一个实例,下列哪个方法是正确的?( )
A: ArrayList myList=new Object()
B: ArrayList myList=new ArrayList(}
C: myList= new Object(})
D: myList= new ArrayList()
答案:B
9、下列叙述中,错误的是?( )。
A:父类不能替代子类
B:子类能够替代父类
C:子类继承父类
D:父类包含子类
答案:D
10、下列说法正确的有()
A: class中的constructor不可省略
B: constructor必须与class同名,但方法不能与class同名
C: constructor在一个对象被new时执行
D:一个class只能定义一个constructor
答案:BC
A、省略构造函数,编译器会自动生成,故可以省略
B、方法是可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值class foo { public foo() { System.out.println("constructor"); } public void foo() { System.out.println("not constructor"); } public static void main(String[] args) { foo fo = new foo(); System.out.println("main"); fo.foo(); } }
D、构造函数可以重载,故错误
11、下面程序的运行结果:()
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong() {
System.out.print("pong");
}
A:pingpong
B:pongping
C:pingpong和pongping都有可能
D:都不输出
答案:B
12、ArrayList list = new ArrayList(20);中的list扩充几次()
A: 0
B: 1
C: 2
D: 3
答案:A
虽然ArrayList的扩容的方式是原数组长度的1.5倍,但此题中ArrayList的长度是固定的,所以扩充0次。
13、getCustomerInfo()方法如下,try中可以捕获三种类型的异常,如果在该方法运行中产生了一个IOException,将会输出什么结果()
public void getCustomerInfo() {
try {
// do something that may cause an Exception
} catch (java.io.FileNotFoundException ex) {
System.out.print("FileNotFoundException!");
} catch (java.io.IOException ex) {
System.out.print("IOException!");
} catch (java.lang.Exception ex) {
System.out.print("Exception!");
}
}
A:IOException!
B:IOException!Exception!
C:FileNotFoundException!IOException!
D:FileNotFoundException!IOException!Exception!
答案:A
14、下面代码的运行结果为:()
import java.io.*;
import java.util.*;
public class foo{
public static void main (String[] args){
String s;
System.out.println("s=" + s);
}
}
A:代码得到编译,并输出's=null'
B:由于String s没有初始化,代码不能编译通过
C:代码得到编译,但捕获到 NullPointException异常
D:代码得到编译,并输出null
答案:B
15、System.out.println("5" + 2);的输出结果应该是()
A:52
B:7
C:2
D:5
答案:A
" 5 " + 2 :其中 " 5 " 为String, 2为int, 不能相加,
5 + 2: 5 和 2都是int, 结果为7
16、如下代码:
public class X {
public X aMethod() { return this;}
}
public class Y extends X {
}
}
哪两个方法能加到Y类的定义中? ( )。
A: private void aMethod() {}
B: public void aMethod(String s) {
C: private Y aMethod() { return null; }
D: public X aMethod() { return new Y(); }
答案:BD
方法重载:在同一个类中, 允许存在一个以上的同名方法, 只要它们的参数个数或者参数类型不同即可。与返回类型无关。
方法重写:需要覆盖的方法要和父类方法具有完全相同的方法名,返回值,参数列表(个数、类型、顺序)。
17、下列标识符不合法的有?( )。
A:new
B:$Usdollars
C:1234
D:car.taxi
答案:CD
字母、数字、_、$
但不能以数字开头,不能是关键字
18、class A {
A() { }
}
class B extends A {
}
哪两个说明是正确的?( )。
A、B类的构造器应该是 public
B、B类的构造器应该是没有参数
C、B类的构造器应该调用this()
D、B类的构造器应该调用super()
答案:BD
19、下列说法错误的有?( )
A:在类方法中可用this来调用本类的类方法
B:在类方法中调用本类的类方法时可直接调用
C:在类方法中只能调用本类中的类方法
D:在类方法中绝对不能调用实例方法
答案:ACD
A:在类方法中可直接调用本类的类方法
B:正确
C:也可以调用其他类的
D:能啊
20、Java接口的修饰符可以为()
A:private
B:protected
C:final
D:abstract
答案:D
接口中的方法是可以用public, abstract, default, static and strictfp修饰的
private和protected 不能修饰interface
其中用static修饰方法时,需要带上方法体 static void methoda(double d1) {}strictfp: 即 strict float point (精确浮点)。
1、GC线程是否为守护线程?(GC是垃圾收集的意思)
A:正确
B:错误
答案:A
2、不通过构造函数也能创建对象吗?
A:正确
B:错误
答案:A
3、在类的静态方法中可以访问该类的非静态数据成员
A:正确
B:错误
答案:B
在类的静态方法中只能访问该类的静态数据成员
4、声明为final的方法不能在子类中重载
A:正确
B:错误
答案:A
5、在方法定义中,所有可能发生的异常都必须用try{}catch(){}捕捉并处理
A:正确
B:错误
答案:B
1、 StringBuffe 类是可变类,对象所包含的字符串内容可以被添加或修改。
2、对于一个已经不被任何引用变量引用的对象,当垃圾回收器准备回收该对象所占用的 finalize 方法。
3、 Random 类提供了一系列用于生成随机数的方法。
4、 异常处理 是一种非常有用的辅助性程序设计方法。采用这种方法可以使得在程序设计时将程序的正常流程与错误处理分开,有利于代码的编写和维护。
5、java.text.DateFormat抽象类用于定制日期的格式,它有一个具体子类为 format 用于进行时期格式化处理
1、Java中的String,StringBuilder,StringBuffer三者的区别
String类不可变,对象一旦被创建就不能被修改,可以用=赋值使用常量池,也可以用new创建;
StringBuffer可变,对象创建后可修改,必须用new关键字,保持线程同步,多线程操作;
StringBuilder可变,不保证线程同步,必须用new关键字,单线程使用比StringBuffer高效。
2、抽象类(abstract class)和接口(interface)有什么异同?
不同点:
1.接口只有方法定义,没有具体的实现,实现接口的类要实现接口的所有方法;抽象类可以有定义与实现;
2.接口与类是实现关系,并且类可以多实现;抽象类与类是继承关系,只能被一个类继承;
3.接口中成员全为public 抽象类中可以有抽象方法,也可以没有,抽象方法需加abstract;
4.接口中无静态方法,抽象类中可以有;
5.接口中不能定义构造器,抽象类中可以。
相同点:
1.都不能被实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果实现接口或继承抽象类,必须实现全部抽象方法,否则仍然是个抽象类。
3、Java 中会存在内存泄漏吗,请简单描述。
会。
java提供了垃圾回收机制,它可以自动回收那些不再被使用的对象,以释放内存空间,但是也会存在编程导致的内存泄露问题,通常是不再使用的对象,但是长生命周期的对象程序持有又持有对该短生命周期对象的引用,从而导致该对象无法被回收的情况称为内存泄漏。所以Java也会出现内存泄漏问题。
参考答案:
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
4、String s = new String("xyz");创建了几个字符串对象?
2个。
一个是new关键字创建的new String()
另一个是"xyz","xyz"本身就是常量池中的一个对象,在运行new String()时将常量池中的对象复制一份到堆中,s指向这个常量池。
5、Collection和Collections的区别?
1、Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。
2、Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。
此类不能实例化,就像一个工具类,服务于Collection框架。