Java面试高频点---牛客刷题总结(第一周)

1、内部类
在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类 。

1.成员内部类

(1)该类像是外部类的一个成员,可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员);

(2)成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员内部类中的成员。如果要访问外部类中的成员,需要以下形式访问:【外部类.this.成员变量 或 外部类.this.成员方法】;

(3)在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问;

(4)成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;

(5)内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类用private修饰,则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰。

2.局部内部类

(1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;

(2)局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

3.匿名内部类

(1)一般使用匿名内部类的方法来编写事件监听代码;

(2)匿名内部类是不能有访问修饰符和static修饰符的;

(3)匿名内部类是唯一一种没有构造器的类;

(4)匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

4.内部静态类

(1)静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似;

(2)不能使用外部类的非static成员变量或者方法。

2、集合相关
HashSet 它不是线程安全的,属于Set接口下的实现类,Set下的实现类特征就是无序,不允许存储相同的对象

ConcurrentHashMap 它是线程安全的HashMap实现,特征也相似,其中存储的值对象可以重复,键对象不能重复

Collection接口是List接口和Set接口的父接口,通常情况下不被直接使用

ArrayList线程不安全的,底层是数组实现,允许存放重复对象

基本上我们平常用到的都是非线程安全的集合类,因为要使线程安全,是要加锁来实现的,势必造成性能降低。如hashset、hashmap、arraylist、linkedlist、treemap、treeset、stringbulider等。
像stringbuhffer、vector、hashtable这些都是专用于多线程的,再者以concurrent(意为:同时发生的)为前缀的集合类大多是线程安全的。

继承和实现关系:
在这里插入图片描述

3、基本类型的自动装箱和拆箱
在这里插入图片描述
基本类型装箱/拆箱对象引用(内存地址)是否相同。

选项A, a1、a2赋值给Integer类型,自动装箱。对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象),变量所指向的是同一个对象,所以a1==a2 返回true。

选项B,Integer和int比较会进行自动拆箱,比较的是数值大小,所以d1==d2返回true。

选项C,由于超出自动装箱的范围,return返回的是新建的对象,所以对象内存地址不同,b1==b2返回false。

选项D,普通new创建对象,两个new创建两个地址不同的对像,所以c1==c2返回false。

3、重写和重载

重载:
1、 重载是在编译器通过方法中形参的静态类型确定调用方法版本的过程。
2、 重载是多态在编译期的表现形式
3、 重载的判定只有两个条件(其他的条件都不能作为判定):
1、 方法名一致
2、形参列表不同(参数类型、参数个数、参数顺序等)
重写:
1、重写在方法运行时,通过调用者的实际类型来确定调用的方法版本。(具体细说,就是子父类中的重写方法在对应的class文件常量池的位置相同,一旦子类没有重写,那么子类的实例就会沿着这个位置往上找,直到找到父类的同名方法)
2、重写只发生在可见的实例方法中:
1、静态方法不存在重写,形式上的重写只能说是隐藏。
2、私有方法也不存在重写,父类中private的方法,子类中就算定义了,就是相当于一个新的方法。
3、静态方法和实例方法不存在相互重写。
3、重写满足一个规则:两同两小一大
1、两同:方法名和形参列表一致
2、两小:重写方法的返回值(引用类型)和抛出异常,要和被重写方法的返回值(引用类型)和抛出异常相同或者是其子类。注意,一旦返回值是基本数据类型,那么重写方法和被重写方法必须相同,且不存在自动拆装箱的问题。
3、一大:重写方法的访问修饰符大于等于被重写方法的访问修饰符。

4、Java反射

反射指的是在运行时能够分析类的能力的程序。
反射机制可以用来:

1、 在运行时分析类的能力–检查类的结构–所用到的就是java.lang.reflect 包中的Field、Method、Constructor。分别用于描述类的与、方法和构造器。

2、 在运行时查看对象。

3、 实现通用的数组操作代码。

反射机制的功能: 在运行时判断任意一个类的对象;在运行时判断任意一个类具有的成员变量和方法;在运行时调用任意一个对象的方法;

反射机制常见作用: 动态加载类、动态获取类的信息(属性、方法、构造器);动态构造对象;动态调用类和对象的任意方法、构造器;动态调用和处理属性;获取泛型信息(新增类型:ParameterizedType,GenericArrayType等);处理注解(反射API:getAnnotationsdeng等)

反射机制性能问题: 反射会降低效率。void setAccessible(boolean flag):是否启用访问安全检查的开关,true屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置。禁止安全检查,可以提高反射的运行速度。可以考虑使用:cglib/javaassist操作。

5、多态的作用

1、不必编写每一子类的功能调用,可以直接把不同子类当父类看,屏蔽子类间的差异,提高代码的通用率/复用率
2、父类引用可以调用不同子类的功能,提高了代码的扩充性和可维护性

6、final、finally和finalize

1、final: 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能覆盖(重写)。

2、finally: 在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

3、finalize: 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。

一步一个脚印,加油!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值