android 面试 (基础篇 4)

17.java多态,java多态性的理解,java中多态的实现,什么是多态。

    面向对象的三大特性:封装,继承,多态。从一定角度来看封装和继承几乎都

    是为多态而准备的。

    多态的定义:指允许不同的类的对象对同一消息作出响应。既同一消息可以

    根据发送对象的不同而采取多种不同的行为方式。(发送消息既函数调用)

    实现多态的技术成为动态绑定(dynamic binding),是指在执行期间判断

    所引用的对象的实际类型,更加其实际类型调用相应得方法。

    多态的作用:消除类型之间的耦合关系。

    多态的三个必要条件:继承,重写,父类引用指向子类对象

    多态的好处:

    1)可替换性

    2)可扩充性

    3)接口性

    4)灵活性

    5)简化性

    java多态的实现方式:接口实现,继承父类进行方法重写,同一个类进行方法重载


18.什么导致线程阻塞

    为了解决对共享存储区的访问冲突,java引入同步机制,现在让我们来考察多

    个线程对共享资源的访问,显然同步机制已经不够用了,因为在任意时刻所要求的资源

    不一定已经准备就绪,反过来,同一时刻准备好的资源也可能不止一个。为了解决这种

    情况下的访问控制问题,java引入了对阻塞机制的支持。

    阻塞值得是暂停一个县城的执行以等待某个条件的发生,学过操作系统的同学对他一定

    很熟悉了。java提供了大量的方法来支持阻塞,下面然我们来逐一分析。

    1)sleep方法:sleep运行指定以毫秒为单位的一段时间作为参数,它使得线程在制定的

        时间内进入阻塞状态,不能得到cpu时间,指定的时间一过,线程从新进入可执行状态

典型地,sleep背用在等待某个资源就绪的情况:测试发现条件不满足后,让线程阻塞,

        另一个线程产生结果后,调用resume使其恢复。

    2)suspend和resume方法:两个方法配套使用,suspend使得线程进入阻塞状态,并不会

        自动恢复。必须起对应的resume被调用,才能使得线程重新进入可执行状态。

    3)yield方法:yield使得线程放弃当前分得的cpu时间,但是不是线程阻塞,即线程仍然处于

        可执行状态,随时可能再次分得cpu时间。调用yield等效于调度线程认为线程已经执行足够

        长时间从而转到另一线程。

    4)wait和notify:两个方法配套使用,wait使得线程进入阻塞状态,他有两种形式,一种允许

        指定以毫秒为单位的一段时间作为参数,另一种没参数,前者当对应的notify被调用或者超出

        指定时间线程重新进入可执行状态。后者必须调用notify。

    其中wait和notify方法对来进行阻塞操作时会释放占用的锁,其他方法都不会释放。它们是直接

    直接隶属于object类的。也就是说所有的对象都拥有这一对方法。另外它们只能在synchronized

    方法或者块儿中调用,理由很简单,只有synchronized方法或块儿中当前线程才占有锁,才有锁

    可以释放。该方法或块儿的上锁对象就是调用这一对方法的对应,若不满足会发生运行时错误

    IllegalMonitorStateException。

    关于 wait() 和 notify() 方法最后再说明两点:

    第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中

        随机选取的,我们无法预料哪一个线    程将会被选择,所以编程时要特别小心,避免因这种

        不确定性而产生问题。

    第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 

        notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。

        当然,只有获得锁的那一个线程才能进入可执行状态。

    谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的

     wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们

    在编程中必须小心地避免死锁。


19.抽象类和接口的区别

    1)默认的方法实现:抽象类可以有默认的方法实现完全,接口完全是抽象的根本不存在方法的实现。

    2)实现:自乐使用extends关键字来实现抽象类,如果子类不是是抽象类的话,他需要提供抽象类中

        声明的所有的方法的实现。子类使用关键字implements来实现接口,他需要提供接口中声明的所有

        的方法的实现。

    3)构造器:抽象类可以有构造器,接口不能有构造器

    4)与正常java类的区别:除了你不能实例化冲向类外,他和普通的java类没有区别。接口是完全不

        同的类型。

    5)访问修饰符:抽象方法可以有public,protected和default这些修饰符,接口方法默认的修饰符是

        public

    6)main方法:抽象方法可以有main方法并且我们可以运行它,接口没有

    7)多继承:抽象类在java中表示一种继承关系,一个子类只能存在一个父类,但可以实现多个接口。

    8)速度:抽象类速度比接口快一些,因为接口需要时间找在类中的实现方法。

    9)添加新方法:如果你往抽象类中添加方法,你可以给他提供默认的实现。因此你不需要改变你现有

        代码。如果网接口中添加方法,那么你必须改变实现该接口的类


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值