小呆呆的生活

  • 首页
  • 分类
    • Linux
    • MySQL
    • SpringBoot
    • SpringCloud
  • 工具
  • 留言
  • 登录
  • 注册
  • 友情链接
    • 咸鱼的窝
    • DIY熙的家
    • Farmer的自习室
    • Dark的小黑屋
  • 关于
人的一生注定会遇到两个人
一个惊艳了时光,一个温柔了岁月
  1. 首页
  2. Java基础
  3. 正文

Java面试高频(二)

2021年 6月 2日 673次阅读 0人点赞 0条评论

1.构造方法有哪些特性?

特点:

(1)构造方法名一定与类同名。

(2)构造方法无返回值。

(3)构造方法可以没有(默认一个无参构造方法),也可以有多个构造方法。他们之间构成重载关系。

(4)如果定义有参构造函数,则无参构造函数将被自动屏蔽。

(5)构造方法不能被继承。

(6)构造方法不能手动调用,在创建类实例的时候自动调用构造方法。

作用:

(1)初始化对象,为对象赋初值。

(2)简化我们为类字段赋值的代码。

构造方法和普通方法的区别:

(1)构造方法一定与类同名,普通方法就可以不用。

(2)构造方法无返回值,普通方法可以有返回值。

2.在 Java 中定义一个不做事且没有参数的构造方法有什么作用?

Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误。因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

3.Java 中创建对象的几种方式?

  1. 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student();
  2. 使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
  3. 使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor constructor =Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
  4. 使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = stu.clone();这也是原型模式的应用。
  5. 使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();

4.抽象类和接口有什么区别?

(1)抽象类中可以定义构造方法,而接口中不可以定义构造方法;

(2)抽象类中可以有抽象方法和具体方法,而接口中只能有抽象方法(public abstract);

(3)抽象类中的成员权限可以是public、默认(default)、protected(抽象类中的抽象方法就是为了重写,所以不能被private修饰),而接口中的成员只可以是public(方法默认:public abstact,成员变量默认:public static final);

(4)抽象类中可以包含静态方法,而接口中不可以包含静态方法。

JDK1.8中的改变:

(1)在JDK1.8中,允许在接口中包含带有具体实现的方法,使用default修是,这类方法就是默认方法。

(2)在JDK1.8之前接口中不能包含静态方法,而JDK1.8以后可以包含。之前不能包含是因为接口中不可以实现方法,只可以定义方法,所以不能使用静态方法(因为静态方法必须实现)。现在可以包含了,只能用接口直接调用静态方法(如:接口名调用静态方法)。JDK1.8仍然不可以包含静态代码块。

5.静态变量和实例变量的区别

语法定义上的区别

  • 静态变量用static修饰
  • 实例变量没有static修饰

运行区别,实例区别

  • 静态变量在类中,不属于实例对象,属于类所有,只要程序加载了字节码,不用创建实例对象静态变量就会被分配空间,已经可以使用。
  • 实例变量是某个对象的属性,只有实例化对象后,才会被分配空间,才能使用。
  • 类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;

6.short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?

对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会自动提升表达式的类型为int,那么将int型值赋值给short型变量,s1会出现类型转换错误。

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

7.int和Integer的区别

  1. int是基本数据类型,Integer是int包装类。
  2. Integer变量必须实例化后才能使用,int可以直接使用
  3. Integer的默认值是null,int默认值是0
  4. Integer变量实际上是对象的引用,指向new的Integer对象,int是直接存储数据

8.装箱和拆箱

Integer i = 10; //装箱
int n = i;      //拆箱

Java 为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes)。例如:int的包装类为Integer、double的包装类为Double等等。

什么是装箱和拆箱呢?简单说基本数据类型转换为包装类的过程称为装箱,例如把 int 包装成 Integer 类的对象;包装类变为基本数据类型的过程称为拆箱,例如把 Integer 类的对象重新简化为 int。

参考文档

  • java后端面试题:Java基础 - 不会fly的pig - 博客园 (cnblogs.com)
  • 接口和抽象类有什么区别?_danteshenqu的博客-CSDN博客_接口与抽象类的区别
  • 构造方法有哪些特点及他的作用?_F在路上的博客-CSDN博客_构造方法有哪些特性?
  • Java包装类、装箱和拆箱 (biancheng.net)
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Java 面试
最后更新:2023年 11月 23日

小呆呆

知足常乐,就会拥有幸福

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

小呆呆

知足常乐,就会拥有幸福

最新 热点 随机
最新 热点 随机
数据库索引简析 Java多线程的使用场景以及线程的创建方式 Spring事务的使用示例和传播行为以及失效场景 Spring Boot使用JUnit和Mockito进行Service层单元测试 Spring Cloud Zuul和Gateway的简单示例(搭建方式) Spring Cloud的网关Zuul和Gateway
Spring Boot项目搭建方式 MySQL和mysql-connector-java、Java的版本问题 Java面试高频(二) 修复bug翻车记录 Spring Boot使用JUnit和Mockito进行Service层单元测试 Spring Cloud Eureka的理解以及搭建方式(实现示例)
标签聚合
后端 面试 干货 Java SpringBoot Spring MySQL SpringCloud
最近评论
我是可是尼古拉斯·爱新觉·罗·G·钰豪啊 发布于 3 年前(04月08日) 我来注水了胜哥 :hehe:
鸟人金 发布于 3 年前(03月03日) v
鸟人金 发布于 3 年前(03月03日) 胜哥yyds
鸟人金 发布于 3 年前(03月03日) 我滴偶像!!!!!!!!!!!!!!!
水军2号 发布于 3 年前(03月03日) 胜哥tql
归档
  • 2024 年 2 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2022 年 11 月
  • 2022 年 8 月
  • 2022 年 6 月
  • 2022 年 4 月
  • 2022 年 3 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 9 月
  • 2021 年 8 月
  • 2021 年 6 月
  • 2021 年 4 月
  • 2020 年 10 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 6 月
  • 2020 年 5 月
  • 2020 年 4 月
  • 2020 年 3 月

COPYRIGHT © 2023 小呆呆的生活. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2020104583号

粤公网安备44011802000463号