Java面试知识点2

1.深拷贝和浅拷贝区别是什么?如何实现对象克隆与深拷贝

区别
浅拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量和变量指向堆内存中的对象的指针,不复制堆内存中的对象;

深拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量和变量指向堆内存中的对象的指针和堆内存中的对象。

实现
1.实现Cloneable接口,重写clone()方法;
2.不实现Cloneable接口,会报CloneNotSupportedException异常;
3.Object的clone()方法是浅拷贝,即如果类中属性有自己定义引用类型,只拷贝引用,不拷贝引用指向的对象;

以下两种完成深拷贝

  1. 对象的属性Class也实现Cloneable接口,在克隆对象时也手动克隆属性;
  2. 结合序列化(JDK java.io.Serializable接口、JSON格式、XML格式等),完成拷贝)。

2.Java的安全性体现在哪里?

1.使用了引用取代了指针,指针的功能强大,但是也容易造成错误,如数组越界等问题;
2.拥有一套异常处理机制,使用关键字thtow,throws,try,catch,finally;
3.强制类型转换需要符合一定规则;
4.字节码传输使用了加密机制;
5.运行环境提供保障机制:字节码校验器->类加载器->运行时内存布局->文件访问限制;
6.不用程序员显示控制内存释放,JVM有垃圾回收机制。

3.什么是JVM、JDK、JRE?JDK,JRE,JVM之间的关系是什么样的?

JVM
1.Java Virtual Machine(Java虚拟机)的缩写;
2.实现跨平台的最核心部分;
3…class文件会在JVM上执行,JVM会解释给操作系统执行;
4.有自己的指令集,解释自己的指令到CPU指令集和系统资源的调用;
5.JVM只关注被编译的.class文件,不关心.java源文件。

JDK
1.Java Development Kit(Java开发工具包)的缩写,用于java程序的开发,提供给程序员使用;
2.使用Java语言编程都需要在计算机上安装一个JDK;
3.JDK的安装目录包括5个文件夹,一个src类库源码压缩包和一些说明文件:
bin:各种命令工具,java源码的编译器javac,监控工具jconsole,分析工具jvisualvm等;
include:与JVM交互C语言用的头文件等;
lib:类库;
jre:Java运行环境;
db:安装Java DB的路径;
src.zip:Java所有核心类库的源码;
jdk1.8新添加了javafx-src.zip文件,存放JavaFX脚本,JavaFX是一种声明式、静态类型编程语言。

JRE
Java Runtime Environment(Java运行环境)的缩写,,包含JVM标准实现及Java核心类库,这些都是运行Java程序的必要组件,是Java程序的运行环境,并不是一个开发环境,没有包含任何开发工具(如编译器和调试器)
是运行基于Java语言编写的程序所不可缺少的运行环境,通过它,Java程序才能正常运行。

关系
JDK是JAVA程序开发时用的开发工具包,包含Java运行环境JRE;
JDK、JRE内部都包含JAVA虚拟机JVM;
JVM包含Java应用程序的类的解释器和类加载器等。

4.& 和 &&的作用和区别,| 和 || 的作用和区别

&:逻辑与,&两边的表达式都会进行运算,整数的运算符;
&&:短路与,&&左边的表达式结果为false时,&&右边的表达式不参与计算。

| :逻辑或,| 两边的表达式都会进行运算,整数的或运算符;
|| :短路或,|| 左边的表达式结果为true时, || 右边的表达式不参与运算。

5.如何让计算机最高效的算出2乘以8?

2<<3

位运算符,<< 是将一个数左移n位,相当于乘以了2的n次方,一个数乘以8只要将其左移3位即可;
cpu直接支持位运算,效率最高。

6.Java中基本类型的转化规则

等级低到高:byte < char < short < int < long < float < double

自动转换:运算过程中,低级可以自动向高级转换;
强制转换:高级需要强制转换为低级,可能会丢失精度;

规则:

  1. = 右边先自动转换成表达式中最高级的数据类型,再进行运算;
  2. = 左边数据类型级别>右边数据类型级别,右边会自动升级;
  3. = 左边数据类型级别<右边数据类型级别,需要强制转换右边数据类型;
  4. 整型常量赋值给 byte,short,char,int,long时超过类型最大值,超过需要强转。

7.Java中数组有什么特征?

1.在内存中申请一块连续的空间;
2.数组下标从0开始;
3.每个数组元素都有默认值,基本类型的默认值是0、0.0、false,引用类型的默认值为null;
4.数组的类型只能是一个,且固定,申明时确定;
5.数组的长度一经确定,无法改变,即定长,要改变长度只能重新声明一个;

