一、封装
1.概念:广义的概念。指定功能代码段提取出一个方法,是一种封装;将若干个相关联的方法提取出一个类,也是一种封装。
2.属性的封装:
一个类中的某些属性 ,不希望让外界操作。因为如果让外界操作的话,对这个属性的设置,有可能不是我们想要得到的值(不符合逻辑),所以,这时需要对这个属性进行封装,不让外界直接访问。
属性封装的过程:
①使用关键字private(私有权限)修饰这些属性,被private修饰的属性和方法只能在当前类中访问。
②给外界提供相应的方法,用来操作这个被私有化的属性,setter/getter方法。
二、继承
1.如果有多个相关联的类中,有着相同的属性和方法,可以将这些相同的部分提取出来,单独做成一个类;这个被提取出来的类叫做父类,若干个具有相同属性和方法的类,是子类。他们之间的关系叫做继承(子类继承自父类)。使用关键字extends来描述继承。
2.特点:
java是单继承的,一个类只能有一个父类,但一个类可以有多个子类。
一个类在继承自一个父类的同时,还可以被其他类继承。
子类中,只能访问到父类中可以看见的类,所谓看的见,指的是访问权限足够,可以访问父类中的成员。
子类在继承父类成员的基础上,还可以添加拓展成员。
3.使用的场景:
①如果有多个相关联的类,具有相同的成员(属性、方法),可以将这些相同的部分提取出来,单独做一个类。
②如果一个类给我们提供的功能,已经无法满足我们的需求,需要拓展功能,可以给这个类写一个子类。
※4.继承中的构造方法
<1>一个 对象在实例化的时候,需要先实例化父类部分:
一个对象在实例化的时候,需要在堆上开辟空间,堆中的空间分为两部分:从父类继承到的属性,子类特有的属性。
一个对象在堆空间中的内存分为父类部分和子类部分。
在实例化父类部分的时候,需要调用父类中的构造方法。
子类对象在实例化的时候,先实例化父类部分,需要调用父类中的构造方法。这个过程,默认调用的是父类中的午餐构造方法,如果父类中没有构造方法,对所有的子类都会造成影响。
<2>父类中没有无参构造方法的解决方案:
①给父类添加一个子类能够访问到无参构造方法。
②在子类的构造方法中,使用super()调用父类中存在的构造方法。
※5.继承中的方法重写
<1>.什么是方法重写
重写,叫做Override,在子类中,对父类继承到的方法进行重新的实现。在这个过程中,子类用自己的方式对父类的方法进行了实现,覆盖了父类中的实现方法,因此,也叫做方法的覆写。
<2>.为什么要进行方法重写
①对于同一个方法,子类的实现和父类的实现不一样
②父类的方法已经不能满足要求,需要在父类方法的基础上,进行拓展。
<3>.重写的注意事项
①子类只能重写父类中存在的方法
②子类在进行重写的时候,方法名、参数必须保持一致。(区别与重载)
<4>.注解@Override
为什么要注解?
因为我们在进行方法重写的时候,没有什么提示,因此,在进行重写之前,最好加上这个注释。
这个注解用在重写的方法之前,表示验证这个方法是都是一个重写的方法。是的话,程序没问题,不是的话,程序报错。
并不是只有加了@Override就是重写,因为没有加也可能会是注解,他只是进行一个语法校验,与是不是重写无关。
<5>.重写对方法的返回值的类型和访问权限的要求
访问权限:子类重写方法的访问权限,必须大于等于父类方法的访问权限
返回值类型:子类重写方法的返回值类型,必须和父类的返回值类型一致,或者是其子类型。
※异常抛出类型:子类重写方法的异常抛出类型必须小于等于父类方法的异常抛出类型。
<6>.重写(Override)与重载(Overload)的区别:
重写:子类对父类的方法进行重新实现
重载:对同一个类中的同名、不同参数方法的描述。
三、多态
1.所谓多态,通俗意义就是一种名字具有多种含义或多种表现形式更专业的叫法是:同一个实现接口,使用不同的实例而执行不同的操作。
2.java中的多态分为:编译时多态,如:同一个类中方法的重载。运行时多态,如:子类对父类方法的重写。
3.多态可以提高类的抽象性和封装性。
4.对象的转型
将一个对象由一个类型转型为另外一个类型,类似数据转换。
转型分为:
<1>.向上转型:
由子类类型转为父类类型。
向上转型肯定会成功,是一个隐式转换。
向上转型后的对象,将只能访问父类中的成员。
<2>.向下转型:
由父类类型转为子类类型。
向下转型可能会失败,需要强制进行,是一种显示转换。
向下转型后的对象,将可以访问子类中特有的成员。
5.instanceof
向下转型存在失败的可能性,所以要进行类型判断,判断这个对象是不是我们想要转型的类型。