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)添加新方法:如果你往抽象类中添加方法,你可以给他提供默认的实现。因此你不需要改变你现有
代码。如果网接口中添加方法,那么你必须改变实现该接口的类