黑马程序员技术交流社区

标题: 面试 [打印本页]

作者: 雪莲    时间: 2016-7-4 22:41
标题: 面试
1、面向对象的理解
        面向对象是基于面向过程的。在开发过程中,要完成特定的功能就去找相应的对象,如果找不到就创建相应的对象,使用对象,维护完善对象。
2、面向对象和面向过程的区别
        面向过程强调的是功能行为;
        面向对象将功能封装成对象,强调的是具备功能的对象
3、abstract与哪些关键字不能共存为什么
        private:私有的方法是不可见的,无法被复写
        final:被final修饰的方法是最终方法,无法被复写
        static:被static修饰的方法,要随类加载到方法区,由于抽象方法没有方法体所以不能加载
4、static的特点
        随着类的加载而加载;优先于对象存在;被所有对象所共享;可以直接被类名所调用。
        静态方法只能访问静态成员,非静态方法既可以访问静态也可访问非静态
        静态方法中不可以定义this、super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this;
5、类与类、类与接口、接口与接口的关系
        继承,继承或实现,继承
6、final、finally、finalize的区别
        final:可以修饰类、方法和变量,被final修饰的类无法被继承,方法无法被复写,变量为常量只能赋值一次
        finally:异常处理trycatch时使用,可以添加也可以不添加,用于执行一些必须执行的代码,如关闭资源等
        finalize:Object类中的方法,其中定义了对象要被垃圾收集器回收之前要做的相关的清理工作
7、什么是多态,多态的好处和弊端
        多态可以理解为事物存在的多种体现形态。父类的引用指向了自己的子类对象;父类的引用也可以接收自己子类的对象。
        好处:提高了代码的扩展性
        弊端:父类的引用只能访问父类中有的成员(父类引用无法调用子类中特有的方法)
8、wait()和sleep()的区别
        (1)wait是Object类中的方法,sleep是Thread类中的方法
        (2)sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
        (3)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
         (4)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
9、网络编程的三要素
        (1)IP:网络中设备的标识
        (2)端口:用于标识设备中接收数据的网络应用程序具体是哪一个,有效端口0~65535,0~1024为系统端口及保留端口
        (3)传输协议:UDP和TCP协议,信息通讯的规则
10、UDP和TCP的区别
        UDP:不需要建立连接,是不可靠协议,将数据及源和目的封装到数据报中,每个数据报限制在64k以内,发送数据较少,速度快
        TCP:通过三次握手建立连接通路,是可靠协议,可进行大量的数据传输,效率较低
11、什么是暴力反射
        我们知道java的特性之一就是封装,将对象的属性和具体实现隐藏起来,只对外提供公共方法访问,private修饰的内部属性和方法对我们是不可见的。
        我们通过正常的方法是无法获取以及修改的,可是通过反射却可以强制获取并做一些修改,这就破坏了封装性,这就是所谓的暴力反射
12、反射获取字节码对象方式、创建对象的两种方式
        获取字节码方式三种:
        (1)类名.class,例如:System.class
        (2)对象.getClass(),例如:new Date().getClass();
        (3)Class.forName("类名"),例如:Class.forName("java.util.Date");
        创建对象的两种方式:
        (1)直接用字节码创建对象,只能调用默认的构造方法:字节码.newInstance();
        (2)获取构造方法Constructor,然后调用构造方法创建,可以通过参数不同调用不同的构造方式
13、怎么理解反射,反射的应用
        反射就是把Java类中的各种成分映射成相应的Java类。
        一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方法来解决问题。
        反射是一个正好相反的过程,开始可能并没有类可以解决这个问题,而我们却先用一个当时可能并不存在的方法解决了这个问题,后来才有的这个类。
        这其实就是框架的原理,现有的框架再有的解决问题的类。框架描述了整体,制订了功能方法的规范,具体的实现之后按照这个规范编写。这些都需要靠反射来完成。
        使用框架有良好的扩展性,某部分功能的优化不需要涉及程序整体,只需要修改特定的部分就好了,然后通过配置文件,获取对应的类名,就可以了。
