解析:
B 调用wait()后,针对此对象发出notify()方法和notifyAll()方法都可以获得对象锁进入运行状态。
sleep和wait的区别
- 来源不同:sleep属于Thread类,wait属于Object类。
- sleep方法线程不会释放对象锁。wait方法释放了对对象的同步锁的控制权,允许其他线程执行该同步代码
- sleep方法可以在任何地方使用,但wait方法、notify方法、notifyAll方法都必须在同步控制块或者同步方法块中使用。
- sleep方法和wait方法都必须抛异常,notify方法和notifyAll方法不用抛异常。
解析:
A
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
原则如下:
一.方法名一定要相同。
二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体。
1.如果参数个数不同,就不管它的参数类型了。
2.如果参数个数相同,那么参数的类型或者参数的顺序必须不同。
三.方法的返回类型、修饰符可以相同,也可不同。
D选项错误,原因是格式错误,正确格式应该为public void(其他返回值类型也可以)activate(float x)
解析:
C
解析:
A
public class demo03 {
public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();//实例化内部类对象
}
}
class Outer{
private Integer outerNum;
class Inner{
private Integer innerNum;
{
System.out.println(innerNum);
}
public Inner(){
innerNum=outerNum;
System.out.println(innerNum);
}
}
}
题目中只是创建了一个外部类的实例化对象,需要创建一个内部类的实例化对象,才会有输出。
解析:
ABCD
- 类方法: 又叫做静态方法 。可以通过类名.类方法名、类方法名
- 对象方法: 又叫实例方法,非静态方法 。
- 两者的调用方法
public class demo02 {
public static void Hello(){
System.out.println("Hello");
}
public void HaHa(){
System.out.println("haha");
}
public static void main(String[] args) {
demo02.Hello();//类名.类方法名调用成员方法
Hello();//类方法名调用成员方法
demo02 demo=new demo02();
demo.HaHa();//对象.方法名调用实例方法,必须得要有一个对象
demo.Hello();//对象.方法名调用成员方法
}
}
- this是指代本类的对象,super是出现继承时指向父类的对象,显然两者都依托于类的实例对象的创建,因此静态方法中不能访问。
- static方法中不能直接使用非静态成员, 因为非静态成员与实例相关,通过对象点取间接使用
public class demo02 {
public static void Hello(){
System.out.println("Hello");
demo02 demo=new demo02();//类方法调用实例方法
demo.HaHa();
}
public void HaHa(){
System.out.println("haha");
}
}
解析:
CDE
B选项,两个数组用equals()方法进行比较时 ,是比较两个对象的地址是否相同,因为是两个数组,所以分别是两个对象,因此地址不同。
解析:
ACD
- 调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可运行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。
-
一个线程被创建后,还需要调用runnable方法,等待CPU进行调度,然后再开始运行,执行run方法。
创建(new)状态: 准备好了一个多线程的对象,即执行了new Thread(); 创建完成后就需要为线程分配内存
就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
运行(running)状态: 执行run()方法
阻塞(blocked)状态: 暂时停止执行线程,将线程挂起(sleep()、wait()、join()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用
-
等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
-
同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
-
其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡(terminated)状态: 线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止)
解析:
AD
Collection是最基本的集合接口。集合的长度是可变的。集合存储的都是对象。而且对象的类型可以不一致。
Collection接口的继承图
解析:
CD
- 一个类不能同时被 abstract 和 final 修饰。final的类不能被重写和继承,而abstract类是抽象类,本身没有实现,只能通过子类来实现,也就是说必须被继承。所以说它们是没法同时做修饰符的。
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
解析:
BCD
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。也就是子类拥有父类非 private 的属性、方法。
解析:
AD
- final关键字可用于修饰类、变量和方法。final修饰变量时,表示该变量一旦获得了初始值就不可被改变,final既可以修饰成员变量也可以修饰局部变量、形参。
- 父类中的 final 方法可以被子类继承,但是不能被子类重写。
- final 类不能被继承,没有类能够继承 final 类的任何特性。
解析:
ADEFG
A.强制停止一个正在运行的线程,无论此时线程是何种状态。stop会立即关闭线程,不会等待任务结束。这种方式容易丢失数据。因为这种方式是直接将线程杀死了。
B.将调用该方法的对象的所有在等待集合中的线程唤醒,但由于所有的被唤醒的线程仍然要去争用synchronized锁,而synchronized锁具有排他性,最终只有一个线程获得该锁,进行执行状态,其他线程仍要继续等待。
C.从调用该方法的对象的等待集合中选择一个等待的线程唤醒,唤醒的线程将从等待集合中删除。
D.属于Thread类,让当前线程进入休眠,进入“阻塞”状态,放弃占有CPU时间片,让给其他线程使用,也就是导致了程序暂停执行指定的时间,让出CPU给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
E.是一种同步机制,代表了某种内在锁定的概念,当一个线程对某个共享资源加锁后,其他想要获取共享资源的线程必须进行等待,synchronized 也具有互斥和排他的语义。
F.wait()属于Object类,称作线程在对象上的等待,作用是把当前的线程放入对象的等待集合中。Java虚拟机会让当前的线程进入到休眠状态,并释放对对象的同步锁的控制权,允许其他线程执行该同步代码,要唤醒该线程,需要在同一个对象上调用notify()或notifyAll()方法。
G.暂停当前正在执行的线程对象,即放弃当前拥有的CPU资源,并执行其他线程。让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。但是yeild()方法执行后可能会没有效果(大多数时候有效果),应该该线程(刚刚放弃资源的线程)可能再次被线程调度选中。
解析:
BCD
abstract class和interface的相同点:
抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。interface没有具体实现,需要继承类进行实现。当类实现interface的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
abstract class和interface的区别:
- 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
解析:
EF
- JDK1.8以后,接口里可以有静态方法和方法体了。接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。
- 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
- Java支持单继承、多重继承,不支持多继承。