8.可变参数的作用和特点是什么?

作用:在不确定参数的个数时,可以使用可变参数。
语法:参数类型…

特点
1.每个方法最多只有一个可变参数;
2.可变参数必须是方法的最后一个参数;
3.可变参数可以设置为任意类型:引用类型、基本类型;
4.参数的个数也可以是0个,1个或多个;
5.可变参数也可以传入数组;
6.无法仅通过改变 可变参数的类型 来重载方法;
7.通过对class文件反编译可以发现,可变参数被编译器处理成了数组。

9.类和对象的关系?对面向过程和面向对象的理解?

关系
类是对象的抽象,对象是类的具体实例;
类是抽象的、,不占用内存;对象是具体的,占用存储空间;
类是一个定义包括包括在一类对象中的方法和变量的模板;

理解
1.软件开发思想,先有过程,后有面向对象。
2.在开发中,面向过程的做法不足,从而推出了面向对象,都是解决实际问题的思维模式,两者相辅相成,宏观上面向对象把握复杂事物的关系,微观上面向过程去处理;
3.面向过程以实现功能的函数开发为主,面向对象要首先抽象出类、属性及其方法,然后通过实例化类,执行方法来完成功能;
4.面向过程是封装的是功能,面向对象封装的是数据和功能
5.面向对象具有继承性和多态性,面向过程则没有。

10.方法重载和重写是什么?区别?

重写:在子类中将父类的成员方法的名称保留,重写编写成员方法的实现内容,更改方法的访问权限,修改返回类型的为父类返回返回类型的子类。

1.重写发生在子类继承父类;
2.参数列表必须完全与被重写方法的相容 ;
3.重写父类方法时,修改方法的权限只能从小范围到大范围;
4.返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的子类;
5.访问权限不能比父类中被重写的方法访问权更低;
6.重写方法不能抛出新的异常和比被重写方法声明更宽泛的异常;
7.声明为final,static,private的方法不能把被重写;

重载:一个类中允许存在一个以上的同名方法,这些方法的参数个数或者类型不同(条件:方法名相同,参数类型不同 或 参数个数不同 或 参数顺序不同)。
1.被重载的方法可以修改返回类型;
2.被重载方法可以修改访问修饰符;
3被重载方法可以修改异常抛出 ;
4.方法能够在同一个类或者一个子类中被重载 ;
5.无法以返回值类型作为重载函数的区分标准;

区别
1.作用范围:重写的作用方位是父类和子类之间;重载是发生在一个类里面;
2.参数列表:重写不能修改,重载必须不同;
3.返回类型:重载可修改,重写方法返回相同类型或子类;
4.抛出异常:重载可修改,重写可减少或删除,一定不能抛出新的异常或更广的异常;
5.访问权限:重载可修改,重写一定不不能做更严格的限制。

11.this和super关键字的作用

this
1.对象内部指代自身的引用;
2.解决成员变量和局部变量相同名字问题 ;
3.可以调用成员变量;
4.不能调用局部变量;
5. 可以调用成员方法;
6. 在普通方法中可省略this;
7.在静态方法中不允许this关键字。

super
1.代表对当前对象的直接父类对象的引用;
2.可以调用父类的非private成员变量和方法 ;
3.super()可以调用父类构造方法,只限构造方法中使用,且必须是第一条语句。

12.static关键字的作用是什么?abstract关键字的作用是什么?

static
1.static可以修饰变量、方法、代码块和内部类;
2.static变量是这个类所有,由该类创建的所有对象共享同一个static属性;
3.可以通过创建的对象名.属性名 和类名.属性名两种方式访问;
4.static变量在内存中只有一份;
5.static修饰的变量只能是类的成员变量;
6.static方法可以通过对象名.方法和类型.方法名两种方式来访问;
7.static代码块在类被第一次加载时执行静态代码块,且被执行一次,主要作用是实现static属性的初始化;
8.static内部类属于整个外部类,而不属于外部类的每个对象,只可以访问外部类的静态变量和方法;

abstract
1.可以修饰类和方法,不能修饰属性和构造方法;
2.abstract修饰的类是抽象的类,需要被继承;
3.abstract修饰的方法是抽象方法,需要子类被重写;

13.子类构造方法的执行过程是什么样的?

