Java面试题汇总(1)

总结牛客网Java校招面试题合集120道

  1. 是否可以在static环境中访问非static变量?因为静态的成员属于类,随着类的加载而加载到静态方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员
  2. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? java源程序先经过javac编译器编译成二进制的.class字节码文件   .class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。Java源文件+javac-->.class文件+jvm-->机器码
  3. JDK和JRE的区别是什么?JRE是Java运行环境(只运行Java程序,这个就够了),JDK是java开发工具包(包括javac,编写程序的工具)
  4. ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
  5. Java支持的数据类型有哪些?什么是自动拆装箱?8中基本的数据类型:byte, short, long, char, float,double,int,boolean, java的数据类型:引用类型 例如string,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类是final修饰的引用类型。包装类就属于引用类型,自动装箱和拆箱就是基本类型和引用类型之间的转换,至于为什么要转换,因为基本类型转换为引用类型后,就可以new对象,从而调用包装类中封装好的方法进行基本类型之间的转换或者toString。自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。
  6. Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。方法覆盖(重写)是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。final, static,private不能被重写,方法重写只能用于子类重写父类的方法,重载可以用于类中所有方法。
  7. Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
     

    class a

    public void a(){

    //默认构造方法

    }

    public void a(String name){

    //构造方法重载 

    }

    Java中的构造函数是为了初始化对象的,构造函数的函数名和类名一致,默认的构造函数没有参数,没有返回值,构造函数的函数体内,没有内容。 构造函数的重载是函数名与类名相同,参数类型不同,参数不同。同样的作用也是为了初始化对象的。 Java中没有拷贝构造函数的概念!

    关于复制构造函数:C++中的复制构造函数通常有三种作用  

    1.对象作为函数参数  

    2.对象作为函数返回值  

    3.使用一个对象对另一个对象初始化。 

    Java并不支持这样的复制构造函数。但是这并不代表Java中没有这种机制,在Java中Object类的clone()方法就是这种机制的体现

  8. Java支持多继承么?Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。class 子类 extends 父类

  9. 接口和抽象类的区别是什么?从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。 如果有一些需要默认实现的方法并且要求子类重写,那么使用抽象类。 如果想实现多重继承,那么必须使用接口。所有方法在接口中不能有实现,抽象类可以有非抽象的方法。一个类可以实现多个接口,但最多只能实现一个抽象类。抽象类实现某个接口,可以不实现所有接口的方法,可以由它的子类实现。而普通类即非抽象类则必须实现接口里的全部方法。抽象类除了不能实例化对象外,和普通类没有区别。抽象类必须被继承,才能被使用。

    public class Salary extends Employee
    {
       private double salary; //Annual salary
       public Salary(String name, String address, int number, double salary)
       {
           super(name, address, number);//employee的构造方法
           setSalary(salary);
       }
    
    //Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

     

  10. 在java中为什么很多人说有值传递和引用传递?引用传递的本质是什么? 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。string引用类型,传参就不会改变main的值,stringbuilder引用类型,传参,.append()会改变main的值。参数传递基本上就是赋值操作。(stringbuilder不能同步访问 不是线程安全的 stringbuffer是安全的)

  11.  

    进程和线程的区别是什么?

    进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。 

    线程与进程的区别归纳:

    a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;反之,线程是进程的一部分,没有自己的地址空间,与进程内的其他线程一起共享分配给该进程的所有资源

    b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。 

    c.调度和切换:线程上下文切换比进程上下文切换要快得多。上下文切换=任务切换,先把前一个任务的CPU 上下文(也就是CPU 寄存器和程序计数器)保存起来到PCB(入栈),然后加载新任务的上下文到这些寄存器和程序计数器 

    d.在多线程OS中,进程不是一个可执行的实体。通常,把进程作为分配资源的基本单位,而 把线程作为独立运行和独立调度的基本单位

  12. 创建线程有几种不同的方式?你喜欢哪一种?为什么?继承Thread类 是Runnable接口的实现

    实现Runnable接口
    应用程序可以使用Executor框架来创建线程池

    实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。 

    还有一种方式是实现Callable接口   

  13. 当信号量控制互斥问题时,其初值往往代表资源的个数。如果信号量初值为2,说明该种资源数量2个。当进程将2个资源全部占有之后,信号量值减至0,此时若再有进程要求申请该资源,则必须在此信号量上等待。如信号量为-3,则有三个进程在等待

  14. Cache命中率=(平均存取时间-主存存取时间)/(高速缓存存取时间-主存存取时间)

  15. 概括的解释下线程的几种可用状态 block包括:等待堵塞,同步堵塞,其他堵塞

    1. synchronized 关键字可以在多线程环境下用来作为线程安全的同步锁。https://blog.csdn.net/guyue35/article/details/85052537    
    2. 非静态方法使用 synchronized 修饰,锁定的是当前对象。两个线程 thread1 和 thread2,同时访问对象的方法,由于该方法是 synchronized 关键字修饰的,那么这两个线程都需要获得该对象锁,一个获得后另一个线程必须等待。如果某个线程得到了对象锁,但是另一个线程还是可以访问没有进行同步的方法或者代码
    3. synchronized 来修饰静态 static 方法 锁定的是类,静态和非静态锁是互补干扰的
  16. 同步方法和同步代码块的区别是什么?同步代码块是只有在代码块里面的语句被同步修饰,同步方法是内置锁会保护整个方法被调用,如果调用方法前,无法获取锁,会堵塞
        public synchronized void test(){
            // 同步方法
        }
        public void test(){
            synchronized (this) {
                // 同步代码块
            }
        }
  17. 在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值