Java面试题(Java基础常⻅知识&⾯试题总结) 上

JAVA语言有那些特点

  1. 简单易学
  2. 面向对象(封装、继承、多态)
  3. 平台无关性(java虚拟机实现平台无关性)
  4. 支持多线程(c++语言没有内置多线程机制,因此必须调用操作系统的多线程功能来进行多线程设计,而JAVA语言却提供了多线程支持)
  5. 可靠性
  6. 安全性
  7. 支持网络编程并且很方便(java语言诞生就是为了简化网络编程设计的,因此java语言不仅支持网络编程而且很方便)
  8. 编译与解释并存

拓展一下  

    一次编写,随处运行,这句宣传口号,真心经典,流传很多年,直到今天,依然很多人绝对跨平台是java语言最大的优势。实际上,跨平台已经不是java语言最大的卖点了,各种jdk新特性也不是, 目前市面上虚拟技术已经非常成熟,比如通过Docker就很容易实现跨平台。在我看来,java强大的生态才是

JVM vs JDK vs JRE 

JVM

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虚拟机、java类库、java命令和一些基础构件。但是它不能用于创建新程序

如果你只是为了运行一下java程序的话,那么你只需要安装JRE就可以了。如果你需要进行一些java编程的工作,那么你就需要安装JDK。但是,这不是绝对的。有时,即使你不打算在计算机上进行任何java开发,仍然需要安装JDK。例如,如果要使用JSP部署web应用程序,那么从技术上将,您只是在应用程序服务器中运行程序,那你为什么需要jdk呢?因为应用程序服务器会将jsp转换为java  servlet并且需要使用JDK来编译servlet

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

