继承中一个经典的应用就是equals方法
equals跟==的区别:
****是一个判断相等的运算符
这个运算符两边如果是基本数据类型,判断的是基本数据类型的值是否相等
比如:
int i=3;
int j=3;
System,out,println(ij);//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
抽象类:
如果一个类,有方法没有方法体,那么这个方法就是抽象方法
即,方法只有声明,没有方法体
如果一个类中,只要有抽象方法,那么这个类就是抽象类
说明这个类不具体
抽象类也是类,有类就可以放属性和方法(带方法体,不带方法体)
抽象类中可以放置属性,属性使用来存储数据的
抽象类中可以放置有方法体的方法,此方法能够完成某些功能
抽象类中可以放置没有方法体的方法,这个方法就是抽象方法
只要类中有一个抽象方法,这个类就是抽象类
抽象类是不能实例化对象,因为抽象类有抽象方法
程序员不能实例化,并不等于jvm不能实例化对象
抽象类只能当父类,
如果在子类中把所有的抽象方法都补上方法体,
那么这个子类就不是抽象类了,就可以实例化对象了
同时也可以调用方法了
如果在子类中没有把所有的抽象方法给补上方法体
那么这个类还是抽象类,满足抽象类的用法
抽象方法不能用static ,final,private修饰
**抽象类的应用场景:**
在父类中有一些方法体,或者没有必要给上方法体
此时把方法做成抽象方法,那么此类就变成抽象类
比如:
shap形状类中有一个方法叫做draw()绘制图形的方法
Triangle继承自Shap类,draw()方法就可以绘制三角形
Retangle继承自Shap类,draw()方法就可以绘制矩形
shap类中的draw方法就应该是抽象方法,因为shap
不代表具体形状,所以没办法复制
把抽象类抽象到极致,所有的方法都没有方法体,
此情况不建议做成类,建议做成接口
接口:
接口中的所有的方法都是抽象方法,即没有方法体,接口方法
接口中可以放属性,但属性默认是public static final的
接口不适合存储数据,更适合做功能
而类适合存储数据
接口的特点:
接口中的方法和属性都是公有的
接口是不能实例化对象的
必须由子类实现接口,且子类可以实现多个接口,解决java的单继承问题
多个接口用逗号间隔
子类实现接口的关键字implements
直到子类把接口中的所有的方法都实现了,才可以实例化子类对象
否则子类就是抽象类
接口中可以有属性,但默认的是public static final不适合存储数据
接口中可以有方法,方法必须都是没有方法体的,且是公有的,public可以省略
定义接口的关键字interface
接口不能实现接口,但接口可以继承接口,而且还可以多继承
即接口extends接口1,接口2…
接口中没有构造方法
结论:
接口更适合放置方法,而不适合存储数据
类适合存数据,抽象类和普通类
接口就是对子类功能的规范,子类必须全部实现接口中的方法
接口的案例:
Person 接口:
Study()
Eat();
Abstract CommonPerson类 实现了person接口
String name;
Int age;
Abstract study();
Abstract eat();
Sleep()
Student类 继承自CommonPerson
String stuNo;
重写:是学生的学习方式和吃的方法
Study();
Eat();
自己的方法
Homework();
Teacher类 继承自CommonPerson
Int salary;
重写:是老师的学习方式和吃的方法
Study();
Eat();
自己的方法:
Teach();
为什么要使用接口:
1.用接口可以限定子类,必须实现接口规定的所有方法
以保证项目功能的完整性
2,用接口可以实现多态,有接口就一定有继承,而多态是以继承作为基础的
多态:
顾名思义就是多种表现状态
最直观的理解:有对象名称,用对象名称打点调用方法
在不同的时候执行的方法的功能是不一样的
*多态的判断标准:(重要的)
1.跨类且继承,多态是以继承作为基础的
2.子类重写长辈的方法
3.子类对象赋值给长辈的引用
比如:
CommonPerson cp=new Student();
Person p=new Student();
Object obj=new Student();
4.用长辈的引用打点调用方法
-用对象打点能调用出哪些方法,取决于这个对象所对应的类
或接口中有哪些方法
-如果用长辈的引用打点调用的方法,是重写过的方法,
那么就执行子类重写后的方法
-如果长辈的引用打点调用的方法是没有重写的方法,
则执行的是本长辈中的方法
能够表达出多态的应用场景:
1.以长辈作为方法或函数的参数
2.以长辈作为方法或函数的返回值
如果不用多态:
-代码的书写量大
-结构不优化
-代码的复用率不高(复用率低)
-最终导致开发效率低
-优点,代码的可读性很高
如果使用多态:
-把所有的共用属性抽象出来放在长辈类中
-把所有共用方法抽象出来放在接口中,用于表示功能
-使用多态会增加类和类之间的关系,导致类和类之间的复杂度增高
-使用多态可以提高代码的复用率
-使用多态,可以大大提高开发效率
-使用多态,程序的结构优化