子类构造方法的调用规则

  1. 如果子类的构造方法中没有通过super显式调用父类的有构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。这种情况下,写不写super()效果是一样;
  2. 如果子类的构造方法中通过super显式调用父类的有参构造方法,将会执行父类相应的构造方法,不执行父类无参构造方法;
  3. 如果子类的构造方法中通过this显式调用自身的其他构造方法,将会执行类中相应的构造方法;
  4. 如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。

14.什么Java的多态?

实现多态的三个条件

  1. 继承的存在,继承是多态的基础,没有继承就没有多态;
  2. 子类重写父类的方法,JVM会调用子类重写后的方法;
  3. 父类引用变量指向子类对象;

向上转型:将一个父类的引用指向一个子类对象,自动进行类型转换。
1.通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法;
2.通过父类引用变量无法调用子类特有的方法。

向下转型:将一个指向子类对象的引用赋给一个子类的引用,必须进行强制转换。
1.向下转型必须转换为父类引用指向的真实子类,不是任意的强制转换,否则会出现ClassCastException;
2.向下转型时可以结合使用instanceof运算符进行判断。

15.instanceof关键字的作用是什么?

instanceof运算符是用来运行时判断对象是否指定类及其父类的一个实例,比较的是对象,不能比较基本类型。

16.什么是Java的垃圾回收机制?

垃圾回收机制,简称GC
1.Java语言不需要程序员直接控制内存回收,由JVM在后台自动回收不再使用的内存;
2.提高编程效率;
3.保护程序的完整性;
4.JVM需要跟踪程序中有用的对象,确定哪些是无用的,影响性能。

特点

  1. 回收JVM堆内存的对象空间,不负责回收栈内存数据;
  2. 无法处理一些操作系统资源的释放,如数据库连接、输入流、Socket连接;
  3. 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行;
  4. 可以将对象的引用变量设置为null,垃圾回收机制可以在下次执行时回收该对象;
  5. JVM有多种垃圾回收,实现算法,表现各异;
  6. 垃圾回收机制回收任何对象之前,会先调用对象的finalize()方法;
  7. 可以通过System.gc()或Runtime.getRuntime().gc()通知系统进行垃圾回收,会有一些效果,但系统是否进行垃圾回收依然不确定;
  8. 不要主动调用对象的finalize()方法,应该交给垃圾回收机制调用。

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

1.基本类型只有值,而包装类型则具有与它们的值不同的同一性(即值相同但不是同一个对象);
2.包装类型比基本类型多了一个非功能值:null;
3.基本类型通常比包装类型更节省时间和空间,速度更快;

某些情况下使用包装类型更合理:

  1. 泛型不支持基本类型,作为集合中的元素,键和值直接使用包装类(否则会发生基本类型转包装类的自动装箱,更消耗性能);
  2. 在进行反射方法时的调用;

18.什么是包装类?为什么要有包装类?基本类型与包装类如何进行转换?

Java是一个面向对象的编程语言,但是Java中的8种基本数据类型却是不是面向对象的,为了方便使用和解决这个不足,在设计类时为每个基本数据类型设计了一个相应的类进行代表,这就是8种基本数据类型对应的包装类。

基本类型-包装类型 :byte-Byte,boolean-Boolean,short-Short,char-Character,int-Integer,long-Long,float-Float,double-Double.

为什么要有包装类

1.基本数据类型方便,简单,高效,但泛型不支持、集合元素不支持;
2.不符合面向对象思维;
3.包装类提供很多种方法,方便使用,如Integer类,toHexString(int i)、parseInt(String s)方法等等
如何转换?

  1. 包装类->基本数据类型:包装对象类.xxxValue();
  2. 基本数据类型->包装类:new 包装类(基本类型值);

JDK1.5开始提供了自动装箱和自动拆箱功能,实现了包装类和基本数据类型的自动转换。

19.new Integer(1024) 和Integer.valueOf(1024) 有没有什么区别呢?

new Integer(1024) 每次都会新建一个对象;
Integer.valueOf(1024) 会使用缓冲池中的对象,多次调用会取得同一个对象的引用;

注意:
Integer.valueOf(1024) 和Integer.valueOf(1024) 缺不等于true,而是false。
Integer.valueOf从缓冲池取的数值是有大小限制的,并不是任何数。

20.请问在Java中方法参数的传递方式是引用传递呢?还是值传递呢?

Java 的参数全都是是以值传递的形式传入方法中,而不是引用传递。
如果参数是基本类型,则传递的是基本类型的字面量值的拷贝。
如果参数是引用类型的话,传递的值则为该参数所引用的对象在堆中地址值的拷贝。

猜你喜欢

转载自blog.csdn.net/qq_42748009/article/details/111879977
今日推荐