2.String s = new String("xyz");创建了几个StringObject?
A:两个或者一个都有可能
B:两个
C:一个
D:三个
选A
String s = new String(“xyz”);创建了几个String Object?
本题的一种解释
如果原来静态常量池中有‘xyz’这个字符串,那就是创建了一个
两个。第一个对象是字符串常量"xyz" 第二个对象是new String()的时候产生的,在堆中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz" 另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。
变形①:String s = "xyz"创建了几个String对象?
首先看常量池里有没有"xyz",如果有直接引用,如果没有则创建再引用,这里"xyz"本身就是pool中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有。ok,这条语句就创建了2个String对象。
变形②:String str = “aaa” + new String(“bbb”)创建了几个String对象?
四个, "aa"一个对象 new Sring()一个对象 "bbb"一个对象 “aa” + new String(“bbb”);一个对象
本题另一种详细说明
4.局部内部类可以用那些修饰符修饰?
A:public
B:private
C:abstract
D:final
选CD
局部内部类就像方法里的局部变量一样,所有访问修饰符不能修饰,我们可以联想一下局部变量和访问修饰符的总用范围就知道,这两个在一起是冲突的。
还有static 也不能修饰,这是修饰全局变量的。
而另外两中是可以的
5.执行下列代码会发生什么?
public class Test {
static {
int x = 5;
}
static int x,y;
public static void main(String[] args) {
x--;
myMethod();
System.out.println(x+y+ ++x);
}
public static void myMethod() {
y = x++ + ++x;
}
}
输出3
首先我们可以看到类被加载的时候,会有两个x,那么那个才是我们能用的x呢
static int x,y;
这个才是我们下边能用的,并且初始化为0
上边那个就是局部变量,作用与只在所在的花括号里
这里我们知道
int x=0
x = x++;
打印出来的是0,而不是1 因为在这个赋值语句中,x只会赋值一次
还有一种情况
本题的y
6.下面那些赋值语句是正确的
A:long text = 012; 八进制
B:float t = -412; 折磨写是没有问题的,但是如果写成-412.0 就必须加f了
C:int other = (int) true;
D:double d = 0x12345678;
E:byte b = 128; 范围是-128到127
选ABD
注意:Java程序中支持书写二进制、八进制、十六进制的数据,分别需要以0B或者0b、0、0X或者0x开头
注意点:再掉用子类构造方法是会默认调用父类的无参构造方法,如果午餐没有那就写出super(形参列表)
8.java继承的特点,下列说法正确的是
A:使类的定义复杂化
B:java只支持单继承,不可多继承,但可以通过实现接口来达到多继承的目的
C:子类继承父类的所有成员变量和方法,包括父类的构造方法
D:不可以多层继承,既一个类不可以继承一个类的子类
选B
9,final关键字 修饰类 该类不能别继承,修饰方法 方法不能在子类中被重写,这个类是可以被继承的
原生类和包装类
13.关于Float,下列说法错误的是()
A:Float是一个类
B:Float在java.lang包中
C:Float a = 1.0 是正确的赋值方法
D:Float a = new Float(1.0)是正确的赋值方法
选择C
java lang包下的东西不需要导包,其中包含有java的核心代码
选C
设计题
1
*需求:写一个"servlet框架",不改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法。最终实现我们更改配置文件就能改变对象。
实现
1.创建Person类并创建一个sleep方法,创建Student类并创建一个eat方法
2.创建配置文件
3.编写反射代码
步骤:
1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2.在程序中加载读取配置文件
3.使用反射技术来加载文件进内存
4.创建对象
5.执行方法
最后我们只需要更改配置文件就能更改我们所要创建的对象并调用方法的效果