JAVASE面试题

本文详细介绍了Java面试中的常见问题,包括JDK、JRE、JVM的区别与关系,`javac`和`java`命令的作用,字节码的概念及好处,字符型和字符串型常量的差异,垃圾收集(GC)的含义,数组和String对象的`length()`方法,`super`和`this`的关键字用法,Java面向对象的三大特性,`static`和`final`关键字的用法,内存区域的解析,JVM内存结构和内存分配,多态的概念,抽象类与接口的对比,接口和类的关系,方法重载与重写的区别,构造函数的特性,无参构造函数的作用,静态成员与非静态成员的差异,Java创建对象的方式,Object类中的公共方法,四种引用类型,String、StringBuilder与StringBuilder的区别,线程安全与性能考量,以及异常处理和多线程知识。
摘要由CSDN通过智能技术生成

JDK、JRE、JVM之间的区别于关系

 1.三者之间的区别

   JDK:java的开发和运行环境,包含了完整的JRE,还包含了供开发者使用的工具包

   JRE:java的运行环境,非开发者只需要安装JRE来运行程序,包含java运行所需要的类库和JVM

   JVM:java虚拟机,当运行一个程序是,JVM负责将字节码转换为特定的机器代码,JVM提供了内存管理/垃

圾回收和安全机制等,这种独立硬件和操作系统,正是java程序可以一次编写多处执行的原因

 2.三者之间的关系

   1.作为程序员,安装的JDK,因为其中包含了JAVA开发工具包,其中包含了JRE

   2.作为使用者,运行已经开发好的JAVA程序,只需要安装JRE

   3.JVM和JRE的关系:JRE包含了JVM,JVM是运行Java程序的核心虚拟机,同时也包含了Java程序所需要的环

境支持

   4.JDK>JRE>JVM

javac命令和java命令可以做什么事情?

  java运行分两部分:一个是编译,一个是运行

  javac:负责的是编译的部分,当执行javac时,会启动java的编译器程序,对指定扩展名的.java文件进行编

译,编译后生成class文件

  java:负责运行的部分,会启动jvm虚拟机,加载运行时所需要的类库,并对class文件进行执行,一个文件要

被执行,必须要有一个执行的起始点,这个起始点就是main函数.

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

  1.扩展名为Java,Java的源文件,编译之前的纯文本文件,用来储存Java源代码

  2.扩展名为class,Java的类文件,编译之后的二进制文件,存储的是字节码文件, 也就是编译后的.class文件存

储就是字节码

  采用字节码的最大好处,可以实现一次编译,到处运行,可依靠不同平台的Java虚拟机将编译后的字节码解释

成集体平台上的机器指令执行

字符型常量和字符串常量的区别?

  1.形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符。

  2.含义上: 字符常量相当于一个整形值,可以表达式运算 字符串常量代表一个地址值。

  3.占内存大小 字符常量只占2个字节 字符串常量占若干个字节(至少一个字符结束标志)

(注意: char在Java中占两个字节)

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

​ GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,

​ 错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,

​ Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc()。

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

​ 数组中没有length()这个方法,但是数组中有length这个属性。用来表示数组的长度。

​ String中有length()这个方法。用来得到字符串的长度。

super与this的区别?

super()关键字的用法:

​ 1,子类的成员方法中,访问父类的成员变量。

​ 2,子类的成员方法中,访问父类的成员方法。

​ 3,子类的构造方法中,访问父类的构造方法。

this关键字用法:

​ 1,本类成员方法中,访问本类的成员变量。

​ 2,本类成员方法中,访问本类的另一个成员方法。

​ 3,本类的构造方法中,访问本类的另一个构造方法。

注意:

​ this关键字同super一样,必须在构造方法的第一个语句,且是唯一的。

​ this( )与super( )不能同时存在。

Java面向对象编程三大特性:封装、继承、多态

(1):封装

  封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,可以

不提供方法给外界访问。

(2):继承

  继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用

父类的功能,但不能选择性地继承父类。

  通过使用继承我们能够非常方便地复用以前的代码 同时继承也为实现多态做了铺垫。

关于继承

   1.子类拥有父类非 private 的属性和方法。

   2.子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

(3):多态

  多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而

是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个

类中实现的方法,必须在由程序运行期间才能决定, 在父类中定义的属性和方法被子类继承之后,可以具有不同的

数据类型或表现出不同行为,多态性有两种表现形式:重载和覆盖。

简述static和final的用法

1.static:修饰 属性,方法,代码块

(1)静态属性: 类名.属性名----来访问

(2)静态方法:可以通过类名.方法名---直接访问

(3)静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化

注意:静态资源随着类的加载而加载,优先于对象加载 ,只加载一次,其中非静态资源能调用静态资源,但静

态资源只能调用静态资源。

2.final:修饰变量,类,方法

(1)修饰变量

被fianl修饰的成员变量就是常量,一旦赋值不能改变

修饰局部变量:修饰基本数据类型 -> 变量的值不能改变

​ 修饰引用类型 -> 引用只能指向固定的对象

修饰实例变量:默认值不生效,可以再赋值

(2)修饰方法 :不能被子类覆盖

(3)修饰类:不能被继承 被final修饰的类中的所有方法,默认都是final的

注意:final,不能用来修饰构造方法。

解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

​ 通常我们定义的基本数据类型的变量,对象的引用,还有函数调用都使用内存中的栈空间;

​ 而通过new关键字和构造器创建的对象放在堆空间;程序中的常量都是放在静态区中。

​ 栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的

空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

谈谈 JVM 的内存结构和内存分配?

Java 内存模型

​ Java 虚拟机将其管辖的内存大致分三个逻辑部分:方法区(Method Area)、 Java 栈和 Java 堆。

​ 1、方法区是静态分配的,编译器将变量绑定在某个存储位置上,而且这些绑定不会在运行时改变。常数池,

源代码中的命名常量、 String 常量和 static 变量保存在方法区。

​ 2、 Java Stack 是一个逻辑概念,特点是后进先出。一个栈的空间可能是连续的,也可能是不连续的。最典型

的 Stack 应用是方法的调用, Java 虚拟机每调用一次方法就创建一个方法帧(frame),退出该方法则对应的方

法帧被弹出(pop)。栈中存储的数据也是运行时确定的。

​ 3、 Java 堆分配(heap allocation)意味着以随意的顺序,在运行时进行存储空间分配和收回的内存管理模型。

堆中存储的数据常常是大小、数量和生命期在编译时无法确定的。 Java 对象的内存总是在 heap 中分配。

java 内存分配

​ 1、基础数据类型直接在栈空间分配;

​ 2、方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收;

​ 3、引用数据类型,需要用 new 来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量;

​ 4、方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;

​ 5、局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回

收,堆空间区域等待 GC 回收;

​ 6、方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放;

​ 7、字符串常量在 DATA 区域分配 , this 在堆空间分配;

​ 8、数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。

多态有什么好处?

  允许不同类对象对同一函数调用做出响应,即同一函数调用可以根据发送对象的不同而采用多种不同的行为方

式。主要有以下优点:

    1.可替换性:多态对已存在代码具有可替换性

    2.可扩充性:增加新的子类不影响已经存在的类结构

    3.接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的。

abstract class 和 interface 有什么区别?

abstract class interface
实例化 不能 不能
继承关系,一个类只能继承一个父类。但可以实现多个
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值