1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程,Java源文件被编译成能被Java虚拟机执行的字节码文件
2、JDK、JRE、JVM关系是什么
JDK(Java Development Kit)即为Java开发工具包
JRE(Java Runtime Environment)即为Java运行环境
JVM(Java Virtual Machines)即为Java虚拟机,提供了字节码文件(.class)的运行环境支持
简单来说:jdk包含jre和jvm
3、Java支持的数据类型有哪些?什么是自动拆装箱?
基本数据类型:
整数值型:byte,short,int,long,字符型:char ,浮点类型:float,double ,布尔型:boolean
整数默认int型,小数默认是double型。Float和long类型的必须加后缀
注意:String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的
4、是否可以在static环境中访问非static变量
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上
5、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问
6、Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。 Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。 Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。
7、面向对象的特征有哪些方面?
抽象:将同类对象的共同特征提取出来构造类
多态:不同子类型对象对相同消息作出不同响应
封装:将数据隐藏起来,对数据的访问只能通过特定接口
继承:基于基类创建新类
8、访问修饰符public,private,protected,以及不写(默认)时的区别?
9、int和Integer有什么区别?
int的包装类是Integer
10、自动装箱和拆箱
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型
11、构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载
12、final关键字
使用final关键字修饰类的作用,那就是用final修饰的类是无法被继承的
用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变
修饰方法,表示该方法无法被重写
用来修饰方法参数,表示在变量的生存期中它的值不能被改变
修饰类,表示该类无法被继承
13、static关键字
用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便
14、list set map区别
list:可以允许重复的对象。
可以插入多个null元素。
是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序
Set:不允许重复对象
无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
只允许一个 null 元素
Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet
Map:不包含重复的元素
每个键最多对应一个映射的值
不能有空值键
15、启动一个线程是调用run()还是start()方法?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。
16、请说出与线程同步以及线程调度相关的方法
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
17、编写多线程程序有几种实现方式?
两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活
18、阐述JDBC操作数据库的步骤
加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
创建连接
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
创建语句
PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?"); ps.setInt(1, 1000); ps.setInt(2, 3000)
执行语句
ResultSet rs = ps.executeQuery();
处理结果
while(rs.next()) { System.out.println(rs.getInt("empno") + " - " + rs.getString("ename")); }
关闭资源
finally { if(con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } }
也就是说先关闭ResultSet、再关闭Statement、在关闭Connection
19、分层架构中,Dao层的作用是什么?
叫数据访问对象层,封装数据库的底层操作。