在java中,jdm可以理解的代码叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释性语言可移植的特点。所以,java程序运行时相对来说是高效的(不过和c++、rust、go语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此java程序无序重新编译便可以在多种不同的操作系统的计算机上运行

为什么说java语言"编译与解释并存" 

这是因为java语言既具有编译型语言的特征,也具有解释型语言的特征。因为java程序必须要经过先编译后解释两个步骤,由java编写的程序要经过编译步骤,生成子姐爱美(.class文件),这种字节码必须有java解释器来解释执行

java和C++的区别?

  1. java不提供指针来直接访问内存,程序内存更加安全
  2. java的类是单继承,c++支持多继承;虽然java的类不可以多继承,但是接口可以多继承。
  3. java有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
  4. c++同时支持方法重载和操作符重载,但是java只支持方法重载(操作符重载增加了复杂性,这与java最初的设计思想不符)

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

  1. 形式:字符常量是单引号引起的一个字符,字符串常量是双引号引起的0个或者若干个字符
  2. 含义:字符常量相当于一个整型值(ASCII值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)
  3. 占内存大小:字符常量只占2个字节;字符串常量占若干个字节

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

注释有几种? 

单行注释

多行注释

文档注释

 标识符和关键字的区别是什么?

在我们编写程序的时候,需要大量的为程序、类、变量、方法等取名字,于是就有了标识符。简单来说,标识符就是一个名字。

有一些标识符,java语言赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是关键字。简单来说关键字就是被赋予特殊含义的标识符

java语言的关键字有哪些 

 注意:虽然 true, false, null 看起来像关键字但实际 上他们是字⾯值(字面值就是数据),同时你也不可以作为标识符来使⽤。

 自增自减运算符

在写代码的过程中,常见的一种情况是需要某个整数类型变量增加1或者减少1,java提供了一种特殊的运算符,用于这种表达式,叫做自增运算符(++)和自减运算符(--)。

++和--运算符可以放在变量之前,也可以放在变量之后,

当运算符放在变量值前,先自增/减,在赋值

当运算符放在变量之后,先赋值,后自增/减

continue、break和return的区别是什么?

 在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可以需要在循环过程中,当发生了某种条件之后,提前终止循环,这就需要用到下面几个关键词:

  1.continue:指跳出当前的这一次循环,继续下一次循环

  2.break:指跳出整个循环体,继续执行循环下面的语句

  3.return :用于跳出所在方法,结束该方法的执行。

return一般有两种用法

   1.直接使用return结束方法执行,用于没有返回值函数的方法

   2. return value : return 一个特定值,用于返回有返回值函数的方法

什么是方法的返回值--方法有哪几种类型

方法的返回值:是指我们获取到某个方法体中代码执行后产生的结果;返回值的作用是接收出结果,使得它可以用于其他的操作

  1. 无参数无返回值的方法
  2. 有参数没有返回值的方法
  3. 有返回值有参数的方法
  4. 有返回值无参数的方法

静态⽅法为什么不能调⽤⾮静态成员?

这个需要结合JVM的相关知识,主要原因如下:

  1.静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才能存在,需要通过类的实例对象去访问

  2.在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中不存在的非静态成员,属于非法操作 

 静态方法和实例方法有何不同?

1.调用方式

   在外部调用静态方法时,可以使用类名.方法名的方式,也可以使用对象.方法名的方式,而实例只能通过对象.方法名,也就是说调用静态方法可以无需创建对象

不过,需要注意的是一般不建议使用对象.方法名的方式来调用静态方法。这种方法非常容易造成混淆,静态方法不属于类的某个对象的而是属于这个类。

因此一般建议使用类名.方法的方式来调用静态方法

2.访问类成员是否存在限制

  静态方法在访问本类的成员时,只允许访问静态成员(静态的成员变量和静态的方法),不允许访问实例成员(实例变量和实例方法),而实例方法不存在这个限制

重载和重写的区别 

重载:是同一个类中多个相同的方法名根据不同的传参来执行不同的逻辑处理

 不同的传参(参数的类型 个数 顺序 )

重写:重写发⽣在运⾏期,是⼦类对⽗类的允许访问的⽅法的实现过 程进⾏重新编写

 1.相同的方法名 参数 

 2.子类的方法返回值小于父类或者等于  

    子类抛出的异常也要小于或者等于父类

    子类的权限修饰符要大于或者等于父类

3.如果⽗类⽅法访问修饰符为 private/final/static 则⼦ 类就不能重写该⽅法,但是被 static 修饰的⽅法能够被再次声明。
4. 构造⽅法⽆法被重写
重写就是⼦类对⽗类⽅法的重新改造,外部样⼦不能改 变,内部逻辑可以改变

  

关于 重写的返回值类型 这⾥需要额外多说明⼀下,上⾯的 表述不太清晰准确:如果⽅法的返回类型是 void 和基本数据类 型,则返回值重写时不可修改。但是如果⽅法的返回值是引⽤类型,重写时是可以返回该引⽤类型的⼦类的。

 Java 中的⼏种基本数据类型了解么?

四类八种

整型   byte  short  int  long

浮点型 float  double

字符型 char 

布尔类型 boolean

 对应的包装类型

Byte Short  Integer Long 

Float Double

Character

Boolean

 基本类型和包装类型的区别?

  1. 成员变量的包装类型不赋值就是null,而基本类似有默认值但是不是null
  2. 包装类型可以用于泛型,而基本类型不可以
  3. 基本类型的局部变量存储在栈中,基本数据的成员变量(未被static修饰)存放在堆中。包装类型属于对象类型,一直存放在堆中
  4. 向比于对象类型,基本数据类型占用的空间非常小

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

面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题

面向对象会先抽象出对象,然后对象执行方法的方式解决问题

另外,面向对象开发的程序一般更易维护、易复用、易扩展

成员变量和局部变量的区别 

  • 语法形式: 从语法形式上来,成员变量属于类的,而局部变量是代码块或者方法中定义的变量或者是方法的参数; 成员变量可以被public private static等修饰符修饰,而局部变量不能被访问修饰符修饰,但是成员变量和局部变量都能被final修饰
  • 存储方式:从变量在内存中存储方式来看,如果成员变量是使用static修饰,那么这个变量是属于类的。如果没有使用static修饰。这个成员变量是属于实例的。而对象是存在与堆内存在,局部变量则存在栈内存
  • 生存时间:从变量在内存的生存时间来看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的嗲用结束而消亡
  • 默认值:从变量是否有默认值来看,成员变量如果没有赋值会被赋初始值,则自动以类型的默认值而赋值(一种情况例外:被final修饰的成员变量也必须显示地赋值),而局部变量则不会自动赋值

创建一个对象用什么运算符?对象实体与对象引用有何不同?

 new 运算符,new 创建对象实例(对象实体存放在堆内存中),对象引用指向对象实例

(对象引用存放在栈内存中)。

一个对象引用只能指向0或者1个对象,但是对象实体可以有多个引用指向它

对象相等和引用相等的区别 

对象相等一般比较的是内存中存放的内容是否相等

引用相等一般比较的是他们指向的内存地址是否相等

类构造方法的作用是什么

类的构造方法是一种特殊的方法,主要作用是完成对象的初始化工作

如果一个类没有声明构造方法,该程序能正常执行吗?

如果一个类没有声明构造方法,也可以执行的。因为一个类即使没有声明构造方法也会有一个默认的不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),java就不会再添加了默认的无参构造方法了,我们一直在不知不觉的使用构造方法,这也是为什么我们在创建对象的时候后面要加一个括号(因为调用无参构造方法)。如果我们

 构造方法有那些特点?是否可被重写

名字与类名相同

没有返回值,但是不能用void修饰

生产类的对象时自动执行,无序调用

构造方法不能被重写,但是可以被重载,所以可以看到一个类中多个构造函数

面向对象的三大特征 

封装、继承、多态

封装:是指把一个对象的状态信息(也就是属性)因此在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性

继承:不同类型的对象,相互之间经常有一定数量的共同点。继承是使用已存在的类的定义为基础建立新的类的技术,心累的定义可以增加新的数据或者新的功能,也可以用父类的功能,但是不能选择性的继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间,提高我们的效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值