Java面试题(基础)-Java类与注解

声明

本文首发于香菜喵,微信公众号为码以梦优先更文。

导航

点我查看其它面试题总结

Object

  • 简述Object类常用方法

(1)hashCode:通过对象计算出的散列码。用于map型或equals方法。需要保证同一个对象多次调用该方法,总返回相同的整型值。
(2)equals:判断两个对象是否一致。需保证equals方法相同对应的对象hashCode也相同。
(3)toString: 用字符串表示该对象
(4)clone: 浅拷贝一个对象

  • 两个对象值相同(x.equals(y) = = true),但却可有不同的hash code,这句话对不对?

不对,如果两个对象x和y满足x.equals(y) = = true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
扩展:equals方法介绍:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。
实现高质量的equals方法的诀窍包括:1. 使用==操作符检查"参数是否为这个对象的引用";2. 使用instanceof操作符检查"参数是否为正确的类型";3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode;6. 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

反射

  • Java反射机制是什么?

Java反射机制是指在程序的运行过程中可以构造任意一个类的对象、获取任意一个类的成员变量和成员方法、获取任意一个对象所属的类信息、调用任意一个对象的属性和方法。反射机制使得Java具有动态获取程序信息和动态调用对象方法的能力。可以通过以下类调用反射API。
Class类:可获得类属性方法
Field类:获得类的成员变量
Method类:获取类的方法信息
Construct类:获取类的构造方法等信息

  • 简述Java中Class对象

java中对象可以分为实例对象和Class对象,每一个类都有一个Class对象,其包含了与该类有关的信息。
获取Class对象的方法:

(1)Class.forName(“类的全限定名”),例如加载mysql的JDBC驱动

Class.forName("com.mysql.jdbc.Driver");

(2)实例对象.getClass(),例如创建日志对象

private final Logger log = LoggerFactory.getLogger(getClass());

(3)类名.class,例如创建日志对象

private final Logger log = LoggerFactory.getLogger(JDBCTest.class);

内部类

  • 简述使用内部的原因
    (1) 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
    (2)内部类可以对同一个包中的其他类隐藏起来
    (3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
    内部的注意点:
    内部类中声明的所有静态域都必须使用final修饰。
    内部类不能有static方法只能访问外围类的静态域和方法。
    内部类是一种编译器现象,与虚拟机无关。编译器将会把内部类翻译成用$分隔外部类名与内部类名的常规文件,而虚拟机对此一无所知。

  • 简述内部类分类及其一般的应用场景

内部类分为成员内部类、局部内部类、匿名内部类、静态内部类四种。

成员内部类:作为成员对象的内部类。可以访问private及以上外部类的属性和方法。外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。外部类也可访问private修饰的内部类属性。

局部内部类:存在于方法中的内部类。访问权限类似局部变量,只能访问外部类和定义局部内部类方法中的final变量。

匿名内部类:只能使用一次,没有类名,只能访问外部类的final变量。常用于使用内部内部类实现事件监听与回调,通常都可以用lambda代替

静态内部类:在内部类不需要引用外部类的时候,可以使用静态内部类,类似类的静态成员变量。静态内部类无法访问外部类私有变量,可以访问外部类的static属性和方法.声明在接口中的内部类自动定为static和public。

  • Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。

方法以及序列化

  • 构造方法、成员变量初始化以及静态成员变量三者的初始化顺序?

先后顺序:静态成员变量、成员变量、构造方法。
类未被加载过:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。

类加载过: 父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。(因为静态成员变量和静态代码块只加载一次)

  • 构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。当你创建一个类时,如果没有显示声明这个类的构造器,则默认使用的是无参构造器。

  • 阐述静态变量和实例变量的区别。

静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

  • 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
    不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。

  • 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
    可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

  • 序列化和反序列化是什么?

序列化:将java对象转化为字节序列,由此可以通过网络对象进行传输。
反序列化:将字节序列转化为java对象。
具体实现:实现Serializable接口(标记接口),或实现Externalizable接口中的writeExternal()与readExternal()方法。

对象克隆

  • 深拷贝与浅拷贝的区别?

浅拷贝:如果类中包含子对象引用(可变的,非final类),拷贝域得到的相同子类的一个引用,原对象与拷贝的对象仍会共享一些信息,Object中的clone方法是浅拷贝。

深拷贝:如果类中包含子对象引用(可变的,非final类),通过重写clone方法等方式,创建一个新的子类的地址空间,拷贝域得到的子类的新的地址空间引用,与原对象中的子类的地址空间不是同一个。

如果一个类中的属性全是基本数据类型和不可变类,那么深拷贝和浅拷贝没有区别。

  • 如何实现对象克隆?

基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是好过把问题留到运行时。

注解

  • 简述注解

Java 注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。其可以用于提供信息给编译器,在编译阶段时给软件提供信息进行相关的处理,在运行时处理写相应代码,做对应操作。

  • 简述元注解

元注解可以理解为注解的注解,即在注解中使用,实现想要的功能。
其具体分为:
(1)@Retention: 表示注解存在阶段是保留在源码,还是在字节码(类加载)或者运行期(JVM中运行)。
(2)@Target:表示注解作用的范围。
(3)@Documented:将注解中的元素包含到 Javadoc 中去。
(4)@Inherited:一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
@Repeatable:被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵@香菜

感谢观众老爷送的一发火箭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值