Java核心技术面试总结——Java基础

更新时间:2023-07-12 22:28:55 阅读: 评论:0

Java核⼼技术⾯试总结——Java基础
1、⾯向对象可以解释下吗?都有那些特性?
⾯向对象是对现实的理解和抽象的⼀种软件开发⽅法,具有封装、继承与多态的特性。
封装:将事物封装成⼀个类,较少耦合,隐藏细节。保留特定的接⼝与外界联系,当接⼝内部发⽣改变时,不会影响外部调⽤⽅法。
继承:已知类的派⽣新的类,新类拥有已知类的属性或⽅法,可以通过覆写来增强已知类的功能。
多态:⼀个程序中存在多个同名的不同⽅法,通过三种⽅式实现:
|- 重载:在⼀个类中对⽅法进⾏重载实现。
|- 覆写:⼦类对⽗类的覆写实现。
|- 转型:将⼦类对象作为⽗类对象使⽤来实现。
知识点:
覆写:是指⼦类和⽗类之间⽅法的⼀种关系,⽐如说⽗类拥有⽅法A,⼦类扩展了⽅法A并且添加了丰富的功能。那么我们就说⼦类覆盖或者重写了⽅法A,也就是说⼦类中的⽅法与⽗类中继承的⽅法有完全相同的返回值类型、⽅法名、参数个数以及参数类型。
重载:指在⼀个类中(包括⽗类)存在多个同名的不同⽅法,这些⽅法的参数个数,顺序以及类型不同均可以构成⽅法的重载。如果仅仅是修饰符、返回值、抛出的异常不同,那么这是2个相同的⽅法。
多态:
把不同的⼦类对象都当作⽗类对象来看,可以屏蔽不同⼦类对象之间的差异,写出通⽤的代码,做出通⽤的编程,以适应需求的不断变化。这样操作之后,⽗类的对象就可以根据当前赋值给它的⼦类对象的特性以不同的⽅式运作。
教学是什么
对象的引⽤型变量具有多态性,因为⼀个引⽤型变量可以指向不同形式的对象,即:⼦类的对象作为⽗类的对象来使⽤。在这⾥涉及到了向上转型和向下转型。
向上转型:
⼦类对象转为⽗类,⽗类可以是接⼝。
公式:Father f = new Son(); Father是⽗类或接⼝,Son是⼦类。
向下转型:
⽗类对象转为⼦类。公式:Son s = (Son) f;
在向上转型的时候我们可以直接转,但是在向下转型的时候我们必须强制类型转换。并且,如案例中所述,该⽗类必须实际指向了⼀个⼦类对象才可强制类型向下转型,即其是以这种⽅式Father f = new Son()创建的⽗类对象。若以Father f = new Father()这种⽅式创建的⽗类对象,那么不可以转换向下转换为⼦类的Son对象,运⾏会报错,因为其本质还是⼀个Father对象。
2、只有⽅法返回值不同可以构成重载吗?
不可以,因为我们调⽤某个⽅法,有时候并不关⼼其返回值,这个时候编译器根据⽅法名和参数⽆法确定我们调⽤的是哪个⽅法。
1、JDK、JRE和JVM的联系?
JVM(Java Virtual Machine)Java虚拟机的规范,独⽴于硬件和操作系统,具有平台⽆关性,⽽这也是Java程序可以⼀次编写,多处执⾏的原因。⽐如:Hotspot VM。
JRE(Java Runtime Environment)JVM 标准加上实现的⼀⼤堆基础类库,就组成了 Java 的运⾏时环境。JRE包含了JVM,但是不包含Java编译器/调试器之类的开发⼯具
JDK(Java Development Kit)是⼀个开发⼯具包,除了 JRE,JDK 还提供了⼀些⾮常好⽤的⼩⼯具,⽐如 javac、java、jar 等。。
2、Java跨平台性是怎么实现的?
因为Java⽂件执⾏过程是:Java ⽂件->编译器>字节码->JVM->机器码,机器码调⽤操作系统的相关函数。在这个过程中,JVM 上承开发语⾔,下接操作系统,它的中间接⼝就是字节码,这样相当于屏蔽了操作系统和底层硬件的差异。
3、Java语⾔是编译型还是解释型语⾔?
Java的执⾏经历了编译和解释的过程,是⼀种先编译,后解释执⾏的语⾔,不可以单纯归到编译性或者解释性语⾔的类别中。
1、抽象类与接⼝的区别?
接⼝中的⽅法在JDK8之前只能是抽象的,JDK8版本开始提供了接⼝中⽅法的default实现
抽象类和类⼀样是单继承的;接⼝可以实现多个⽗接⼝
抽象类中可以存在普通的成员变量;接⼝中的变量必须是static final类型的,必须被初始化,接⼝中只有常量,没有变量抽象类接⼝
定义abstract class 抽象类的名称 { }interface 接⼝名称 { }
组成构造⽅法、抽象⽅法、普通⽅法、static⽅法、全局常量、成员抽象⽅法、defaullt + 普通⽅法、static⽅法、全局常量
权限可以使⽤各种权限定义只能够使⽤public
⼦类使⽤⼦类可以通过extends关键字继承⼀个抽象类⼦类使⽤implements关键字可以实现多个接⼝
两者关系抽象类可以实现若⼲个接⼝接⼝不许继承抽象类,但是允许继承多个⽗接⼝
使⽤1、抽象类和接⼝必须定义⼦类
2、⼦类⼀定要覆写抽象类和接⼝中的抽象⽅法
3、通过⼦类的向上是实现抽象类或接⼝的对象实例化
2、接⼝与抽象类应该怎样选择?分别在什么情况下使⽤呢?(*)
仅仅需要定义⼀些抽象⽅法⽽不需要其余额外的具体⽅法或者变量的时候,我们可以使⽤接⼝。
反之,使⽤抽象类。
那么JDK8中为什么会出现默认⽅法呢?
使⽤接⼝,使得我们可以⾯向抽象编程,但是其有⼀个缺点就是当接⼝中新增或者更改⼀个⽅法的时候,需要修改所有的实现类。在接⼝路中如果有默认⽅法就不需要更改所有的实现类,只需要在接⼝中实现就⾏。
1、Java中的8种基本数据类型及其占⽤空间
Java种的8种基本数据类型分别是:byte,short,int,long,float,double,char以及boolean。boolean类型的取值为true和fal两种,其余每⼀种基本类型都占有⼀定的字节,并且拥有着最⼤值和最⼩值。⽐如int的取值范围为 Integer.MIN_VALUE 到Integer.MAX_VALUE。这⾥给出每种基本类型所占⽤的字节数:
byte:1字节
short:2字节
耽美晋江char:2字节
int:4个字节
float:4字节
long:8字节
double:8字节
boolean:Java规范中并没有规定boolean类型所占字节数
1、Java中的元注解有哪些?(*)
Java中提供了4个元注解,元注解的作⽤是负责注解其它注解。
@Target:说明注解所修饰的对象范围;
@Retention:留策略定义了该注解被保留的时间长短。其中,SOURCE:表⽰在源⽂件中有效(即
源⽂件保留);CLASS:表⽰在class ⽂件中有效(即class保留);RUNTIME:表⽰在运⾏时有效(即运⾏时保留)。例如,@Retention(RetentionPolicy.RUNTIME)标注表⽰该注解在运⾏时有效。
@Documented:这个注解只是⽤来标注⽣成javadoc的时候是否会被记录。使⽤@Documented标注了,在⽣成javadoc的时候就会把
@Documented注解给显⽰出来。
@Inherited:该注解是⼀个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果⼀个使⽤了@Inherited修饰的annotation类型被⽤于⼀个class,则这个annotation将被⽤于该class的⼦类。
1、说说Java中反射机制?(*)
西芹炒百合的做法反射机制是指在运⾏中,对于任意⼀个类,都能够知道这个类的所有属性和⽅法。对于任意⼀个对象,都能够调⽤它的任意⼀个⽅法和属性。即动态获取信息和动态调⽤对象⽅法的功能称为反射机制。
如何获取Class类,获取Class类有三种基本⽅式:
通过类名称.class来获取Class类对象:
在某方面帮助某人通过对象.getClass( )⽅法来获取Class类对象:
通过类名称加载类Class.forName( ),只要有类名称就可以得到Class:
知识点:
反射机制的作⽤:
在运⾏时判断任意⼀个对象所属的类
在运⾏时构造⼀个类的对象
在运⾏时判断任意⼀个类所具有的成员变量和⽅法
在运⾏时调⽤任意⼀个对象的⽅法,⽣成动态代(dai)理
与反射相关的类:
Class:表⽰类,⽤于获取类的相关信息
Field:表⽰成员变量,⽤于获取实例变量和静态变量等
Method:表⽰⽅法,⽤于获取类中的⽅法参数和⽅法类型等
Constructor:表⽰构造器,⽤于获取构造器的相关参数和类型等
1、Java中的Exception和Error有什么区别?
Throwable中提供两个⼦类:
Error:此时程序还未执⾏出现的错误。
Exception:程序中出现的异常,可以被捕获并进⾏相应的处理;
2、请解释RuntineException与Exception的区别?请例举出⼏个你常见的RuntimeException?
RuntimeException是Exception的⼦类,
RuntimeException标注的异常可以不需要进⾏强制性处理,⽽Exception异常必须强制性处理;
常见的RuntimeException异常:、 、 等。
1、JIT编译器有了解吗?(*)
答:前⾯我们谈到了Java是⼀种先编译,后解释执⾏的语⾔。那么我们就来说下何为JIT编译器吧。
JIT编译器全名叫Just In Time Compile 也就是即时编译器,把经常运⾏的代码作为"热点代码"编译成与本地平台相关的机器码,并进⾏各种层次的优化。JIT编译除了具有缓存的功能外,还会对代码做各种优化,包括逃逸分析、锁消除、 锁膨胀、⽅法内联、空值检查消除、类型检测消除以及公共⼦表达式消除等。
知识点:
逃逸分析:
逃逸分析的基本⾏为就是分析对象动态作⽤域,当⼀个对象在⽅法中被定义后,它可能被外部⽅法所引⽤,例如作为调⽤参数传递到其他地⽅中,称为⽅法逃逸。JIT编译器的优化包括如下:
同布省略:也就是锁消除,当JIT编译器判断不会产⽣并发问题,那么会将同步synchronized去掉
标量替换
我们先来解释下标量和聚合量的基本概念。
标量(Scalar)是指⼀个⽆法再分解成更⼩的数据的数据。Java中的原始数据类型就是标量。
聚合量(Aggregate)是还可以分解的数据。Java中的对象就是聚合量,因为他可以分解成其他聚合量和标量。
在JIT阶段,如果经过逃逸分析,发现⼀个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若⼲个其中包含的若⼲个成员变量来代替。这个过程就是标量替换。标量替换的好处就是对象可以不在堆内存进⾏分配,为栈上分配提供了良好的基础。
那么逃逸分析技术存在哪些缺点呢?
    技术不是特别成熟,分析的过程也很耗时,如果没有⼀个对象是不逃逸的,那么就得不偿失了。
