面经总结:J2SE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面经总结:J2SE相关的知识,希望对你有一定的参考价值。

 

  • 面向对象的特性?

(1.特性;2.优点)
封装、继承、多态;
  封装:封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。优点:1.隐藏对象的属性来保护对象内部状态;2.禁止对象的不良交互提高模块化;
  继承:给对象提供了从基类获取字段和方法的能力。优点:提高代码的重用性;
  多态:指允许不同类的对象对同一消息做出相应。所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
  实现多态的三个条件:
  1)继承:在多态中必须存在有继承关系的子类和父类。
  2)重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  3)向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
  多态的特点:父类对象引用子类;1.可以调用父类方法;2.子类重写父类则调用子类方法;3.只存在子类的方法不可调用,子类重载父类的方法不可调用(重载的方法父类中不存在!);
  多态的优点:可扩充性,可以方便的增加新的子类不影响已存在类的功能特性。
 
 
  • static可以修饰什么?final可以修饰什么?

static 可以修饰什么:成员变量、成员方法、静态块;

final 可以修饰什么:成员变量、成员方法、类;

一、final关键字可以用来修饰类、方法、变量。各有不同。

A、修饰类(class)。 
     1、该类不能被继承。 
     2、类中的方法不会被覆盖,因此默认都是final的。 
     3、用途:设计类时,如果该类不需要有子类,不必要被扩展,类的实现细节不允许被改变,那么就设计成final类

B、修饰方法(method) 
     1、该方法可以被继承,但是不能被覆盖。 
     2、用途:一个类不允许子类覆盖该方法,则用final来修饰 
     3、好处:可以防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用fianal方法转入内嵌机制,提高了执行效率。 
     4、注意:父类中的private成员方法不能被子类覆盖,因此,private方法默认是final型的(可以查看编译后的class文件)

C、修饰变量(variable) 
     1、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。 
     2、特点:可以先声明,不给初值,这种叫做final空白。但是使用前必须被初始化。一旦被赋值,将不能再被改变。

D、修饰参数(arguments) 
     1、用final修饰参数时,可以读取该参数,但是不能对其作出修改

二、final关键字不能用来抽象类和接口。

 

  • Java修饰符的范围?

成员变量的修饰符:

private:自身可以访问,同包子类不能继承,同包类不能访问;

默认:自身可以访问,同包子类可以继承,同包类可以访问;

protected:自身可以访问,同包子类可以继承,不同包子类可以继承,同包类可以访问,其他类不可以访问;

public:不同包子类可以继承,其他类可以访问;

public > protected > default > private

public 指定该变量为公共的,他可以被任何对象的方法访问。

private 指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。

protected 指定该变量可以被自身和子类访问。在子类中可以覆盖此变量

技术分享

 

  • == 和 equals 的区别?

(1.基本类型; 2.基本类型封装;3.String;4.非字符串变量)

equals()是Object类的方法;

(1) 如果是基本类型比较,那么只能用==来比较,用equals会编译错误,因为不是对象。int a = 3;

(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。Integer n1 = new Integer(30);

(2.5)对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的。

(3)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同。

String s1 = "123"; 
String s2 = "123"; 

String s4 = new String("123"); 
String s5 = new String("123"); 

s1==s2 true;   s1.equals(s2) true;   

s4==s5 false;   s4.equals(s5) true;

s1==s4 false;   s1.equals(s4) true;

s1/s2分别指向字符串常量"123"创建的对象,在常量池里只有一个对象,内容为"123";

s4/s5两个引用对象指向的对象内容相同,但是new操作符创建的,内存中分配两块空间给这两个对象,所以内存地址不同。

(4)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

 

  • 基本数据类型?

基本类型有八种:

整型4种:byte/short/int/long  字节数:1/2/4/8

字符型1种:char  2

浮点型2种:float/double  4/8

布尔型1种:boolean 1/8

一个字节等于8位,等于256个数,就是-128到127

大写的B表示Bytes=字节;小写的b表示bit=位;1byte=8bit;

自动转换:(小可转大,大转小会失去精度)

byte -> short/char -> int -> long -> float -> double

 

  •  error/exception/runtime exception区别?

Error和Exception都实现了Throwable接口 
Error指的是JVM层面的错误,比如内存不足OutOfMemoryError
Exception 指的是代码逻辑的异常,比如下标越界OutOfIndexException

Exception分为可查异常CheckedException和运行时异常RuntimeException:

可查异常是必须处理的异常,要么try catch住,要么往外抛,谁调用,谁处理,比如 FileNotFoundException、IOException、SQLException等。如果不处理,编译器就不让你通过。

运行时异常 又叫做非可查异常,在编译过程中,不要求必须进行显示捕捉。

常见的Runtime Excepiton?

NullPointerException 空指针异常
ArithmeticException 算术异常,比如除数为零
ClassCastException 类型转换异常
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常 
IndexOutOfBoundsException 数组下标越界异常
NegativeArraySizeException 为数组分配的空间是负数异常

为什么分两种异常?

Java之所以会设计运行时异常的原因之一,是因为下标越界,空指针这些运行时异常太过于普遍,如果都需要进行捕捉,代码的可读性就会变得很糟糕。

 

  • object类的方法?

9种;(简要介绍各方法)

  1.对象的复制/获取/String/释放:clone/getClass/toString/finalize;

  2.hash:equals/hashCode;

  3.多线程:wait/notify/notifyAll

clone:实现对象的浅复制;

getClass:获得运行时类对象;

finalize:用于释放资源;

equals:比较对象是否相等;基本类型不可以用equals,对于String类型“equals”和“==”作用不同;

hashcode:用于hash寻找;

wait:使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁;wait()方法一直等待,直到获得锁或者被中断。wait(longtimeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生:

(1)其他线程调用了该对象的notify方法。

(2)其他线程调用了该对象的notifyAll方法。

(3)其他线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

notify:唤醒在该对象上等待的某个线程

 

  • 反射机制?

反射机制实际上就是动态的加载一些类,这些类在编译时不需要加载,但运行时再调用。
反射是在运行时获取类信息,通过动态的调用来改变程序行为。
 
 
  • 抽象类和接口的区别?

(1.变量;2.方法(抽象、public);3.一/多;)
  1)变量:接口的变量默认是final的,而抽象类可以包含非final变量;
  2)方法:接口中的方法默认是public,抽象类方法可以是private/protected/public;接口中只能提供抽象方法,而抽象类中既可以提供抽象方法,也可以提供实现方法;
  3)一个类可以实现很多接口,但只能继承一个抽象类;
 
  • Class中方法的执行顺序?

static{} > {} > className{} > method(){}

静态代码块>匿名方法块>构造方法>普通方法。

 

 

 




















以上是关于面经总结:J2SE的主要内容,如果未能解决你的问题,请参考以下文章

FB近期面经总结

大佬有用的面经总结

万字长文 | 2023届推荐算法岗面经总结!

程序员面经分享|后端开发经验总结

Java开发三年的面经总结,一份面试阿里网易的面经(高开岗)

Java开发三年的面经总结,一份面试阿里网易的面经(高开岗)