侧边栏壁纸
博主头像
Zhangsnke博主等级

这是Zhangxike的平凡生活!

  • 累计撰写 16 篇文章
  • 累计创建 11 个标签
  • 累计收到 15 条评论

目 录CONTENT

文章目录

java基础知识(一)

Zhangsnke
2021-06-16 / 2 评论 / 2 点赞 / 799 阅读 / 2,466 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-08-12,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

  • 面向过程
    优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机,嵌入式开发,linux/unix等一般采用面向过程开发,性能是最重要的因素。
    缺点: 没有面向对象易维护、易复用、易扩展。
  • 面向对象
    优点: 易维护,易复用,易扩展。由于面向对象有封装、继承和多态的特性,可以设计出低耦合的系统,使系统更加灵活,易于维护。
    缺点: 性能比面向过程低

2. Java语言特性

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

3. 关于JVM JDK 和 JRE

JVM

Java虚拟机(JVM)是运行java字节码的虚拟机,JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的就是使用相同的字节码,给出相同的结果(跨平台)

什么是字节码?采用字节码的好处?

在Java中,JVM可以理解的代码就是字节码(扩展名叫做.class的文件),它不面向于任何特定处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言运行效率低的问题,同时又保留了解释型语言可移植的特点,所以java运行时比较高效,由于字节码不针对特定的机器,因此java程序无需重新编译便可在多种不同的机器上运行。

java程序从源代码到运行一般有一下三步:

需要注意的是 .class到机器码 这一步。在这一步jvm类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对较慢,而且有些方法和代码块是经常需要被调用的,也就是热点代码,所以后面引进了 JIT编译器 。JIT编译器属于运行时编译,当JIT编译器完成一次编译后,会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定高于Java解释器的,这就是为什么说 java是编译与解释共存的语言。

HotSpot 采用惰性评估(lazy Evaluation)做法,根据二八定律,消耗大部分系统资源的只有那么一小部分的代码(热点代码),而这也是JIT所需要编译的部分。JVM根据代码每次被执行的情况收集信息,并且相应的做出一些优化,因此执行的次数越多,它的速度就越快。JDK9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热各方面的开销。JDK支持分层编译和AOT协作使用,但是,AOT编译器的编译质量是肯定比不上JIT编译器的。

总结:Java虚拟机(JVM)是运行java字节码的虚拟机。JVM针对不同的系统的特定实现(Windows,Linux,macOS),目的就是使用相同的字节码,他们给出相同的结果,字节码和不同系统的JVM 实现是java语言一次编译,可以导出运行的关键。

JDK

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

JRE

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

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

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

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

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

6.构造器Constructor是否可被override

父类的私有属性和构造方法并不能被继承,所以Constructor也不能被override(重写),但是可以overload(重载)。所以一个类中可以有多个构造函数。

7. 重载和重写的区别

重载: 发生在同一个类中,方法名相同,参数列表(参数类型,参数顺序,参数个数)不同,与返回值与访问修饰符无关。发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,返回值的范围要小于等于父类,抛出的异常范围要小于等于父类。访问修饰符范围大于等于父类。如果父类的方法访问修饰符为private,则子类不能重写该方法。

8. Java面向对象编程三大特性

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

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

  1. 子类可以拥有父类 非private的属性和方法
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展
  3. 子类可以用自己的方法实现父类

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

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

2

评论区