Java基础知识点汇总(一)

1.面向对象和面向过程的区别

面向过程:面向过程性能比面向对象高。因为面向对象在类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易拓展。

面向对象:面向对象易维护、易复用、易拓展。因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活,更易于维护,更加的灵活。但是,面向对象性能比面向过程低。

关于性能的整合理解:Java性能相对差的主要原因不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。而面向过程语言大多是直接编译成机械码在电脑上运行,而且某些面向过程的脚本语言性能并不一定比Java好。

2.Java语言有哪些特点

1.简单易学;
2.面向对象(封装、继承、多态);
3.平台无关性(Java虚拟机实现平台无关性);
4.可靠性;
5.安全性;
6.支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程设计,不过在2011年,C++引入了多线程库,而Java语言却提供了多线程的支持);
7.支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的);
8.编译与解释并存;

3.关于JVM JDK和JRE

JVM
java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。在Java中,JVM可以理解的代码叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译就能在多种不同操作系统的计算机上运行。

Java程序从源代码到运行一般有下面三步:
Java基础知识点汇总(一)
其中我们需要注意的是,.class->机器码这一步。在这一步中JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。机器码的运行效率肯定是高于Java解释器的。这也解释了我们为什么经常会说Java是编译与解释共存的语言。

总结:
Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现,目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译,随处可以运行”的关键所在。

JDK和JRE
JDK是Java Development Kit,它是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jbd)。它能够创建和编译程序。

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

如果你只是为了运行一下Java程序的话,那么你只需要安装JRE就可以了。如果你需要进行一些Java编程方面的工作,那么你需要安装JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,依然需要安装JDK。例如,如果使用JSP部署WEB应用程序,从技术上来讲,因为应用程序会将JSP转换为Java Servlet,并且需要用JDK来编译servlet。

4.Java和C++的区别?

我知道很多人没学过C++,但是面试官就是没有办法,喜欢问这两者的区别!总结如下:
1.都是面向对象的语言,都支持封装、继承和多态。
2.Java不提供指针来直接访问内存,程序内存更加安全。
3.Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承(Java类单继承是指class A extends B,C 不能这样写,因为java不支持多继承。但是可以像下面这样实现继承多个类:class A extends B,class C extends A,这样C就同时继承了B和A两个类了)。
4.Java有自动内存管理机制,不需要程序员手动释放无用内存。

5.什么是Java程序的主类应用程序和小程序的主类有何不同?

一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public 类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。

6.Java应用程序与小程序之间有哪些差别?

简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有 main() 方法,主要是嵌在浏览器页面上运行(调用init()或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。

7.字符型常量和字符串常量的区别?

形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符
含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
占内存大小 字符常量只占2个字节; 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)

Java基础知识点汇总(一)

8.构造器 Constructor 是否可被 override?

在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。

9.重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。   
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

Java基础知识点汇总(一)

10.Java 面向对象编程三大特性: 封装 继承 多态

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

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

关于继承如下 3 点请记住:

子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。(以后介绍)。

多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。