Java第二次测试

解析:

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()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用

  1. 等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

  2. 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

  3. 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡(terminated)状态: 线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止)

解析:

AD

Collection是最基本的集合接口。集合的长度是可变的。集合存储的都是对象。而且对象的类型可以不一致。

Collection接口的继承图

image-20220408084047832

解析:

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支持单继承、多重继承,不支持多继承。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值