1、Java中的值传递和引⽤传递可以解释下吗?
值传递和引⽤传递的解释可以概括如下。
值传递,意味着传递了对象的⼀个副本,即使副本被改变,也不会影响源对象。
引⽤传递,意味着传递的并不是实际的对象,⽽是对象的引⽤。因此,外部对引⽤对象的改变会反映到所有的对象上。
因为如果参数是基本数据类型,那么是属于值传递的范畴,传递的其实是源对象的⼀个copy副本,不会影响源对象的值。
1、String、StringBuffer与StringBuilder的区别?
String 类是字符串的⾸选类型,其最⼤的特点内容不可修改;
狐白裘StringBuffer与Stringbuilder类的内容允许修改;
StringBuffer是在JDk1.0时候提供的,属于线程安全的操作;⽽StringBuilder是在JDK1.5提供的属于⾮线程安全的操作;
2、Java中的泛型的理解(*)
泛型的本质在于,类中的属性或⽅法的参数与返回值的类型,可以由对象的实例化的时候决定。
泛型之中只允许设置引⽤类型,如果现在要操作基本类型,则必须使⽤包装类,⽐如:使⽤Integer,不⽤int;
泛型是在编译期间有效,在运⾏阶段就会去泛型化,也就是将泛型信息抹掉,这也是不⽀持泛型数组的原因。
编译器可以在编译期提供⼀定的类型安全检查,过滤掉⼤部分因为类型不符⽽导致的运⾏时异常。
3、Java序列化与反序列化的过程
⼀个对象只要实现了 Serilizable接⼝,这个对象就可以被序列化。
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
JDK类库中序列化的步骤
步骤⼀:创建⼀个对象输出流,它可以包装⼀个其它类型的⽬标输出流,如⽂件输出流:
ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));
步骤⼆:通过对象输出流的writeObject()⽅法写对象:
out.writeObject(“Hello”);
out.writeObject(new Date());
JDK类库中反序列化的步骤
高空作业安全>快手签名步骤⼀:创建⼀个对象输⼊流,它可以包装⼀个其它类型输⼊流,如⽂件输⼊流:
ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));
步骤⼆:通过对象输出流的readObject()⽅法读取对象:
String obj1 = (adObject();
Date obj2 = (adObject();
4、equals和hashCode⽅法的关系?
hashCode()⽅法和equals()⽅法的作⽤其实⼀样,在Java⾥都是⽤来对⽐两个对象是否相等⼀致。
⼀个是性能,⼀个是可靠性。他们之间的主要区别也基本体现在这⾥。
equals()既然已经能实现对⽐的功能了,为什么还要hashCode()呢?
因为重写的equals()⾥⼀般⽐较的⽐较全⾯⽐较复杂,这样效率就⽐较低,⽽利⽤hashCode()进⾏对⽐,则只要⽣成⼀个hash值进⾏⽐较就可以了,效率很⾼。
保护眼睛的颜色
hashCode()既然效率这么⾼为什么还要equals()呢?
equals()相等的两个对象他们的hashCode()肯定相等,也就是⽤equals()对⽐是绝对可靠的。
hashCode()相等的两个对象他们的equals()不⼀定相等,也就是hashCode()不是绝对可靠的。
5、Java和C++的区别有哪些?
所有代码(包括函数、变量等)必须在类中实现,除基本数据类型 (包括int、float等)外,所有类型都是类。此外,Java语⾔中不存在全局变量或全局函数,⽽C++兼具⾯向过程和⾯向过程编程的特点,可以定义全局变量和全局函数。
与C/C++语⾔相⽐,Java语⾔中没有指针概念,这有效防⽌了C/C++语⾔中操作指针可能引起的系统问题,从⽽使程序变得更加安全与C++语⾔相⽐,Java语⾔不⽀持多重继承,但是Java语⾔引⼊了接⼝的概念,可以同时实现多个接⼝。由于接⼝也具有多态多态特性,因此在Java语⾔中可以通过实现多个接⼝来实现与C++语⾔中多重继承类似的⽬的。
在C++语⾔中,需要开发⼈员去管理对内存的分配(包括申请与释放),⽽Java语⾔提供了垃圾回收器来实现垃圾的⾃动回收,不需要程序显⽰地管理内存的分配。在C++语⾔中,通常都会把释放资源的代码放到析构函数中,Java语⾔中虽然没有析构函数,但却引⼊了⼀个 finalize() ⽅法,当垃圾回收
器将要释放⽆⽤对象的内存时,会⾸先调⽤该对象的 finalize() ⽅法,因此,开发⼈员不需要关

本文发布于:2023-07-12 22:28:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093247.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   类型   实现   注解   变量   抽象类   过程   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图