14、对匿名内部类的理解
        匿名内部类其实是内部类的简写形式。
        内部类是定义在类中的类,就好比我们人类,我们人类都有心脏,而心脏又有自己独特组成,可以把心脏也抽象成一个类。
        这个心脏类就是人类的内部类。如果要研究某一种心脏疾病,需要一个实例时,我们不需要知道这个患病的心脏到底是谁的,那找到的这个就是匿名的。
        匿名内部类必须要继承一个类或实现一个接口,在使用时直接父类或接口的名称创建了一个子类对象并实现其中的方法,匿名内部类其实是一个匿名的子类对象。
15、IO体系
        字节流InputStream/OutputStream
                |--FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作
                |--BufferedInputStream/BufferedOutputStream:加缓冲区的字节流,用于提高效率
        字符流Reader/Writer
                |--FileReader/FileWriter:文件字符流,用于文本文件的读写操作
                |--BufferedReader/BufferedWrite:加缓冲区的字符流,用于提高效率
        转换流InputStreamReader/OutputStreamWriter:是字节流和字符流之间的桥梁
        配置文件Properties
16、集合体系
        |--Collection
                |--List:元素是有序的,元素允许重复,因为该集合体系都具有索引
                        |--ArrayList:底层数据结构是数组,查询速度快,增删操作较慢,线程不同步
                        |--LinkedList:底层数据结构是链表,查询效率较低,增删操作快,线程不同步
                        |--Vector:功能同ArrayList类似,底层也是数组,不同是线程是同步的,效率较低
                |--Set:元素是无序的,元素不允许重复,底层用到了Map
                        |--HashSet:底层hash表,存储的对象最好复写hashCode和equals方法,保证元素不会重复
                        |--TreeSet:底层二叉树,存储的对象具备比较性,有两种方法
        |--Map:数据是以键值对的形式存储的,有的元素存在映射关系就可以使用该集合,元素不允许重复
                |--HashMap:允许有null键或值,线程不同步
                |--TreeMap
                |--HashTable:类似HashMap,不允许有null键或值,线程同步
17、线程的创建方式,进程线程的理解
        两种:继承Thread或实现Runnable
        进程是一个执行中的程序,每一个程序都至少有一个执行顺序,该顺序是一个路径,或者叫一个控制单元。
        线程是进程中的一个独立的控制单元,线程在控制着进程的执行。
18、局部变量和成员变量区别
        成员变量:作用于整个类中,随对象存储在堆内存中,生命周期跟对象一样
        局部变量:作用于方法或语句中,方法或语句结束则生命周期结束,存放在栈内存中。
19、同步函数与同步代码块的区别
        它们的作用都是封装多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与进来。
        同步代码块:位置比较灵活,封装了操作共享数据的语句,多个线程中只有持有锁的才可以操作共享数据,需要指定一个对象作为锁
        同步方法:声明方法时加synchronized关键字修饰,同步函数使用的锁是this,持有锁的线程调用这个方法时其他线程无法调用。
20、数组和集合的区别
        数组可以存储基本数据类型和对象,它是一个线性的序列,可以快速的访问其中的元素。数组创建之后,容量就固定了,而且在其生命周期里是不能改变的
        集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象。集合的长度并不是固定的,可以便捷的添加删除。能够更加便捷的操作元素,功能更加强大
21、StringBuffer和StringBuilder的区别
        StringBuffer是线程安全的,StringBuilder是线程不安全的,所以效率比起来StringBuilder要比StringBuffer快。
        一般单线程的程序使用StringBuilder比较好,多线程的情况下可以自己加锁,也可以直接使用StringBuffer
22、String和StringBuffer区别
        String对象一经创建就不会发生变化了,即便是赋新值也不是在原对象的基础上改变,而是创建一个新的字符串对象,将引用指向这个新的对象,会造成空间的浪费,效率较低
        StringBuffer只创建一个对象,是在同一个实例的基础之上追加,效率更高,当需要用到String的时候toString就可以了


作者: 惊鸿游龙    时间: 2016-7-4 23:00
楼主好人,大赞

作者: 13411939415    时间: 2016-7-4 23:15
这是面试问题吗   感觉问的好多
作者: hbpiaoyi    时间: 2016-7-5 08:07
学习一下,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2