常用的Java基础面试题

  • 发布时间:2017-10-26
  • 作者:优才君

  1.面向对象的三大特性


  继承、封装、多态


  什么是继承?


  ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一。


  ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷。


  ③继承来的属性和方法是隐式的,也就是在本类里面是看不见的。


  ④一个类只能有一个父类,也就是类只能是单继承。


  ⑤一个接口可以有多个父类,也就是接口可以是多继承。


  实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之。


  什么是封装?


  对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。


  实际项目开发中,使用封装最多的就是实体类,常常和JavaBean(类必须是具体的和公共的,并且具有无参数的构造器)一起使用。


  那么,实体类有那些东西呢


  答:私有的成员变量、无参数的构造器、有参数的构造器、setter和getters方法、重写tostring方法、重写hashCode和equals方法。


  什么是多态?


  ①多态就是对象拥有多种形态:引用多态和方法多态。


  ②引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象。


  ③方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法。


  ④存在多态的必要条件:继承、重写。


  ⑤多态的作用是消除类型之间的耦合关系。


  在实际项目开发中,A类继承B类,如果在A类中不重写B类的方法的时候,输出的仍旧是B类方法里面的信息(Bb=newA());如果在A类中重写B类的方法的时候,输出的是A类方法里面的信息(Bb=newA())。


     2.Java集合框架树

1.png

  Collection接口:它是Java集合框架的一个根接口,也是List、Set和Queue接口的父接口。同时它定义了可用于操作List、Set和Queue的方法—增删改查。


  Map接口:它提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的。Map接口有一个重要的实现类HashMap。


  ①在Map接口中的键值对是以Entry类型的对象实例形式存在。


  ②在Map接口中键值(Key值)是不可以重复的,value值却可以重复,也就是存在多对一的关系。


  ③在Map接口中提供了分别返回Key值的集合、value值的集合以及Entry集合的方法。


  ④Map支持泛型,同时Key值和value值都是可以为null的。


  ⑤在HashMap中的Entry对象是无序排序的,这点特性和List接口是相反的。


  ⑥在HashMap中有且只能有一个Key值为null的映射。(注:ke值是不能重复的)


  List接口:List接口有一个重要的实现类ArrayList(数组序列)。


  ①List是元素有序并且可以重复的集合。


  ②List可以精确的控制每个元素的插入位置,或删除某个元素的位置。


  Comparator接口:临时的比较规则。如果某一个类要实现这个接口,那必然要实现它的Compare()方法。


  Comparable接口:默认的比较规则。当实现了这个接口,则表示这个类的实例可以比较大小,可以进行自然排序。如果某一个类要实现这个接口,那必然要实现它的CompareTo()方法。


  3.Java中的IO流


  字节流:


  //一个字节一个字节的读写


  FileInputStreamin=newFileInputStream("源文件");


  FileOutputStreamout=newFileOutputStream("目标文件");


  ......


  in.close();


  out.close();


  首先要记住,一旦使用了IO流最后一定要记得关闭,这是常识。


  //利用缓冲区,高效的读取字节


  BufferedInputStreamin=newBufferedInputStream(newFileInputStream("源文件");


  BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream("目标文件");


  ......


  in.close();


  out.close();


  字符流:


  InputStreamReaderisr=newInputStreamReader(newFileInputStream("源文件路径"),"设置编码");


  OutputStreamWriterosw=newOutputStreamWriter(newFileOutputStream("目标文件路径"),"设置编码");


  ......


  osw.close();


  isr.close();


  也可以这样写:


  FileReaderfr=newFileReader("源文件路径");


  FileWriterfw=newFileWriter("目标文件路径");


  ......


  fr.close();


  fw.close();


  //利用缓冲区,高效的读取字符


  BufferedReaderbr=newBufferedReader(newFileReade("源文件路径");


  PrintWriterpw=newPrintWriter("目标文件路径");


  ......


  br.close();


  pw.close();


  序列化和反序列化:


  //对象的序列化


  ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(file));


  这里的file指的是Stringfile="文件在项目中的路径";


  //对象的反序列化


  ObjectInputStreamois=newObjectInputStream(newFileInputStream(file));


 4.Java的Socket通信(多线程)

1508999972.jpg

  思路:


  ①首先创建服务器端Socket,指定并侦听某一个端口,然后循环监听开始等待客户端的连接….


  ②创建客户端socket,指定服务器地址和端口,然后获取输出流,向服务器端发送请求,并关闭socket输出流。


  ③服务端接收到客户端的请求后,创建新线程并启动。


  ④创建线程处理类,执行线程操作,获取输入流,服务端读取客户端用户详情,关闭资源。


  ⑤执行线程操作,获取输出流,响应客户端请求,客户端接受到服务端的响应,关闭资源。


  简单点讲,就相当于我跟你说话(客户端→服务端),你收到我说的话(服务端→线程处理类),大脑进行思考后(线程处理类),做出回答我的话(线程处理类→客户端)。


  5.关系型数据库


  数据库的三范式:


  ①字段不可分。


  ②有主键,非主键字段依赖主键。


  ③非主键字段不能互相依赖。


  T-SQL:

1509000013.png

  在整个数据库中,查询操作占据增删改查的80%,而说到查询,T-SQL语句自然不能少。如图上示。


  增:


  ①插入单行


  insertinto<表名>(列名)values(列值)


  ②将现有的表数据添加到一个已有表


  insertinto<已有的新表>(列名)select<源表列名>from<源表名>


  ③直接拿现有表数据创建一个新表并填充


  select<新建表列名>into<新建表名>from<源表名>


  删:


  ①删除满足条件的行


  deletefrom<表名>where<删除条件>


  ②删除整个表


  truncatetable<表名>


  注:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用语有外建约束引用的表。


  改:


  ①更新


  update<表名>set<列名=更新值>where<更新条件>


  子查询:


  SELECT*FROMt1WHEREcolumn1=(SELECTcolumn1FROMt2);


  其中:


  ①SELECT*FROMt1…称为外查询。


  ②SELECTcolumn1FROMt2称为子查询。


  所以,我们就说子查询是嵌套在外查询内部的。而事实上它也有可能在子查询内部再嵌套一个或者多个子查询。


  这里要注意,子查询必须出现在圆括号之间哦。