方法重写的注意事项
A:父类中私有方法不能被重写(因为父类私有方法子类根本就无法继承)
B:子类重写父类方法时(访问权限不能更低,最好就一致)
C:父类静态方法,子类也必须通过静态方法进行重写
子类重写父类方法的时候,最好声明一模一样。
方法重写(Override)和方法重载(Overload)的区别?方法重载能改变返回值类型吗?
方法重写:在子类中,出现和父类中一模一样的方法声明的现象。方法重载:同一个类中,出现的方法名相同,参数列表不同的现象。方法重载能改变返回值类型,因为它和返回值类型无关。
final关键字
在Java中声明类、属性和方法时,可使用关键字final来修饰,表示“最终”,final关键字为修饰符
修饰类,类不能被继承
修饰变量,变量就变成了常量,只能被赋值一次
修饰方法,方法不能被重写
多态
可以理解为一个事物的多种表现形式
之前的方法的重载、方法的重写,也是一种多态的表现形式
子类对象的多态性
(可以直接应用在抽象类和接口上,会在下面讲)
在Java中,子类的对象可以替代父类的对象使用
我们在之后的学习中会经常与多态打交道,比如:IO、集合、JDBC等等
使用前提
要继承、实现(接口)
要有子类对父类方法的重写,使子类具有不同的方法实现
对象多态性格式
将父类类型的引用指向子类的对象:
向上转型(upcasting)
看=左边,是父类的引用
看=右边,是子类的对象
向上转型
子类引用的对象转换为父类类型称为向上转型。通俗地说就是将子类对象转为父类对象。此处父类对象可以是接口
虚拟方法调用
通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法
注意
对象的多态性不适用于子类对象的新方法
子类对象的多态性,并不适用于属性
子类对象的多态性,并不适用于静态方法
向上转型与向下转型
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:父类引用的对象转换为子类类型称为向下转型
多态的好处
可以增强程序的可扩展性及可维护性,使代码更加简洁。
不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性
单例模式
一个类的对象的实例只有一个
如何设计
如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private
不能用new操作符在类的外部直接产生类的对象
调用该类的某个静态方法以返回类内部创建的对象
静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的
分类
饿汉式 线程安全的
懒汉式 非线程安全的
抽象类abstract
抽象类就是一个不具体的类
用abstract关键字来修饰一个类时,这个类叫做抽象类,同理,用abstract关键字来修饰一个方法时,这个方法叫做抽象方法
抽象类和抽象方法必须用abstract关键字修饰
格式
abstract class 类名 {}
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
因为它不是具体的。
那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类的子类
如果不想重写抽象方法,该子类是一个抽象类。
重写所有的抽象方法,这个时候子类是一个具体的类。
示例
抽象类——注意:
抽象类有构造器 (凡是类都有构造器)
抽象方法所在的类,一定是抽象类
抽象类中可以没有抽象方法
不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法
抽象类VS一般类:
相同点:
抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同:
一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。
一般类可以被实例化。抽象类不可以被实例化。
一般类中不能定义抽象方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
抽象方法——注意:
抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此抽象方法
若子类继承抽象类,并重写了所有的抽象方法,则此类是一个"实体类",即可以实例化
若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象的!
接口