牛客java面试题总结版(二)

6.Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?
官方版:Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
个人总结:

7.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
官方版:当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法
(所以啊,什么是复制构造方法??)

**注意:**关于Java中的构造函数还要注意:
1.当父类中不写构造函数时,子类继承时会默认调用父类的super()方法。一旦在父类中写了带参数的构造函数,此时父类的默认构造函数不再调用,程序会报错,此时,应该在父类中添加一个无参的构造函数。

8.Java支持多继承么?
官方版:Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。
大神版:链接:
java只支持单继承,这是由于安全性的考虑,如果子类继承的多个父类里面有相同的方法或者属性,子类将不知道具体要继承哪个,而接口可以多实现,是因为接口只定义方法,而没有具体的逻辑实现,多实现也要重新实现方法。

9.接口和抽象类的区别是什么?
官方版:Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。
也可以参考JDK8中抽象类和接口的区别

大神版:从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

10.什么是值传递和引用传递?
官方版:值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递

大神版https://www.zhihu.com/question/31203609/answer/50992895

11.进程和线程的区别是什么?
官方版:进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
线程与进程的区别归纳:

a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

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

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。

大神版:进程是运行中的程序,线程是进程的内部的一个执行序列
进程是资源分配的单元,线程是执行行单元
进程间切换代价大,线程间切换代价小
进程拥有资源多,线程拥有资源少
多个线程共享进程的资源

12.创建线程有几种不同的方式?你喜欢哪一种?为什么?
官方版:有4种方式可以用来创建线程:
a.继承Thread类
b.实现Runnable接口
c.应用程序可以使用Executor框架来创建线程池
d.还有一种方式是实现Callable接口
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
大神版:链接:https://www.nowcoder.com/questionTerminal/e33c72bceb4343879948342e2b6e3bca
①继承Thread类(真正意义上的线程类),是Runnable接口的实现。
②实现Runnable接口,并重写里面的run方法。
③使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。
调用线程的start():启动此线程;调用相应的run()方法

继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。

实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)

一般情况下,常见的是第二种。

  • Runnable接口有如下好处:
    *①避免点继承的局限,一个类可以继承多个接口。
    ②适合于资源的共享
    /

  • Thread的常用方法:

  • 1.start():启动线程并执行相应的run()方法

  • 2.run():子线程要执行的代码放入run()方法中

  • 3.currentThread():静态的,调取当前的线程

  • 4.getName():获取此线程的名字

  • 5.setName():设置此线程的名字

  • 6.yield():调用此方法的线程释放当前CPU的执行权(很可能自己再次抢到资源)

  • 7.join():在A线程中调用B线程的join()方法,表示:当执行到此方法,A线程停止执行,直至B线程执行完毕,

  • A线程再接着join()之后的代码执行

  • 8.isAlive():判断当前线程是否还存活

  • 9.sleep(long l):显式的让当前线程睡眠l毫秒 (只能捕获异常,因为父类run方法没有抛异常)

  • 10.线程通信(方法在Object类中):wait() notify() notifyAll()

*设置线程的优先级(非绝对,只是相对几率大些)

  • getPriority():返回线程优先值
  • setPriority(int newPriority):改变线程的优先级
    */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值