一、在静态方法内调用一个非静态成员为什么是非法的?

静态方法是属于类的,在类加载的时候就会产生,而非静态成员属于实例对象,只有在对象实例化之后才能存在,然后通过类的实例对象去访问;所以调用静态方法是,还没给非静态成员分配内存,故为非法。

二、方法重载与重写

  • 重载:在一个类中,一个方法可以在其方法名不变的情况下,对参数个数、类型、顺序,返回类型,权限修饰符进行修改从而生成多个同名的方法,可通过传入的参数来进行相应的逻辑处理。(发生在编译期)
  • 重写:重写就是子类对父类中可访问(父类中权限修饰符为private/final/static的方法不能被子类重写)的方法进行修改,方法名、参数都不可更改,内部逻辑可以修改(发生在运行期)
  1. 子类抛出的异常类要小于等于父类抛出的异常类;
  2. 子类的访问权限要大于等于父类的;
  3. 子类的返回类型要小于等与父类的,具体来说就是若方法的返回类型是void或基本数据类型,则重写时返回类型不可修改,若是引用类型,则重写时的返回类型需要是该类型本身或者其子类。

三、成员变量与局部变量

  1. 成员变量是属于类或者对象实例(看是否有static修饰符)的,局部变量是属于代码块或者方法中定义的变量,成员变量可以用private,public和static等修饰符修饰,局部变量不行,但两者都可以用final修饰;
  2. 成员变量是随着类或者对象实例的创建而创建,而局部变量则是与方法的调用有关;
  3. 若该变量没有被赋值,成员变量会自动赋值(若成员变量被final修饰,则需要显性赋值),而局部变量不会。

四、构造方法的特点

  1. 名字与类名一样;
  2. 无返回值,但不能用void声明构造函数
  3. 可以重载,但不能重写。

五、面向对象与面向过程的比较

面向过程的性能较高,适用于对性能要求较高的工作,例如单片机,嵌入式开发等等

面向对象易维护、易扩展,易复用,可设计出低耦合的系统,使得系统更加灵活,利于维护;

六、面向对象三大特征

封装,继承和多态;

七、String StringBuffer 和 StringBuilder三者的关系

  1. String是字符串常量,StringBuffer 和 StringBuilder是字符串变量,是可变的,在Java8中,String的底层实现是private final char value[],有final关键字修饰,所以是不可变的;而StringBuffer 和 StringBuilder继承自AbstractStringBuilder,底层实现为char value[],无final修饰,故为可变量。
  2. String相当于常量,自然是线程安全的,StringBuffer中添加了同步锁,是线程安全的,而StringBuilder没有,故线程不安全。
  3. 性能方面,String每次改变都会生成一个新的对象,性能低;StringBuffer 和 StringBuilder每次改变都是对对象本身进行改变,但由于同步锁的存在,StringBuilder的性能会比StringBuffer要高一些。
  4. 总的来说,处理少量数据时用String即可;处理大量数据时,若是单线程则用StringBuilder,多线程就用StringBuffer。

八、反射

反射使得程序可以在运行过程获取一个类的对象以及它的变量、属性和方法,可让代码变得更加的灵活;但也会带来一些安全问题(比如可以无视泛型的安全检查等等),性能也稍差些,但对于框架、动态代理和注解来说,反射是十分重要的。

九、异常

Java异常类层次结构图,Java的异常(这里是Java广义上的异常包括Exceptions和Errors)都继承自Throwable类,分为Exceptions(异常)和Error(错误);

Exceptions是程序可以解决的异常,可通过try-catch捕获解决,但Error是程序无法解决的,一般发生Error,jvm都会将线程终止;

Exceptions也分成受Check Exception检查异常(必须要解决)和Uncheck Exception不受检查异常(可以不解决),受检查异常不解决会无法通过编译。

java 静态方法可以使用范型吗 java静态方法可以重载吗_java 静态方法可以使用范型吗

不受检查异常只有RuntimeException以及其子类,其他都是受检查异常,如IOException、ClassNotFoundException、SQLException等。

java 静态方法可以使用范型吗 java静态方法可以重载吗_java 静态方法可以使用范型吗_02

十、序列化

对于Java来说,序列化就是将Java对象转化为二进制字节流存放在文件中,或者在网络中传输;

反序列化就是将序列化中得到的二进制字节流转换为Java对象。

java 静态方法可以使用范型吗 java静态方法可以重载吗_字节流_03

被static和transient修饰的变量不能被实例化,transient只能修饰变量,不能修饰类和方法。

十一、IO流

Java的流可分为以下情况

  1. 按流的流向分类,可分为输入流和输出流;
  2. 按流的操作单元划分,可分为字节流和字符流;
  3. 按照流的角色划分为节点流和处理流。

Java Io 流共有 40 多个类,都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

按操作方式分类

java 静态方法可以使用范型吗 java静态方法可以重载吗_字节流_04

按操作对象分类

java 静态方法可以使用范型吗 java静态方法可以重载吗_Java_05

节点流与处理流

按照流是否与特定的地方(磁盘,内存和设备等等)分为节点流和处理流,节点流直接在某个节点进行数据读写操作,处理流是对一个已经存在的流进行连接和封装,通过所封装的流的功能调用来实现读写操作,以实现更加丰富的功能,处理流的构造方法中中必须要一某个流作为参数。

字符流与字节流

字节流是直接对文件进行操作,而字符流则是先通过缓存区来操作文件,(但并不是所有字节流都不用缓冲区,输入缓冲字节流BufferedInputStream和输出缓冲字节流BufferedOutputStream也会用到)所以字符流性能较低,主要是为处理字符串的传输,以防因编码的问题导致乱码,但出于性能考虑,除去传输字符以外,还是优先用字节流。