面向对象和面向过程的区别
面向过程
优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗
资源;比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。
缺点: 没有面向对象易维护、易复用、易扩展
面向对象
优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系
统,使系统更加灵活、更加易于维护
缺点: 性能比面向过程低
Java 语言有哪些特点
int i = fc.read(by);
if (i == 0 || i == -1)
break;
by.flip();
wbc.write(by);
by.clear();
}
fis.close();
return baos.toByteArray();
}
}
MyClassLoader mcl = new MyClassLoader();
Class<?> clazz = Class.forName("People", true, mcl);
Object obj = clazz.newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());//打印出我们的自定义类加载器1. 简单易学;
2. 面向对象(封装,继承,多态);
3. 平台无关性( Java 虚拟机实现平台无关性);
4. 可靠性;
5. 安全性;
6. 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系
统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
7. 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设
计的,因此 Java 语言不仅支持网络编程而且很方便);
8. 编译与解释并存;
关于 JVM JDK 和 JRE 最详细通俗的解答
JVM
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特
定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文
件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了
传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较
高效,而且,由于字节码
并不专对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同的计算机上运行。
Java 程序从源代码到运行一般有下面 3 步:
我们需要格外注意的是 .class->机器码 这一步。在这一步 jvm 类加载器首先加载字节码文件,然后通过
解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用
的,也就是所谓的热点代码,所以后面引进了 JIT 编译器,JIT 属于运行时编译。当 JIT 编译器完成第一
次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率
肯定是高于 Java 解释器的。这也解释了我们为什
么经常会说 Java 是编译与解释共存的语言。
HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小
部分的代码(热点代码),而这也就是 JIT 所需要编译
的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,
因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式
AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就
避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 ,
AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
总结:Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系
统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们
都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所
在。JDK 和 JRE
JDK 是 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有
的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。
JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,
包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程
序。
如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。
如果你需要进行一些 Java 编程方面的工作,那么你就需要安装 JDK 了。但是,这不是绝对的。有时,即
使您不打算在计算机上进行任何 Java 开发,仍然需要安装 JDK。例如,如果要使用 JSP 部署 Web 应用
程序,那么从技术上讲,您只是在应用程序服务器中运行 Java 程序。那你为什么需要 JDK 呢?因为应用
程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译
servlet。
Oracle JDK 和 OpenJDK 的对比
可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么
Oracle 和 OpenJDK 之间是否存在重大差异?下面通过我通过我收集到一些资料对你解答这个被很多人
忽视的问题。
对于 Java 7,没什么关键的地方。OpenJDK 项目主要基于 Sun 捐赠的 HotSpot
源代码。此外,OpenJDK 被选为 Java 7 的参考实现,由 Oracle 工程师维护。
关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle 博客帖子在 2012 年有一个更详细的答案:
问:OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?
答:非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添
加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及一些封闭
的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附
加文档或第三方字体。展望未
来,我们的目的是开源 Oracle JDK 的所有部分,除了我们考虑商业功能的部
分。
总结:
1. Oracle JDK 版本将每三年发布一次,而 OpenJDK 版本每三个月发布一
次;
2. OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是
OpenJDK 的一个实现,并不是完全开源的;
3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多
的类和一些错误修复。因此,如果您想开发
企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到
在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问
题;4. 顶级公司正在使用 Oracle JDK,例如 Android Studio,Minecraft 和
IntelliJ IDEA 开发工具,其中 Open JDK 不太受欢迎;
5. 在响应性和 JVM 性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能;
6. Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来
获取最新版本;
7. Oracle JDK 根据二进制代码许可协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。
Java 和 C++的区别
我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 比呀!没办法!!!就算没学
过 C++,也要记下来!
• 都是面向对象的语言,都支持封装、继承和多态
• Java 不提供指针来直接访问内存,程序内存更加安全
• Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多
继承,但是接口可以多继承。
• Java 有自动内存管理机制,不需要程序员手动释放无用内存
什么是 Java 程序的主类 应用程序和小程序的主类有何不同
一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这
个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继
承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public
类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。
Java 应用程序与小程序之间有那些差别
简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有
main 方法,主要是嵌在浏览器页面上运行(调用 init()线程或者 run()来启动),嵌
入浏览器这点跟 flash 的小游戏类似。
字符型常量和字符串常量的区别
1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的
若干个字符
2. 含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算 字符串常量代表一个地址值(该
字符串在内存中存放位置)
3. 占内存大小 字符常量只占 2 个字节 字符串常量占若干个字节(至少一个
字符结束标志) (注意: char 在 Java 中占两个字节)
java 编程思想第四版:2.2.2 节构造器 Constructor 是否可被 override
在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以
Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多
个构造函数的情况。
重载和重写的区别
重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问
修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于
等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方
法。