第一天:
- 选出返回真值的表达式
public class Cat
{
long length;
public Cat(long l)
{
length = 1;
}
public static void main(String arg[])
{
Cat c1, c2, c3;
c1 = new Cat(10L);
c2 = new Cat(10L);
c3 = c2;
long m = 21L;
}
}
参考解析:
A. c1和c2是两个参数相同的不同对象,c1!=c2,返回false
B. c2和c3指向同一个引用,所以c2==c3,返回true
C. m与c1是不同类型,不相等,返回false
D. c1没有定义equals方法,默认调用Object类的equals方法,返回false
拓展知识:
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同
equals 的作用:
默认情况下,比较的是地址值,不过,我们可以根据情况自己重写该方法,一般重写都是自动生成,比较对象的成员变量值是否相同
-
下列关于Java中类的构造方法的描述,正确的是
参考解析:
A . 构造器没有返回值,这个没有返回值和返回值为void不一样
B. 每个类在没有自己显式声明构造器的时候,都会有一个默认的无参构造
C. 构造器可以重载,而且可以使用this()相互调用
D. 每个构造器的默认第一行都是super(),但是一旦父类中没有无参构造,必须在子类的第一行显式的声明调用哪一个构造 -
下面哪一项不是 java 类访问控制关键字
参考解析:
-
一个抽象类并不需要其中所有的方法都是抽象的
参考解析:
抽象类可以包括抽象方法和非抽象方法
如果类里面有抽象方法的话,那么类一定要声明为抽象的 -
以下关于集合类 ArrayList 、 LinkedList 、 HashMap 描述错误的是
参考解析:
Hashtable不允许 null 值(key 和 value 都不可以)
HashMap允许 null 值(key和value都可以)
ArrayList和LinkedList均实现了List接口
ArrayList基于数组实现,随机访问更快
LinkedList基于链表实现,添加和删除更快 -
运行结果
String str1="hello";
String str2="he"+ new String("llo");
System.out.println(str1==str2);
参考解析:
String str1=“hello”;
创建字符串是存在于常量池中
String str2=new String(“hello”);
创建字符串是存在于堆中
两者内存地址不同
扩展知识:
变量存放的位置
程序代码区
常量区存放常量
**全局区(静态区)**存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域
堆区存放的变量(用new,malloc,calloc,realloc等分配内存函数得到的变量)由程序员分配释放
栈区存放的变量(局部变量、函数参数等)由编译器自动分配释放
当代码中出现字面量形式创建字符串对象时,虚拟机首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用
String str1 = "hello";
这里的str1指的是方法区中的字符串常量池中的“hello”,编译时期就知道的;
String str2 = "he" + new String("llo");
这里的str2堆里定义的字符串“hello”,当我们使用了new来构造字符串对象的时候,不管字符串常量池中有没有相同内容的对象的引用,新的字符串对象都会创建,所以这两个引用是不一样的
如果用str1.equal(str2)
,那么返回的是true,因为String类重写了equals()方法
String test = "a" + "b" + "c";
只创建了一个对象,避免了创建多余的字符串对象,在常量池中也只保存一个引用
如果想将这个对象的引用加入到字符串常量池,可以使用intern
方法
-
标识符命名
参考解析:
数字,字母,符号(只有_和$两种),数字不能开头,不能为关键字 -
关于依赖注入说法正确的是
参考解析:
依赖注入是一种思想,或者说是一种设计模式,通过反射机制实现,与具体框架无关
拓展知识:
Spring依赖注入的三种方式
1. 接口注入
2. Setter 方法注入
3. 构造方法注入 -
声明并初始化数组
参考解析:
两种方法
int score[] = new int[10];
int[] score = new int[10];
-
能单独和finally语句一起使用的块是
参考解析:
使用try…catch块捕获时可以没有catch块,但当没用catch块的时候必须得有finally块
拓展知识:
处理异常常用的两种方式:
try…catch(捕获处理机制)
throws(冒泡处理机制) -
java 语言使用的字符码集是
Unicode
-
关于JAVA的垃圾回收机制,下面哪些结论是正确
参考解析:
垃圾回收是完全自动的,不能确定具体的时间
局部变量存放在栈上,栈上的垃圾回收,由finalize()来实现 -
运行结果
public class Test
{
public static Test t1 = new Test();
{
System.out.println("blockA");
}
static
{
System.out.println("blockB");
}
public static void main(String[] args)
{
Test t2 = new Test();
}
}
参考解析:
拓展知识:
类的加载顺序
(1) 父类静态对象和静态代码块
(2) 子类静态对象和静态代码块
以上代码块仅执行一次,并优先于主函数
(3) 父类非静态对象和非静态代码块
(4) 父类构造函数
(5) 子类 非静态对象和非静态代码块
(6) 子类构造函数
- 运行结果
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
参考解析:
自动拆包成byte值传递类型,所以add函数不能实现自增功能
Byte类型值大小为-128~127之间,add(++a),这里++a会越界,a的值变为-128
拓展知识:
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
自动装包/拆包大大方便了基本类型数据和它们包装类地使用
- 运行结果
public class Person{
private String name = "Person";
int age=0;
}
public class Child extends Person{
public String grade;
public static void main(String[] args){
Person p = new Child();
System.out.println(p.name);
}
}
参考解析:
在子类中试图访问父类的private字段,所以编译不通过
扩展知识:
字段属性是静态绑定,方法成员是动态绑定
如果是在编译时期解析,那么就称之为静态绑定,如果方法的调用是在运行时期解析,那就是动态绑定(在运行时,虚拟机根据具体对象的类型进行绑定,或者说是只有对象在虚拟机中创建了之后,才能确定方法属于哪一个对象)
参考解析:
类的初始化过程也就是方法执行的过程 父类的静态变量-父类的静态代码块 子类的静态变量-子类的静态代码块 父类的非静态变量-父类的非静态代码块-父类的构造函数 子类的非静态变量-子类的非静态代码块-子类的构造函数 规律就是 父类先于子类 静态的先于非静态的 变量先于代码块
-
下面哪一项不是加载驱动程序的方法
参考解析:
DriverManager.getConnection方法返回一个Connection对象,这是加载驱动之后才能进行的
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”); -
常用的servlet包的名称是