刷Java面试题—12月刷题历史(补充)

这是上一篇12月刷题的补充

12.30

7.cms内容管理系统的GC过程

**用户线程(user-level threads)**指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

CMS的GC过程有6个阶段(4个并发,2个暂停其它应用程序)

1. 初次标记(STW initial mark)

2. 并发标记(Concurrent marking)

3. 并发可中断预清理(Concurrent precleaning)

4. 最终重新标记(STW remark)

5. 并发清理(Concurrent sweeping)

6. 并发重置(Concurrent reset)

在初次标记,重新标志的时候,要求我们暂停其它应用程序,那么这两个阶段用户线程是不会参与的

发现这道题完全没头绪,就去查了一下,感觉说的比较清楚了。

8.四种引用类型

JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。

所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。

一,强引用

Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收 obj = null; //手动置null

只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

二,软引用

软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。

三,弱引用

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。

四,虚引用

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

1、强引用:一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋值一个对象。

2、软引用:用SoftReference类实现,一般不会轻易回收,只有内存不够才会回收。

3、弱引用:用WeekReference类实现,一旦垃圾回收已启动,就会回收。

4、虚引用:不能单独存在,必须和引用队列联合使用。主要作用是跟踪对象被回收的状态。

9.静态.

并不是静态最先初始化,而是静态.(BM:啊!多么痛的领悟!)

而静态域中包含静态变量、静态块和静态方法,其中需要初始化的是静态变量和静态块.而他们两个的初始化顺序是靠他们俩的位置决定的!

10.Java 提供的事件处理模型

Java 提供的事件处理模型是一种人机交互模型。它有三个基本要素:

  1. 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;

  2. 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;

  3. 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;

11.子类究竟继承了父类什么东西

继承的最大好处就是为了实现代码的复用。那么,子类到底从父类得到的什么呢?

1.实例成员

父类的private成员不会被子类继承,子类不能访问。但是子类对象的确包含父类的私有成员。 //后半句话暂无法理解;有待提高;
父类的default(包访问成员)继承为子类的包访问成员。就好像他们直接定义在子类中一样。即可以直接用。
父类的 protected 成员继承为子类的protected 成员。就好像他们直接定义在子类中一样。
父类的 public 成员继承为子类的public 成员,就好像他们直接定义在子类中一样。

2.实例方法

继承到的实例方法在子类中可以直接被使用,但是一般为满足子类的需求,会在子类重写或重写父类的方法;

特别需要注意的是:
方法的重载可以发生在父子类中,其实追其根本还是在同一个类:子类会继承父类的方法(不过是隐式的
,在代码上看不到),所以这时重载方法;就相当于在子类同一个类中进行重载;

调用方法:

1.当调用重写方法时:其实调用都是子类的方法(虽然看起来那个方法子类上没有,但是子类继承了父类的方法只是没有显示出来)
所以是根据参数列表决定调用哪一个重写方法;

2.当调用重载方法时:是根据对象类型决定调用哪一个方法;

3.static成员

static会被子类继承吗?答案是会。他们会被继承为子类的static成员,而不是子类实例的成员。
同样,private static成员不会被继承,只有 包访问 权限 ,protected public 成员才会被继承。
父类的private成员不会被子类继承,子类不能访问。
父类的 包访问成员 继承为子类的包访问成员。就好像他们直接定义在子类中一样。
父类的 protected 成员继承为子类的protected 成员。就好像他们直接定义在子类中一样。
父类的 public 成员继承为子类的public 成员,就好像他们直接定义在子类中一样。

4.构造函数:很重要!

构造函数不能继承,但是子类一定可以(也必须)借用父类的构造函数。java保证:除了Object类对象,每一个类的实例在构造时,先去调用父类的构造函数。
我们自定义类的构造函数的第一句一定是super(xx,…),如果不是,那么第一句就一定是this(xx,…)去调用本类的另一个构造函数。(第二种情况存在于重载构造器)
注意Object类是所有类的父类,包括我们自定义的类也是Object类的子类;
如果子类构造函数不显式的调用super(),那么,javac会自动插入super(),也就是父类无参数的构造函数。注意this(),super()只能放在方法的第1行上;
即一个方法里只能有一个super()或者this()方法;
对于构造函数,其实类中所有构造函数都是隐式static的。很明显的例证就是 构造函数无需通过实例就可以调用。

