普歌 -- Java基础高频面试题总结(一)


一、Java基础

java基本数据类型及包装类?

基本数据类型:

  • 整型:byte short int long
  • 浮点型:float double
  • 字符型:char
  • 逻辑型:boolean

包装类:

  • Byte Short Integer Long Float Double Character Boolean
    在这里插入图片描述

重载和重写的区别?

  • 重载: 发生在同一个类中,方法名必须相同,参数类型、个数、顺序不同,与返回值类型,访问修饰符无关,发生在编译时。
  • 重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类, 访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

String 和 StringBuffer、StringBuilder的区别?

  • 可变性:String底层使用final修饰了,所以是不可变的;StringBuilder 与 StringBuffer是可变的字符串;
  • 安全性:String 中的对象是不可变的,也就可以理解为常量,线程安全。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是不线程安全的。
  • 性能:每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的String 对象,修改内容时性能低。StringBuffer、StringBuilder每次都会对对象本身进行操作,而不是生成新的对象并改变对象引用;StirngBuilder的效率会高一些,而StringBuffer的底层加了同步的关键字,性能会有所下降

所以呢,一般我们操作少量的字符串的时候用String ,在单线程环境下操作大量数据时使用StringBuilder,在多线程操作大量数据使用StringBuffer。

== 和equals?

  • == 判断两个对象是不是内存中同一个对象。但如果有基本数据类型参与比较,无论是基本数据类型相互比较,还是基本数据和他们的封装类比较,都比较的是值,引用数据类型之间比较的是内存地址。
  • equals():作用也是判断两个对象是否相等。但它一般有两种使用情况,一种这个类没有重写equals() 方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 另一种就是类重写了 equals()方法,重写了之后就按照重写的逻辑来判断了。一般,我们都覆盖 equals() 方法来比较两个对象的内容相等;若它们的内容相等,就认为两个对象是相等的。

final、finally、finalize 的区别?

  • final是一个安全修饰符,就是用final修饰的类不能被继承,用final声明的方法不能被重写,使用final声明的变量就相当于常量,不能被修改。
  • finally是在异常里经常用到的,就是try和cach里的代码执行完以后,必须要执行的方法,我们经常在finally里写一些关闭资源的方法,关闭IO流什么的,就算是try和catch里有return代码,也会执行finally里的内容的。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以被垃圾回收。

抽象类和接口的区别?

相同点:都不能被实例化,都可以定义抽象方法
不同点:从设计层面来说,抽象是对类的抽象,是一种模板设计(抽象类型),接口是行为的抽象,是一种行为的规范(抽象功能)。

  • 接口使用interface声明,抽象类使用abstract class 声明。
  • jdk1.7之前接口中声明的所有方法都是public 的抽象方法(没有方法体);jdk1.8后接口中可以声明默认/静态方法;
    抽象类中不仅可以声明抽象方法还可以声明普通方法(带有方法体)
  • 接口里定义的变量只能是公共的静态的常量,抽象类中可以声明常量和变量
  • 接口中不能声明构造器,抽象类中可以声明构造器(用于被子类调用)

java类加载机制

类加载是JVM将.class文件加载到内存(类信息放到运行时数据区的方法区内,堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构),并对数据进行校验、转换和初始化以形成可使用Java类的机制。

在这里插入图片描述

面向对象的特征有哪些方面?

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两 方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义 的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口
(比如普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单)。
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超 类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
多态性多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须刀是 A 系统,它的供电系统是 B 系统,B 系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

在Java 中,如何跳出当前的多重嵌套循环?

要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的的break语句,即可跳出。
举例:

ok:
for(int i=0;i<10;i++){
     for(int j=0;j<10;j++){
        system.out.println("i="+i+",j="+j);
        if(j==5)
break ok;
   }
}

java 的类加载顺序?

  1. 所有的类都会优先加载基类;
  2. 静态成员的初始化优先;
  3. 成员初始化后,才会执行构造方法;

静态成员的初始化与静态块的执行,发生在类加载的时候;成员加载在对象创建时;类对象的以及静态块的访问,都会触发类的加载。

什么是反射?

反射是指在运行状态中,可以获取任意一个类或一个对象的所有信息(类中声明的方法、属性、构造器)以及动态调用对象中方法、构造器的机制。
一般都是使用Class clazz=Class.forName(“类的全路径”)这个方法,获取到class对象,然后通过该class对象获取到类中所有的method方法、属性,调用Method的invoke方法就可以执行该方法,但是如果是私有方法的话,必须通过getDeclaredMethod获取,还需要调用方法的setAccessible设置为true才可以执行。


欢迎大家雅正留言!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值