Java刷题7.15更新

一、抽象类的修饰符都应该在class关键字之前,抽象方法不能有方法体. 

正确的抽象类定义:

abstract class Animal{abstract void growl();}

二、类实现多个接口的时候,只需要一个implements,多个接口通过逗号进行隔开,先继承类再实现接口

class A implements B,C

三、Java中只适用于整型的运算符是%

四、java concurrent包下的类

1.Semaphore:类,控制某个资源可被同时访问的个数;

2、ReentrantLock:类,具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大;

3、 Future:接口,表示异步计算的结果;

4、 CountDownLatch: 类,可以用来在一个线程中等待多个线程完成任务的类。

五、volatile关键字

       volatile是java中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。不依赖其他锁机制,多线程环境下的计数器可用volatile实现。

1,可见性

         可见性指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。

2,禁止指令重排序优化

        禁止指令重排序优化。大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile关键字就可以从语义上解决这个问题。对volatile变量的操作不会造成阻塞。

       对于用volatile修饰的变量,JVM虚拟机会保证从主内存加载到线程工作内存的值是最新的。

六、OutputStream类中包含方法flush(),而InputStream类中没有。flush()函数强制将缓冲区中的字符流、字节流等输出,如果输出流输出到缓冲区完成后,缓冲区并没有填满,那么缓冲区将会一直等待被填满。所以在关闭输出流之前要调用flush()。

七、JDK中提供了三个ClassLoader,根据层级从高到低为:

  1. Bootstrap ClassLoader,主要加载JVM自身工作需要的类。
  2. Extension ClassLoader,主要加载%JAVA_HOME%\lib\ext目录下的库类。
  3. Application ClassLoader,主要加载Classpath指定的库类,一般情况下这是程序中的默认类加载器,也是ClassLoader.getSystemClassLoader() 的返回值。(这里的Classpath默认指的是环境变量中配置的Classpath,但是可以在执行Java命令的时候使用-cp 参数来修改当前程序使用的Classpath)

        JVM加载类的实现方式,我们称为 双亲委托模型

        如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。

       JVM根据两个方面判断两个类是否相同:一是类的全称;另一个是类加载器。

八、在Java中,常用的线程通信方式有两种,分别是利用Monitor实现线程通信、利用Condition实现线程通信。线程同步是线程通信的前提,所以究竟采用哪种方式实现通信,取决于线程同步的方式。

如果是采用synchronized关键字进行同步,则需要依赖Monitor(同步监视器)实现线程通信,Monitor就是锁对象。在synchronized同步模式下,锁对象可以是任意的类型,所以通信方法自然就被定义在Object类中了,这些方法包括:wait()、notify()、notifyAll()。一个线程通过Monitor调用wait()时,它就会释放锁并在此等待。当其他线程通过Monitor调用notify()时,则会唤醒在此等待的一个线程。当其他线程通过Monitor调用notifyAll()时,则会唤醒在此等待的所有线程。

JDK 1.5新增了Lock接口及其实现类,提供了更为灵活的同步方式。如果是采用Lock对象进行同步,则需要依赖Condition实现线程通信,Condition对象是由Lock对象创建出来的,它依赖于Lock对象。Condition对象中定义的通信方法,与Object类中的通信方法类似,它包括await()、signal()、signalAll()。通过名字就能看出它们的含义了,当通过Condition调用await()时当前线程释放锁并等待,当通过Condition调用signal()时唤醒一个等待的线程,当通过Condition调用signalAll()时则唤醒所有等待的线程。

九、java中的类支持单一继承,接口支持多继承,普通类可以实现接口,并且可以实现多个接口,但是只能继承一个类

十、try的形式有三种: try-catch try-finally try-catch-finally 但catch和finally语句不能同时省略

十一、在Java中,HashMap中是通过开放定址法和链地址法来解决哈希冲突的

十二、子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化 

而静态代码块在类初始化的时候执行

不会初始化子类的几种

1. 调用的是父类的static方法或者字段

2.调用的是父类的final方法或者字段

3. 通过数组来引用

4.直接调用子类的final方法

十三、如果Child extends Parent

1.如果Child是class,且只有一个有参数的构造函数,也可以调用父类中无参的构造函数,子类的构造器第一行默认都是super(),默认调用直接父类的无参构造,一旦直接父类没有无参构造,那么子类必须显式的声明要调用父类或者自己的哪一个构造器。

2.接口继承时必须是接口

3.接口可以多继承可以被多实现,类都是单继承,但是继承有传递性

4.如果Child是class,并且没有显示声明任何构造函数,那么此时仍然会调用Parent的构造函数,一个类一旦没有显式的定义任何构造,那么JVM会默认给你一个无参构造。无参构造的第一行依然默认是super()

十四、字符串可以和任意类型拼接,String str = "hello world",

str=str+100,str变成了hello world100

十五、java中,用final关键字定义常量

十六、有关servlet中init,service,destroy方法,init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法,service()方法处理客户机发出的所有请求,destroy()方法标志servlet生命周期的结束, servlet在多线程下其本身并不是线程安全的。

十七、有关JAVA异常类,异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,非RuntimeException一般是外部错误(非Error),其一般被 try{}catch语句块所捕获,Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉,RuntimeException并不必须被捕获。不管异常代表的是可预见的异常条件还是编程错误,如果用try{}catch语句捕获它,会让程序在已经出现错误的情况下继续执行下去,也就是说我们不会及时的察觉到程序出现的问题。如果我们不去处理RuntimeException,让程序在测试阶段把异常传播给外界,这时系统打印出来的调用堆栈路径可以帮助我们更快的找出并修改错误,避免出现更大的损失。

十八、多个else if块之间的顺序可以改变,改变之后可能对程序的执行结果有影响,多个else if块之间的顺序可以改变,改变后程序编译可以通过。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值