目录
重写与重载
重写(override)
-
参数列表必须完全与被重写方法的相同;
-
java 1.5 版本之前------返回类型必须完全与被重写方法的返回类型相同;之后,子类返回类型小于等于父类方法返回类型
-
访问权限大于或等于父类中被重写的方法的访问权限。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。否则会有以下信息:Cannot reduce the visibility of the inherited method from Base
-
重写的方法抛出的异常小于父类抛出的异常。
-
重写发生情况
-
发生在有继承关系的父子类中
-
-
不能被重写的方法
-
如果不能继承一个方法,则不能重写这个方法
-
声明为final的方法不能被重写。
-
声明为static的方法不能被重写,但是能够被再次声明。(static和final的都不能被重写)
-
构造方法不能被重写。(构造方法属于static的)
-
-
运行期运行,方法重写(子类继承父类并重写方法)以及对象造型(父引用子类型对象),父子类的多态性表现,是动态分派,指令invokevirtual,在运行期间根据常量池中的类方法的符号引用解析到实际的类型上;
重载(overload)
- 指在同一个类中,方法的名字相同,但是参数列表不同
- 编译期运行,同一个类中,同名方法有不同参数列表(个数、类型),是一个类中多态性的表现,是静态分派,在编译期,通过静态类型而不是实际类型作为判定依据(静态方法也可以重载);
抽象类与接口
- 构造方法
- 抽象类有
- 接口没有(接口不能被实例化)
- 继承与实现
- 抽象类单继承,一个类只能继承一个类
- 接口多继承,一个接口可以继承多个接口
- 抽象类
- 抽象类里可以有,也可以没有抽象方法,有抽象方法的一定是抽象类
- 抽象类中可以存在普通属性,方法,静态属性和方法。
- 抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
- 可以实现重载
- 类中不可进行运算
- 接口
- 在接口中只有方法的声明,没有方法体。方法永远都被public来修饰。
- 在接口中只有常量,(定义的变量,在编译的时候都会默认加上public static final)
- 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法,则实现类定义为抽象类
- 接口可以有default、static方法
sleep()与wait()
- 所属类不同
- sleep来自Thread类,是Thread的静态方法
- wait是Object超类的成员方法
- 对锁的作用
- sleep方法没有释放锁,sleep方法是单线程的,没有释放锁,这个锁指的是线程锁,监控状态依然存在
- wait方法释放了锁,wait方法释放锁,这个锁是对象锁,进入线程等待池等待
- 唤醒方式
- sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断;如Thread.Sleep(0)
- 等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源
- 使用范围
- sleep可以在任何地方使用
- wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用
- 异常
- sleep必须捕获异常,
- wait,notify和notifyAll不需要捕获异常
未完待续。。。。。