一、在静态方法内调用一个非静态成员为什么是非法的?
静态方法是属于类的,在类加载的时候就会产生,而非静态成员属于实例对象,只有在对象实例化之后才能存在,然后通过类的实例对象去访问;所以调用静态方法是,还没给非静态成员分配内存,故为非法。
二、方法重载与重写
- 重载:在一个类中,一个方法可以在其方法名不变的情况下,对参数个数、类型、顺序,返回类型,权限修饰符进行修改从而生成多个同名的方法,可通过传入的参数来进行相应的逻辑处理。(发生在编译期)
- 重写:重写就是子类对父类中可访问(父类中权限修饰符为private/final/static的方法不能被子类重写)的方法进行修改,方法名、参数都不可更改,内部逻辑可以修改(发生在运行期)
- 子类抛出的异常类要小于等于父类抛出的异常类;
- 子类的访问权限要大于等于父类的;
- 子类的返回类型要小于等与父类的,具体来说就是若方法的返回类型是void或基本数据类型,则重写时返回类型不可修改,若是引用类型,则重写时的返回类型需要是该类型本身或者其子类。
三、成员变量与局部变量
- 成员变量是属于类或者对象实例(看是否有static修饰符)的,局部变量是属于代码块或者方法中定义的变量,成员变量可以用private,public和static等修饰符修饰,局部变量不行,但两者都可以用final修饰;
- 成员变量是随着类或者对象实例的创建而创建,而局部变量则是与方法的调用有关;
- 若该变量没有被赋值,成员变量会自动赋值(若成员变量被final修饰,则需要显性赋值),而局部变量不会。
四、构造方法的特点
- 名字与类名一样;
- 无返回值,但不能用void声明构造函数
- 可以重载,但不能重写。
五、面向对象与面向过程的比较
面向过程的性能较高,适用于对性能要求较高的工作,例如单片机,嵌入式开发等等
面向对象易维护、易扩展,易复用,可设计出低耦合的系统,使得系统更加灵活,利于维护;
六、面向对象三大特征
封装,继承和多态;
七、String StringBuffer 和 StringBuilder三者的关系
- String是字符串常量,StringBuffer 和 StringBuilder是字符串变量,是可变的,在Java8中,String的底层实现是private final char value[],有final关键字修饰,所以是不可变的;而StringBuffer 和 StringBuilder继承自AbstractStringBuilder,底层实现为char value[],无final修饰,故为可变量。
- String相当于常量,自然是线程安全的,StringBuffer中添加了同步锁,是线程安全的,而StringBuilder没有,故线程不安全。
- 性能方面,String每次改变都会生成一个新的对象,性能低;StringBuffer 和 StringBuilder每次改变都是对对象本身进行改变,但由于同步锁的存在,StringBuilder的性能会比StringBuffer要高一些。
- 总的来说,处理少量数据时用String即可;处理大量数据时,若是单线程则用StringBuilder,多线程就用StringBuffer。
八、反射
反射使得程序可以在运行过程获取一个类的对象以及它的变量、属性和方法,可让代码变得更加的灵活;但也会带来一些安全问题(比如可以无视泛型的安全检查等等),性能也稍差些,但对于框架、动态代理和注解来说,反射是十分重要的。
九、异常
Java异常类层次结构图,Java的异常(这里是Java广义上的异常包括Exceptions和Errors)都继承自Throwable类,分为Exceptions(异常)和Error(错误);
Exceptions是程序可以解决的异常,可通过try-catch捕获解决,但Error是程序无法解决的,一般发生Error,jvm都会将线程终止;
Exceptions也分成受Check Exception检查异常(必须要解决)和Uncheck Exception不受检查异常(可以不解决),受检查异常不解决会无法通过编译。
不受检查异常只有RuntimeException以及其子类,其他都是受检查异常,如IOException、ClassNotFoundException、SQLException等。
十、序列化
对于Java来说,序列化就是将Java对象转化为二进制字节流存放在文件中,或者在网络中传输;
反序列化就是将序列化中得到的二进制字节流转换为Java对象。
被static和transient修饰的变量不能被实例化,transient只能修饰变量,不能修饰类和方法。
十一、IO流
Java的流可分为以下情况
- 按流的流向分类,可分为输入流和输出流;
- 按流的操作单元划分,可分为字节流和字符流;
- 按照流的角色划分为节点流和处理流。
Java Io 流共有 40 多个类,都是从如下 4 个抽象类基类中派生出来的。
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
按操作方式分类
按操作对象分类
节点流与处理流
按照流是否与特定的地方(磁盘,内存和设备等等)分为节点流和处理流,节点流直接在某个节点进行数据读写操作,处理流是对一个已经存在的流进行连接和封装,通过所封装的流的功能调用来实现读写操作,以实现更加丰富的功能,处理流的构造方法中中必须要一某个流作为参数。
字符流与字节流
字节流是直接对文件进行操作,而字符流则是先通过缓存区来操作文件,(但并不是所有字节流都不用缓冲区,输入缓冲字节流BufferedInputStream和输出缓冲字节流BufferedOutputStream也会用到)所以字符流性能较低,主要是为处理字符串的传输,以防因编码的问题导致乱码,但出于性能考虑,除去传输字符以外,还是优先用字节流。