【面试题笔记-Java】Java基础

参考JavaGuide和一些面经做的笔记,方便自己记忆

Java基础

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

面向对象的设计思想是将需要解决的问题分解成一个个对象,这一个个对象可以用来描述在完成这件事中扮演的具体角色和行为。

面向过程的设计思想是将需要解决的问题拆分成一个个具体的步骤,然后设置这些步骤的实现方法,然后按照顺序一步步实现即可

优缺点:
面向对象相较于面向过程而言,有着易维护、易复用和易扩展的特点,由于面向对象有封装、继承和多态的特点,所以能够设计出低耦合的系统,易于去维护;而相对面向过程,面向对象性能较低

2.Java语言有哪些特点

1.简单易学

2.面向对象(具有封装、继承和多态的特性)

3.安全性高

4.可靠性强

5.具有跨平台性(JVM),一处编译、处处运行

6.支持多线程

7.能够进行网络编程且很容易实现

8.java是一门半解释半编译的语言

3.JVM及字节码

JVM能够在不同的系统上,将源码编译成的字节码翻译成系统能够读懂的二进制机器码,进而可以达到一处编译,处处运行的特点

在这里插入图片描述

Java是半解释半编译语言,首先使用解释器进行预热编译,出现次数超过阈值的热点代码将会直接通过JIT编译器进行编译,热点代码编译后的机器指令将存储在方法区,下次可以直接使用

字节码是源代码编译后的产物,也就是.class文件,可以被JVM处理,只面向虚拟机。使用它的好处是Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

4.JDK和JRE

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

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

5.Oracle JDK和OpenJDK的对比

简单来说,OpenJDK是sun公司开源的oracle jdk中除去商业功能部分的所有内容。

也就是说,oracle jdk是open jdk的一个实现,并不是完全开源的,open jdk是完全开源的。

oracle jdk比open jdk更加稳定,因为进过了彻底的测试和稳定,如果要进行商业用途,最好是用oracle jdk。

在响应性和jvm性能方面,oracle jdk性能同样比open jdk 更加优秀。

Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本。

Oracle JDK 根据二进制代码许可协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可

6.java和cpp的区别

1.都是面向对象的语言(有封装、继承、动态的特性)

2.java不提供指针直接访问内存,相对来说更加安全

3.java只支持单继承,cpp是多继承;java支持多实现接口

4.java内部有自动内存管理机制,不需要手动释放内存

5.C++字符串尾部会有一个’\0’作为结尾符,但是java语言中并没有

7.什么是java程序的主类,应用程序和小程序的主类有什么区别?

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

8.java应用程序与小程序之间有哪些差别?

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

9.字符型常量和字符串常量的区别

1.形式上:字符型常量是用单引号’'引起来的单个字符;字符串常量是""若干个字符引起来的

2.含义上:字符型常量相当于一个整型值(ASCII值),可以参与表达式运算;字符串常量代表一个地址(描述字符串常量在内存中存放的位置)

3.占内存大小:字符型常量占2个字节;字符串常量占若干个字节

10.构造器是否可以被重写

构造器不能被重写,但是可以被重载,重载方式:方法名一致,参数类型或参数个数不一样。

11.重载与重写的区别

重载:同样的方法,根据输入数据的不同,做出不同处理

重写:子类继承父类的相同方法,输入数据需要一致,要做出有别于父类的处理和响应,覆盖父类方法

  • 重载是发生在一个类中,方法名相同,参数类型、个数、顺序不同,方法返回值和访问修饰符也可以不同的方法

  • 重写发生在运行期,能对子类对父类允许访问的方法内部逻辑进行改变实现

    • 其中方法名,返回值,参数列表必须相同,抛出的异常范围必须小于等于父类(也就是抛出的异常能够让父类接受),访问修饰符要大于等于父类
    • 如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明(private子类无访问权限,final保证不能被修改,子类可以声明同名的static方法,但是不是继承,仅是再次声明)
    • 构造方法无法被重写

12.java面向对象编程的三大特性:封装、继承和多态

封装

封装是将一个对象的属性进行私有化,给外界访问提供一些方法来访问这些私有属性,如果不想外界访问也可以不提供这些方法,但这个类存在也没什么意义了。

继承

继承是使用已存在的类来建立新的类的技术,新的类可以定义新的属性和新的方法,能够使用父类的技术,但是必须完全继承自存父类,不能选择性的继承。通过使用继承我们可以很方便的复用以前的代码

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

多态

指在程序定义中引用变量所指向的具体类型和通过该引用变量发出的方法具体调用对象在编译的时候并不确定,即引用变量指向哪个类的实例对象,引用对象调用的方法到底是哪个类发出的是并不确定,只有在程序运行时才能确定。

Java实现多态可以是继承和实现

13.String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

String的不可变性:
String类是已经被声明为final的, 不可被继承

String代表不可变的字符序列(简称不可变性)

  • 当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  • 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

StringBuilder 与 StringBuffer 的区别

StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,都有相同的一些方法比如append,indexof等

从线程安全性上来说,String对象是不可变的,可以理解成常量,是线程安全的。StringBuffer对内部方法调用了同步锁,是线程安全的;而StringBuilder没有加锁,是线程不安全的。

从性能上来说,当然是加锁了StringBuffer性能比较慢,而没有加锁的StringBuilder比较快

对于三者使用的总结:

  1. 操作少量的数据: 适用 String
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值