JAVASE基础

1. 面向对象与面向过程区别

  • 面向过程: 分析出解决问题的所需要的步骤,然后用函数把这些步骤一步一步的实现,使用的时候依次调用函数即可。强调的是步骤,最小的程序单元是函数。
  • 面向对象: 把构成问题的事务分解成各个对象,建立对象的目的在于描述某个事务在整个解决问题的步骤中的行为。强调的是对象,最小的程序单元是对象。
  • 区别:
    面向过程性能要比面向对象要高,因为面向对象在类调用时需要实例化,开销比较大,比较消耗资源。所以当性能是重要的考虑因素时,比如嵌入式开发、单片机等采用面向过程开发。但是面向过程没有面向对象易维护、易复用、易扩展。
    面向对象易维护、易复用、易扩展。由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活更加易于维护。
  • 面向对象比面向对象性能高?
    其实面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码
    而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定比Java好。
    而且随着Java的不断发展,在性能方面已经有了很大的提升,并不是像从前那样,看到Java就联系到性能低,速度慢。

2.Java语言的特点

  • 简单性
  • 跨平台性
  • 面向对象(封装、继承、多态)
  • 安全性
  • 支持多线程
  • 支持网络编程
  • 编译与解释共存
    Java语言具有什么特点?

3.理解JDK、JRE、JVM概念

  • JVM(Java虚拟机):是运行字节码文件的虚拟机。JVM有针对不同的系统有特定实现,目的是使用相同的字节码,它们都能给出相同的结果。
    什么是字节码?

    在Java中,JVM可以理解的代码就叫做字节码(文件后缀名为.class),它不面向任何的处理器,只面向虚拟机。Java通过字节码文件,在一定程度上解决了传统解释型语言执行效率低的问题,同时有保留了解释型语言可移植性的特点。所有Java的执行效率比较高,而且由于字节码不针对任何一种特定机器,因此,Java程序无需重新编译即可在不同的操作系统的计算机上运行。

    注意: .class->机器码这一步。在这一步JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了JIT编译器(即时编译器),而JIT属于运行时编译。当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定高于Java解释器的。这也解释了我们为什么经常会说Java是编译与解释共存的语言。
  • JDK:JDK是Java Development Kit,它是功能齐全的Java SDK。它拥有JRE所有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。

  • JRE:JRE是运行时环境。它是运行已编译Java程序的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构建。但是,它不能用于创建程序。


4.掌握Java基本数据类型及范围

图片说明


5.Java面向对象编程的相关特性

  • 封装
    封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义。

  • 继承
    继承是使用已存在的类的定义作为基础的建立新类的技术,新类的定义可以增加新的数据或者新的功能,也可以用父类的功能,但不能选择性的继承父类。通过使用继承我们能够非常方便地复用以前的代码。

  • 多态
    指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
    通俗的说法:指程序定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才能确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

  • 抽象
    抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。


6.重写与重载的区别

  • 重载
    发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
    注意: 返回类型不是方法签名的一部分,不能有两个名字相同、参数类型也相同却返回值不同类型值的方法。

  • 重写
    重写是子类对父类的允许访问的方法的实现过程进行重新的编写,发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类、访问修饰符范围大于等于父类。另外,如果父类方法访问修饰符为private则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。

面试题:为什么函数不能根据返回类型来区分重载?(改题来自华为面试题

因为调用时不能指定类型信息,编译器不知道你要调用哪个函数。例如:1. float max(int a, int b); 2. int max(int a, int b), 当调用max(1,2)时无法确定调用的是哪个,单从这一点上来说,仅返回值类型不同的重载是不应该允许的。

7.访问权限修饰符 public、private、protected, 以及不写(默认)时的区别

图片说明