studyNote_java基础_day08
作者:互联网
复习
就是把现实世界的对象转换到计算机中的对象
就是把现实世界中的各种不同的类型的数据组织成内存的数据模型
现实世界的对象转换成首先转换成java的类,有java的类在内存中实例化类的对象
类就是一个名词,一个数据结构,一个数据类型(类类型),模型
用类在内存中实例化很多此类型的对象
且对象在堆中存储的数据
**保证数据的存取安全性**
属性数据都是私有的,方法都是共有的(公有的getter,setter,构造)
一般情况下,单独写个类,类里有方法,如果需要数据,就组合
方法参数组合(建议,线程安全)
类的属性组合
完成了封装:封装的是数据
因为有了属性和方法,在很多类中出现,所以为了代码的复用引出继承,
子辈和长辈,子辈和长辈存储数据以及数据安全性问题
创建子辈对象时会先逐级创建长辈对象,是谁的数据就存在谁的对象中
这些长辈需要通过子辈对象的操作,前提长辈必须允许子辈访问,
所以长辈不拥有长辈的内容,只对长辈具有访问性
继承中的一个经典应用就是 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运算符的返回值是boolean
比如
Student stu = new Student();
System.out.println(stu instanceof Student)
//输出的是true
**抽象类:**
如果一个类中,有方法没有方法体,那么这个方法就是抽象方法
即只有声明,没有方法体
如果一个类中,只要有抽象方法,那么这个类就是抽象类
说明这个类不具体
抽象类也是类,有类就可以放属性和方法(带方法体和不带方法体)
抽象类中可以放置属性,属性用来存储数据
抽象类中可以放置有方法体的方法,这个方法能完成某些功能
抽象类中可以放置没有方法体的方法,这个方法就是抽象方法
只要类中有抽象方法,这个类就是抽象类
抽象类不能实例化,抽象类中有抽象方法
程序员不能实例化此类对象,并不等于jvm不能实例化此类对象
抽象类只能当父类
如果在子类中把所有的抽象方法都补上方法体
那么这个子类就不是抽象类,就可以实例化对象了
同时也可以调用方法
如果在子类中没有所有的抽象方法给补上方法体,
那么这个类还是抽象类,满足抽象类的用法
抽象方法不能用static,final,private修饰
**抽象类的应用场景:**
在父类中有一些方法没有方法体,或者没有必要给上方法体,
此时把方法做成抽象方法,那么此类就变成抽象类
比如:
Shape形状类中有一个方法叫做draw()绘制图形的方法,
Triangle继承自Shape类,draw()方法就可以绘制三角形了
Tetangle继承自Shape类,draw()方法就能绘制矩形
Shape类中的draw()方法就应该是抽象方法,
因为Shape类不代表具体形状,
所以没办法复制
抽象类抽象到极致即所有的方法都没有方法体
此情况不建议做成类,建议做成接口
**接口:**
接口中的所有方法都是抽象方法,即没有方法体,接口方法
接口里可以放属性,但是属性默认是公有的(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();
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.以长辈作为函数或方法的返回值
如果不用多态,
代码不优化,
代码书写量大
代码复用率低
导致开发效率低
优点:
代码的可读性很高
如果使用多态:
把所有的共用属性抽象出来放在长辈类中,用于表示数据的存取
把所有的共用方法抽象出来放在接口中,用于表示功能
使用多态会增加类与类之间的关系,导致类与类之间的复杂度增高
使用多态可以提高代码的复用率
使用多态可以大大提高开发效率
使用多态可以使程序的结构优化
长辈类:
类中可以放置属性
类中的所有的方法都有方法体,
类中的部分方法是没有方法体,这些方法就是抽象方法,
类中的所有方法都没有方法体,也是抽象类建议改成接口
长辈接口:
能放属性,属性默认是public static final
所有的方法都没有方法体
标签:day08,java,对象,子类,接口,长辈,抽象类,方法,studyNote 来源: https://blog.csdn.net/qq_44374349/article/details/95172109