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 的子类

相关文章
|
6月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
46 1
|
7月前
|
Java 调度 开发者
Java中的多线程编程:基础知识与实践
【5月更文挑战第29天】 在现代软件开发中,多线程编程是一个不可忽视的领域。特别是在Java这种广泛使用的编程语言中,掌握多线程的概念和技术对于开发高效、响应迅速的应用程序至关重要。本文将深入探讨Java多线程的核心概念、实现机制以及常见问题的解决方案。我们将从基础出发,逐步揭示如何通过多线程提升程序性能,并且讨论并发编程中的挑战和解决策略。文章的目的是为开发者提供一个清晰的多线程编程指南,帮助他们在实际项目中有效地应用这些知识。
43 3
|
7月前
|
Java 开发者
Java中的多线程编程:基础知识与实践
【5月更文挑战第26天】 在现代计算机科学中,多线程编程是一个复杂且强大的概念。Java作为一种广泛使用的编程语言,其对多线程的支持使得开发者能够创建出更为复杂、高效和响应迅速的应用程序。本文将深入探讨Java中的多线程编程,从基础概念到实际编程技巧,为读者提供全面的理解和实践指导。
|
7月前
|
监控 IDE Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第30天】 在现代软件开发中,多线程编程是提高应用程序性能和响应能力的关键。特别是在Java这样的多平台、多用途的编程语言中,掌握多线程技术至关重要。本文旨在为读者提供有关Java多线程编程的全面介绍,从基本概念到高级应用技巧,帮助初学者和有经验的开发者理解并有效使用多线程。文章不仅涉及基础理论,还包括代码示例和最佳实践,确保读者能够将知识应用于实际项目中。
|
7月前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第28天】 在现代计算机科学中,多线程编程是一个重要的概念,它允许程序同时执行多个任务。在Java中,多线程编程是通过创建并管理线程来实现的。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制线程的方法,以及线程同步和通信的相关技术。通过阅读本文,读者将对Java中的多线程编程有一个全面的了解,并能在实际编程中应用这些知识。
|
7月前
|
安全 Java 数据安全/隐私保护
Java中的多线程编程:基础知识与实践
【5月更文挑战第24天】 在现代软件开发中,多线程编程是提升应用性能和响应速度的关键技术之一。Java 作为一种广泛使用的编程语言,其内置的多线程功能为开发者提供了强大的并发处理能力。本文将深入探讨 Java 多线程的基础概念、实现机制以及在实际开发中的应用。我们将从线程的创建和管理出发,逐步讲解同步机制、死锁问题以及如何利用高级并发工具有效地构建稳定、高效的多线程应用。通过理论结合实例的方式,旨在帮助读者掌握 Java 多线程编程的核心技能,并在实际项目中灵活运用。
|
7月前
|
安全 Java
Java基础知识面试总结(全面,实时更新)
Java基础知识面试总结(全面,实时更新)
|
7月前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第19天】多线程编程是Java中的一个重要概念,它允许程序员在同一时间执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动和管理,以及如何通过多线程提高程序的性能和响应性。
|
7月前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
|
7月前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。