继承
继承必须以封装为基础, 实现继承就是为了代码的重用,继承充分展现了代码的可复用性 因为现实世界有很多的继承关系,所以把现实世界的物或事 转换到计算机中,就需要java的继承,同时增加类和类的关系 此关系很单一,就是继承关系
- 所有的非Object类都有父类,如果没有写extends关键字, 实际上默认继承了Object顶级父类
- java的根类是Object类
继承中的几个容易混淆的概念:
子类能够继承长辈的非私有的东西(属性和方法)
子类不是拥有长辈的东西,只是子类对长辈的东西有访问性
类里的东西就是本类自己的
有了继承之后,同样要考虑数据的存储问题,对象的数据该如何存取
在子类中利用继承的可访问性调用长辈的方法,用长辈的自己的方法
操作长辈类自己对象中的私有属性
super关键字:
super(参数列表)
参数列表,是可以是0个也可以是多个
调用父类构造,且super(参数列表)只能写在子类构造的第一条语句
super()调用的是父类无参构造,如果不写,系统会自动给添加上
super. 用来调用父类的方法或属性. 前提,父类是否允许子类调用
结论:
做继承是为复用长辈中的的内容(属性和方法),
即,就在子类中使用长辈中的内容(属性和方法)
所以继承优点:可以使用长辈中的内容
缺点:增加了类和类的复杂关系
如果继承的层次越多,子类中
可访问的内容就越来越多
但是,子类并不都需要
在开发中少用继承,多用组合
-
什么时候用继承?
-继承的层次不要太多
-要使用多态的时候必须是以继承做为前提的 -
什么时候使用组合?
-想要获取别的类中的方法和属性的时候可以组合
-现用,现组合 -
组合的方式有两种
- 方式一:
在类中放置属性/组合属性
public class xx{
//组合另一个Test类的对象
private Test test;
public void method(){
//在此方法中可以使用或操作test对象中的数据
}
} - 方式二:
在类的方法中组合数据
public class yy{
public void method(Test test){
//在此方法中使用或操作test对象中的数据
}
}
- 方式一:
组合是 has a的关系 has a 有一个
上面的方式一:xx类有一个 test对象
方式二:yy类中的method方法有一个test对象
继承是 is a的关系 is a 是一个
Student is a CommonPerson 学生是一个普通人
Teacher is a CommonPerson 老师是一个普通人
想要获取别的类中的数据
1.用继承
2.用组合
继承中的重写
跨类且继承,子类重写父类的方法
方法重写的若干要求
- 子类重写的方法的权限修饰符必须大于等于父类
- 子类中重写的方法的返回值类型必须小于等于父类
- 如果父类中的方法的返回值是基本数据类型或void
那么子类在重写方法的时候,返回类型必须一致 - 如果父类的返回类型是最终类(final),那么子类
在重写方法的时候,返回类型必须一致
一般情况下,只要父类中要重写的方法的声明跟子类方法的声明
一样即可
重写和重载的区别:
- 重载:
在类内,相同的方法的名称,但参数的个数和类型不相同 - 重写:
跨类且继承,子类把长辈的方法体覆盖
访问修饰符!!!
本类中 子类中 同包类中 其他类中
public: √ √ √ √
protected: √ √ √
默认/friendly/default: √ √
private: √
继承中的一个经典的应用就是equals方法
equals跟==的区别:
-
==是一个判断相等的运算符
这个运算符的两边如果是基本数据类型,判断的是基本数据类型
的值是否相等
比如:
int i=3;
int j=3
System.out.println(i==j) ; //true这个运算符的两边如果是某个类类型的对象,判断的是两个
对象是否是同一个地址,
如果地址相同,那么内容就一定相同
如果地址不相同,内容就不一定相同 -
equals方法不能判断基本数据类型的数据,只能判断对象是否相等
如果没有重写equals方法,那么equals方法判断的是地址
因为这个equals方法是继承自Object的equals方法,Object
类中的equals方法判断的是地址
如果某个类重写了equals方法,那么就看equals方法中实现的
判断是什么,一般情况下判读单的是equals两端对象的内容.
在java的类库中象String,封装类(Integer,Float,Double…)
中的equals判断的就是内容是否相等.
instanceof 运算符:
instanceof运算符左边是一个对象, instanceof运算符右边是一个 类
判断instanceof左边的对象是否是右边类类型的对象 instanceof运算符的返回值是boolean
比如:
Student stu=new Student();
System.out.println(stu instanceof Student);//true