例子:

package com.briup.test;

/**

  • 父类
  • 测试子类到底继承父类的什么东西;
  • @author Administrator

*/
public class A {
private int age;
boolean gender;
protected int id;
public String name;

public void print() {
	System.out.println("可以被子类继承么?");
}

}

package com.briup.test;

/**

  • 子类
  • @author Administrator

*/
public class B extends A{
public static void main(String[] args) {
B b = new B();
b.print();
System.out.println(b.name);
//System.out.println(b.age);//报错,子类不能继承父类的私有成员实例变量;
System.out.println(b.gender);
System.out.println(b.id);
}
}

12.垃圾回收的标准

在java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:

1.给对象赋值为null,以下没有调用过。

2.给对象赋了新的值,重新分配了内存空间。

12.31

1.接口里面允许有什么东西

JDK1.7的时候,接口里面就只能有静态常量(public static final)和抽象方法(public abstract )

由于子类实现父类的时候不能缩小访问权限,使用实现接口中的方法时,访问权限也是public

JDK1.8的时候,多了default方法和static方法

1.默认方法
格式:public default 返回值 方法名(){}
2.静态方法
格式:public static 返回值 方法名(){}

JDK9

这次更新也JDK8遗留下的问题

当我们在一个接口里写多个默认方法或者静态方法的时候,可能会遇到
程序重复的问题。我们可以把这些重复的程序提取出来,创建一个新的方法,
用private进行修饰,这样就创造了一个只有接口可以调用的私有方法。

私有方法格式,与上面的对应
1.默认私有方法:当多个默认方法程序重复的时候使用
格式:private 返回值 方法名(){}
2.静态私有方法:当多个静态方法程序重复的时候使用
格式:private static 返回值 方法名(){}

2.原生的编译运行

javac f.java ;

java f a b c//传给args

3.-128的补码

128 =1000 0000,8位机器

[-128]原码 = 1000 0000发生了溢出,最高位表示符号位:0为正数,1为负数

[-128]反码 = 1111 1111除符号位外,各位取反

[-128]补码 = 1000 0000 反码的末位加1,不能影响符号位

4.关于文件

A.文件分为文本文件和二进制文件,计算机只认识二进制,所以实际上都是二进制的不同解释方式。文本文件是以不同编码格式显示的字符,例如Ascii、Unicode等,window中文本文件的后缀名有".txt",".log",各种编程语言的源码文件等;二进制文件就是用文本文档打开是看不懂乱码,只要能用文本打开的文件都可以算是文本文件,只是显示的结果不是你想要的,二进制文件只有用特殊的应用才能读懂的文件,例如".png",".bmp"等,计算机中大部分的文件还是二进制文件。

B.File类是对文件整体或者文件属性操作的类,例如创建文件、删除文件、查看文件是否存在等功能,不能操作文件内容;文件内容是用IO流操作的。

C.当输入过程中意外到达文件或流的末尾时,抛出EOFException异常,正常情况下读取到文件末尾时,返回一个特殊值表示文件读取完成,例如read()返回-1表示文件读取完成。

D.上面A选项已经说了,不论是文本文件还是二进制文件,在计算机中都是以二进制形式存储的,所以都当做二进制文件读取。

5.面向对象

USES-A:依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。

关联关系:A类会用到B类,这是一种强依赖关系,是长期的并非偶然。在代码中的表现为:A类的成员变量中含有B类。

HAS-A:聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟。

IS-A:表示继承。父类与子类,这个就不解释了。
要注意:还有一种关系:组合关系也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分的关系,但这种整体和部分是不可分割的。

6.局部内部类

局部内部类指位于块、构造器、方法内的有名称类,最多只能有final修饰

7.WEB容器/EJB容器

weblogic中开发消息Bean时的persistent与non-persisten的差别:

  • persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来。
  • non-persistent方式的消息将被丢弃
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值