Java基础知识总结

简介: Java基础知识总结

前言


随着对Java学习的不断深入,愈发意识到无论是SSM框架、SpringBoot又或者是SpringCloud微服务架构,都是建立在Java基础上的,Java基础对于日后的发展与提升意义重大,因此回过头来结合面试题来对Java基础做一个总结,用于回顾复习与提升自己,同时也作为自己之后的面试复习资料。

image.png

1. 面向对象的特征有哪些方面?


  1. 抽象:抽象是忽略一个主题中与当前目标无关的内容,以便于能够更加充分地注意与当前目标有关的内容。抽象并不打算了解所有的内容,只是选择其中的一部分,并不关心具体的细节。抽象包括两个方面,过程抽象数据抽象
  2. 封装:封装就是将过程和数据包裹起来,对数据的访问只能通过已经定义好的接口。面向对象计算始于这一基本概念,即现实世界可以被描绘为一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其它对象。
  3. 继承:继承是一种联结类的层次结构,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
  4. 多态:多态是指允许不同类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,因此很好的解决了应用程序函数同名的问题。

2. 作用域public、private、protected写以及不写时的区别?


作用域 当前类 同包类 子孙类 其他类
public
private × × ×
protected ×
default × ×
  1. public修饰的成员变量和函数可以被当前类、子孙类、同包类以及任意其他类访问。
  2. private修饰的成员变量和函数只能在当前类中被访问。
  3. protected修饰的成员变量和函数能被当前类、子孙类以及同包类访问。
  4. 不写作用域修饰符时默认为default,但是这个单词不能写出,否则会报错

3. String 是最基本的数据类型吗?


String不是最基本的数据类型,String是引用类型,底层维护的是char类型的数组

4. short s1=1; s1=s1+1;有什么错?short s1=1; s1+=1;有什么错?


执行short s1=1;后s1的类型:

image.png

image.png

 short s1 = 1;
 s1 = s1 + 1;

对于short s1 = 1; s1 = s1 + 1;来说,在进行s1= s1 + 1;运算时会自动提升表达式的类型为int,所以将int类型的变量赋予short类型的变量s1会出现类型转换的错误

image.png

image.png

short s1 = 1;
s1 += 1;

对于short s1 = 1; s1 += 1;来说,+=是Java语言规定的运算符,Java编译器会对其进行特殊的处理,因此可以正确编译

image.png

image.png

5. Java 有没有goto?


goto是Java中的保留字,现在没有在Java中使用

6. int 和Integer 有什么区别?


  1. Integer是int类型的包装类,int则是Java的一种基本数据类型。
  2. Integer变量必须实例化之后才能使用,而int类型的变量不需要。
  3. Integer实际是对象的引用,当new一个Integer对象时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
  4. Integer的默认值是null,int的默认值是0.

7. &和&&的区别?


&即可以作为位运算符表示按位与运算,也可以作为逻辑运算符,&&只能作为逻辑运算符,表示逻辑与(and),有短路(当左侧判断条件为false时就不会去执行右侧的判断条件)的作用。

当&作为逻辑运算符时即使左侧条件为false也会去执行右侧的条件,而&&左侧的条件为false时就不会去执行右侧的判断条件。

image.png

image.png

8. 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别?


  1. 条件操作只能操作布尔型类型的数据,而逻辑操作不仅可以操作布尔型的数据,而且可以操作数值类型的数据。
  2. 逻辑操作不会产生短路。

9. Stack 是什么?


Stack称为栈,是一种线性集合,也可以说是一种操作受限的线性表,其添加和删除元素都按照先进后出后进先出)的原则来处理。

10. switch是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?


switch(express)中,express 是一个整数表达式,支持的参数参数有:byteintshortcharStringenum(枚举类型)。

11. 数组有没有length()方法? String有没有length()方法?


数组没有length()方法,有length的属性。String有length()方法。

12. 构造器Constructor 是否可被Override?


构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

13. String 类是否可以被继承?


String类是final类,因此不可以继承。

image.png

14. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里是值传递还是引用传递?


这里是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

15. String和StringBuffer的区别?


相同点:String和StringBuffer类都可以储存和操作字符串( 即包含多个字符的字符数据 )。

不同点:String类提供了数值不可改变的字符串。而StringBuffer类提供的字符串可以进行修改

image.png

image.png

image.png

16. String、StringBuffer、StringBuilder的区别?


可变与不可变

  1. Stirng对象是不可变
  2. StringBuffer和StringBuilder的对象是可变的。

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder类中也是使用字符数组保存字符串,但是并未使用final修饰,因此StringBuffer和StringBuilder为可变的。

是否多线程安全

  1. String中的对象是不可变的,因此线程安全
  2. StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。
  3. StringBuilder并没有对方法进行加同步锁,因此线程是不安全的

如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer

17. Overload 和Override的区别? Overloaded的方法是否可以改变返回值的类型?


方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现重写是父类与子类之间多态性的一种表现重载是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,可以说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型

18. 描述一下JVM加载Class文件的原理机制?


JVM中类的装载是由ClassLoader和它的子类来实现的,ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

19. Java中会存在内存泄漏吗?


会;Java中可能会存在无用但可达的对象,这些对象不能被GC 回收,导致耗费内存资源。

20. 静态变量和实例变量的区别?


静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。

21. 是否可以从一个static方法内部发出对非static方法的调用?


不可以。static方法是静态方法,是属于类的方法,非static方法是属于对象的方法。因为非static方法是要与对象关联在一起的,必须在创建出一个对象后,才可以通过这个对象调用非static方法;而static方法可以直接通过类名来调用,不需要创建对象。也就是说,在一个static方法被调用时,还可能没有创建任何实例对象,此时如果从static内部发出对非static方法的调用,非static方法是无法关联到对象的

22. GC 是什么? 为什么要有GC?


GC是垃圾收集(Gabage Collection)

因为内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

23. String s = new String(“str”);创建了几个String Object?


两个对象,一个是"str",一个是指向“str”的引用对象s。

24. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?


接口可以继承接口,抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数

25. 一个“.java”源文件中是否可以包含多个类(非内部类)?有什么限制?


可以,但是必须只有一个类名与文件名相同

26. 内部类可以引用他包含类的成员吗?有没有什么限制?


一个内部类对象可以访问创建它的外部类对象的内容。

27. 在Java中一个类被声明为final 类型,表示了什么意思?


表示该类不能被继承,是顶级类。

28. 字符串操作:如何实现字符串的反转及替换?


可以使用字符串构造StringBuffer的对象,然后调用StringBuffer中的reverse方法即可实现字符串的反转。调用replace方法即可实现字符串的替换。

29. 怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串?


示例代码:

String str = "世纪末的架构师";
String result = new String(str.getBytes("GB2312"),"ISO-8859-1");

30. Java中的异常处理机制的简单原理和应用?


当Java程序违反了Java的语义规则时,Java虚拟机就会将发生的错误表示为一个异常。违反语义规则包括两种情况。

  1. 一种是Java类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException访问null的对象时就会引发NullPointerException
  2. 另一种情况就是Java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw 关键字引发异常。

所有的异常都是java.lang.Thowable 的子类

相关文章
|
2天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
2天前
|
Java
Java中的多线程编程:基础知识与实践
【4月更文挑战第8天】本文将深入探讨Java中的多线程编程,包括其基础知识和实践应用。我们将从多线程的基本概念开始,然后深入到Java中如何创建和管理线程,以及如何使用同步机制来防止数据不一致。我们还将讨论一些常见的多线程问题,如死锁和竞态条件,并探讨如何解决这些问题。最后,我们将通过一个实际的例子来演示如何在Java中使用多线程。
|
2天前
|
Java
Java中的多线程编程:基础知识与实践
【4月更文挑战第7天】 在现代计算机科学中,多线程编程是一个不可或缺的部分。它允许多个任务在同一时间运行,从而提高了程序的效率和响应性。Java作为一种广泛使用的编程语言,其对多线程的支持使得开发人员能够编写出高效的并发程序。本文将介绍Java中多线程的基础知识,包括线程的概念、创建和管理线程的方法,以及多线程编程的实践技巧。我们将通过实例来深入理解Java多线程编程,并探讨如何有效地解决多线程带来的问题。
|
2天前
|
消息中间件 并行计算 Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第15天】 在现代计算机编程中,多线程是一个复杂但必不可少的概念。特别是在Java这种广泛使用的编程语言中,理解并掌握多线程编程是每个开发者必备的技能。本文将深入探讨Java中的多线程编程,从基础概念到实际应用场景,为读者提供全面的理论支持和实践指导。
|
2天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。
|
2天前
|
Java
Java中的多线程编程:基础知识与实战技巧
【5月更文挑战第6天】多线程编程是Java中的一个重要特性,它允许我们在一个程序中同时执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动、同步和通信,以及如何在Java中实现多线程编程。通过实例代码和解析,帮助读者深入理解Java多线程编程的概念和应用。
|
2天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第5天】在现代软件开发中,多线程编程是一个重要的概念,尤其是在Java这样的多平台、高性能的编程语言中。通过多线程,我们可以实现并行处理,提高程序的运行效率。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制方法,以及一些常见的多线程问题和解决方案。
|
2天前
|
并行计算 Java 数据处理
Java中的多线程编程:基础知识与实践
【5月更文挑战第1天】本文将深入探讨Java中的多线程编程,包括其基本概念、实现方式以及实际应用。我们将从理论和实践两个角度出发,详细解析线程的创建、启动、控制以及同步等关键问题,并通过实例代码演示如何在Java中有效地使用多线程。
|
2天前
|
存储 Java 程序员
Java中的多线程编程:基础知识与实践
【5月更文挑战第1天】在现代计算机科学中,多线程是一种重要的并行计算技术,允许多个执行流程并发运行。本文将深入探讨Java语言中的多线程编程,从基础概念到实际应用,帮助读者理解多线程的核心原理,并通过实例学习如何在Java中创建和管理线程。我们将涵盖线程的生命周期、同步机制以及如何利用高级类如Executor框架来优化多线程应用的性能。通过本文的学习,读者将具备设计和实现高效、稳定多线程Java应用程序的能力。
8 2
|
2天前
|
Java 调度 开发者
Java中的多线程编程:基础知识与实践
【4月更文挑战第30天】 在现代软件开发中,多线程编程是提高程序性能和响应能力的关键。Java作为一款广泛使用的编程语言,提供了丰富的多线程支持。本文将介绍Java多线程的基础概念、实现方法以及常见问题的解决策略。我们将从线程的创建和管理入手,逐步深入到同步机制、死锁避免以及高级并发工具类的应用。通过实例代码演示和理论分析,旨在帮助读者掌握Java多线程编程的核心技能,提升软件项目的并行处理能力。