JAVA面向对象.docx
- 文档编号:29090398
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:73
- 大小:195.78KB
JAVA面向对象.docx
《JAVA面向对象.docx》由会员分享,可在线阅读,更多相关《JAVA面向对象.docx(73页珍藏版)》请在冰豆网上搜索。
JAVA面向对象
Java面向对象(OOP面向对象编程)(扩展OOAD面向对象分析与设计)
1学习方法
思想:
理解,想明白。
动手少,动脑多。
两个阶段:
1OOP面向对象编程:
语法,会创建类,实例化对象,正确实现继承,多态的使用。
2OOAD面向对象分析与设计:
提高。
软件工程继承的作用。
多态开发环境能干什么。
2面向过程与面向对象的区别
1面向过程:
C语言
最核心:
过程(函数,方法)
最小颗粒度:
过程(函数,方法)。
一个方法一经定义,功能没有任何变化。
关心:
功能本身
2面向对象:
Java
最核心:
对象(函数中完成功能的具体的对象)
最小颗粒度:
对象。
一个方法一经定义,功能可以有变化。
关心:
实现功能的对象。
盖房子:
基本步骤:
挖地基->墙->顶->门
面向过程:
挖四角地基(),挖五角地基(),四角墙(),五角墙(),平顶(),尖顶(),圆门(),方门()
盖四角房子(){
挖四角地基();
四角墙();
平顶();
方门();
}
盖四角圆门房子(){
挖四角地基();
四角墙();
平顶();
圆门();
}
问题:
对于需求的变化适应性太差。
盖房子:
基本步骤:
挖地基->墙->顶->门
面向对象:
关注的是实现功能的对象。
招工。
四角地基人,五角地基人,四角墙人,五角墙人,平顶人,尖顶人,圆门人,方门人
盖房子(地基人,墙人,顶人,门人){
地基人.挖地基();
墙人.墙();
顶人.顶();
门人.门();
}
3面向对象?
什么是对象
对象:
分成现实世界的对象和java中的对象。
1现实世界的对象:
现实世界中客观存在的事物都叫对象。
姚明和潘长江梅西
2java中的对象:
就是一个变量。
变量有点特殊。
类型是“class”类类型。
Strings=null;//String是java中类。
s是String类型的变量。
String类的对象。
NBA2016姚明FIFA中梅西
使用java中的对象去模拟现实中的对象。
现实中的对象有:
特性:
身高,体重
行为:
盖帽,跑。
java中的对象有:
属性和方法
属性:
身高,体重
方法:
盖帽,跑。
java中的对象是“Class”类型的变量。
inti;//声明
i=10;//初始化
所以使用java中的对象必须先有“Class”。
使用java中对象必须先有这个对象类型:
类。
4类是什么?
关键字:
class
类就是个数据类型,与int没什么区别。
类是一个我们自定义的数据类型。
类这种数据类型中可以有:
属性和方法。
因为java中的对象有:
属性和方法
类就是对象的模板。
类中有属性和方法?
现实大量的对象---->抽象相同的特殊和行为---->封装成类----->创建java中的对象
现实中大量学员---->每个学员都有学号,姓名,学习,喊到---->封装成学员类----->创建java中的每一个学员对象
5创建类
类的关键字:
class
创建类的格式:
publicclass类名{
属性(变量);
方法(函数);
}
案例:
学员类:
学号,姓名,签到
publicclassStudent{
privateintsid;//学号
Stringname;//姓名
publicvoidcheckin(){
System.out.println("学员"+name+"签到成功!
叮叮叮叮叮叮!
");
}
}
类名的首字母在大写。
6创建对象
在java中创建对象使用关键字"new"。
“new”是实例化的关键字。
创建对象也中实例化对象。
格式:
class类型对象名称=newclass类型();
new关键字的实例化的过程就是在内存中开辟空间的过程。
创建一个学员对象
Students1=newStudent();
再创建一个
Students2=newStudent();
s1和s2就是变量,是Student这个class类型的变量,也叫Student类的两个对象。
s1和s2是两个引用,使用new关键字在内存中开辟的空间叫实例。
7实例属性和实例方法
在类中声明的一系列的变量,称为属性,也称为实例变量和实例属性。
实例属性是属于这个类的每一个单独的实例的。
Student类中声明了一个实例属性name,表示每个Students类的实例都有一个自己的name。
在类中声明的一系列的方法,称为实例方法。
实例方法属于实体的。
实例方法只能访问自己实例中的实例属性。
8访问实例属性和实例方法
在访问实例属性和实例方法之前必须先有实例。
使用格式:
实例引用名称.实例属性实例引用名称.实例方法()
在一个类中实例属性是属于整个类的范围。
所以声明时没有前后的关系。
一般为了程序可读性高,把所有属性和声明都写到的类的前面。
9两个访问修饰符
public公有,在任意地方都可以被访问
private私有,只能在声明的类中访问
9.1JavaBean规范。
1属性应该私有。
privateStringname
2为私有属性配置公有的set和get方法
set方法为属性赋值的方法。
get方法是取属性值的方法。
set方法格式:
set+属性名称.首字母大写()
publicvoidsetName(String){}
get方法格式:
set+属性名称.首字母大写()
publicStringgetName(){}
3要有默认构造方法
10构造方法
一个类中必须有构造方法,也一定有构造方法。
最少一个。
10.1构造方法的格式
构造方法也是类中的方法,有点特殊。
1方法名称必须与类名一致。
2没有返回类型说明
void是不是返回类型说明?
是。
格式:
public类名(){}
10.2构造方法的分类
10.2.1隐式构造方法
隐式构造方法与默认构造方法格式完全一致。
当一个类中没有写明构造方法时由系统自动为类增加的构造方法叫隐式构造方法。
系统会为我们自己增加一个默认构造方法。
10.2.2默认构造方法
没有参数的构造方法叫默认构造方法
10.2.3参数化构造方法
有参数的构造方法叫参数化构造方法
10.3构造方法的作用
实例化对象的过程就是调用构造方法的过程。
构造方法由系统自动调用,在实例化对象时调用,由new关键字后面的类名()这个格式确定。
在实例化时必须能配置到一个满足格式的构造方法。
一个类提供了哪种格式的构造方法,这个类只能按构造方法的格式实例化。
构造方法的作用:
1规范实例化的格式
2初始化实例属性
11this关键字
this关键字是引用。
this关键字是一个在实例内部的引用。
this关键字是每个实例内部都有一个。
this关键字是一个指向实例本身的引用。
作用法:
1this.属性表示本类的实例属性
2this.方法()表示调用本类的实例方法
3this()表示调用本类的构造方法
注意:
调用本类构造方法时只能在本类的构造方法中,只能在第一行。
12方法重载
同类同名不同参
在一个类中有多个方法,这些方法之间有相同的方法名称。
但是有不同的参数列表,称为方法重载。
参数列表不同:
1参数个数不同。
2参数类型不同。
就是为减少方法名称的数量
面向对象语言的三大特性----封装,继承,多态
14面向对象语言的三个特性
封装,继承,多态
封装的目的为了有方法和类
继承就是实现父类与子类之间的关系。
代码复用。
多态才是整个面向对象语言的核心。
封装和继承都是为了多态做准备。
15封装?
15.1封装是什么?
哪里是封装?
封装就是"{}"
将多行代码组织一个整体。
if(条件){
代码块;
}
封装的目的是为了有得到方法和类。
方法是相同代码的封装。
类是大量相同对象的封装。
写java程序时是先要有类再有对象。
开发之间的分析和设计阶段是先要有大量现实世界的对象,将相同的属性和方法封装成类。
15.2封装的目的?
隐藏代码实现。
药,成分比例。
自己做饭和订饭
15.3数据封装-访问修饰符
在java中一共有四个访问级别,一共只有三个访问修饰符。
(1.8之前)
修饰符
访问范围
是否能被子类继承
private
本类内部
不能被子类继承
(default)
本类内部+同包的其他类
不能被继承
protected
本类内部+同包的其他类+非同包的子类
能被继承
public
公开,能被所有类访问
能被继承
16继承extends
16.1在java程序中如何实现继承关系
继承一定是两个类之间的事情。
会有父类与子类。
publicclassA{}
publicclassBextendsA{}-这个就是java中继承的语法
其中B类我们叫子类,派生类
其中A类我们叫父类,基类
继承的格式:
访问修饰符class子类名称extends父类名称{
}
注意:
java只支持单一继承,就是说一个类只能有一个直接父类。
16.2为什么要继承?
子类可以继承父类的属性和方法。
子类可以在不定义属性和方法时直接使用父类的属性和方法。
继承的目的从语法上说就是一件事,代码复用。
16.3Object类
所有类的根。
所有类的顶层父类。
当一个类在创建时没有指明父类时,自动继承Object。
16.4继承时内存的表现方式是什么?
继承是不是单纯的代码复制?
继承不是单纯的代码复制。
而是在内存中会有一个父类的实例。
在子类中有特殊的引用去指向这个父类的实例。
当子类调用子类没有的方法或属性就会使用这个特殊的引用去父类的实例中查找。
会在内存开辟两个对象的实例。
16.5继承实际是一个引用父类实例,先创建哪一个?
先父类后子类。
先创建父类实例,再创建子类实例。
16.6创建实例时调用构造方法,继承关系时构造方法的执行顺序?
构造方法是先调用子类的构造方法,子类的构造方法的第一句是调用父类的构造方法。
子类中调用父类的构造方法使用super的关键字。
16.7super关键字
super是一个引用。
super是实例内部指向其实例父类实例的一个引用。
super的作用三个:
1super.属性可能引用父类的属性*访问权限要有
2super.方法()可以调用父类的方法主要使用在方法重写时。
3super()可以在子类的构造方法的第一行调用父类的构造方法。
如果构造方法的第一行不是this或super,系统将默认调用父类默认构造方法。
结论:
在子类类中可以使用super来指定调用父类的构造方法
16.8实际开发时我们应该先开发哪个类?
先写父类。
再开发子类。
16.9父类是怎么来的?
类是大量相同对象的属性和方法的抽象。
父类是对大量子类的相同属性和方法的抽象。
publicclassPerson{
privateintid;//编号
privateStringname;//姓名
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoiddis(){
System.out.println("编号:
"+id);
System.out.println("姓名:
"+name);
}
}
publicclassTeacherextendsPerson{}
publicclassStudentextendsPerson{}
publicstaticvoidmain(String[]args){
Studentstu=newStudent();
stu.setId(191);
stu.setName("刘金锁");
stu.dis();
Teachert=newTeacher();
t.setId
(1);
t.setName("peter");
t.dis();
}
16.10在继承时子类共性的内容放到父类,子类可以有自己的内容
子类可以有自己的属性和方法。
publicclassPerson{
privateintid;//编号
privateStringname;//姓名
publicvoiddis(){
System.out.println("编号:
"+id);
System.out.println("姓名:
"+name);
}
publicPerson(){
}
publicPerson(intid,Stringname){
super();
this.id=id;
this.name=name;
}
//set&get
}
学员可以有自己的成绩(score)
publicclassStudentextendsPerson{
privatedoublescore;//学员自己成绩
publicStudent(){
}
publicStudent(intid,Stringname,doublescore){
super(id,name);//是每一个子类实例有一个自己父类实例?
this.score=score;
}
//set&get
}
教员可以有自己的工资(salary)
publicclassTeacherextendsPerson{
privatedoublesalary;//教员自己的工资
publicTeacher(){
}
publicTeacher(intid,Stringname,doublesalary){
super(id,name);
this.salary=salary;
}
//set&get
}
16.11因为子类可以具有特性,从父类继承的方法在子类中不适用
当父类方法在子类中不适用时,1自己写一个新,2将父类的方法修改。
继承最核心的功能就是在子类中可以修改父类的方法。
叫方法重写。
16.12方法重写(继承真正的目的)
方法重写就是将父类的方法在子类中进行修改。
在子类中写一个与父类继承的方法一样的方法。
将方法中的实现进行修改。
父类中有dis方法:
这个dis方法只能输出编号和姓名
publicclassPerson{
privateintid;//编号
privateStringname;//姓名
//打印信息
publicvoiddis(){
System.out.println("编号:
"+id);
System.out.println("姓名:
"+name);
}
}
学员子类:
有特性:
成绩。
继承来的dis方法中能输出成绩。
publicclassStudentextendsPerson{
privatedoublescore;//学员自己成绩
}
在学员子类中对父类的dis方法进行方法重写(修改)。
publicclassStudentextendsPerson{
privatedoublescore;//学员自己成绩
//方法重写,将父类中的dis在子类中进行重写。
publicvoiddis(){
super.dis();//调用父类的dis方法
System.out.println("成绩:
"+this.score);
}
}
16.13练习:
某公司的雇员分为以下若干类
某公司的雇员分为以下若干类:
Employee:
这是所有员工总的父类,属性:
员工的姓名(name),员工的生日月份(month)。
方法:
getSalary(intmonth)根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。
SalariedEmployee:
Employee的子类,拿固定工资的员工。
属性:
月薪(monthlySalary)
HourlyEmployee:
Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。
属性:
每小时的工资(hourlySalary)、每月工作的小时数(hours)
SalesEmployee:
Employee的子类,销售人员,工资由月销售额和提成率决定。
属性:
月销售额(sales)、提成率(commission)
BasePlusSalesEmployee:
SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
属性:
底薪(baseSalary)。
publicclassEmployee{
privateStringname;
privateintmonth;
publicEmployee(){
}
publicEmployee(Stringname,intmonth){
this.name=name;
this.month=month;
}
publicdoublegetSalary(intmonth){
if(this.month==month){
return100;
}else{
return0;
}
}
}
publicclassSalariedEmployeeextendsEmployee{
privatedoublemonthlySalary;
publicSalariedEmployee(){
}
publicSalariedEmployee(Stringname,intmonth,doublemonthlySalary){
super(name,month);
this.monthlySalary=monthlySalary;
}
@Override
publicdoublegetSalary(intmonth){
returnsuper.getSalary(month)+this.monthlySalary;
}
}
publicclassHourlyEmployeeextendsEmployee{
privateinthours;
privatedoublehourlySalary;
publicHourlyEmployee(){
}
publicHourlyEmployee(Stringname,intmonth,inthours,doublehourlySalary){
super(name,month);
this.hours=hours;
this.hourlySalary=hourlySalary;
}
@Override
publicdoublegetSalary(intmonth){
if(hours>160){
returnsuper.getSalary(month)+160*hourlySalary
+((hours-160)*hourlySalary*1.5);
}else{
returnsuper.getSalary(month)+(hours*hourlySalary);
}
}
}
publicclassSalesEmployeeextendsEmployee{
privatedoublesales;
privatedoublecommission;
publicSalesEmployee(){
}
publicSalesEmployee(Stringname,intmonth,doublesales,doublecommission){
super(name,month);
this.sales=sales;
mission=commission;
}
publicdoublegetSalary(intmonth){
returnsuper.getSalary(month)+(this.sales*mission);
}
}
publicclassBasePlusSalesEmployeeextendsSalesEmployee{
privatedoublebaseSalary;
publicBasePlusSalesEmployee(){
}
publicBasePlusSalesEmployee(Stringname,intmonth,doublesales,
doublecommission,doublebaseSalary){
super(name,month,sales,commission);
this.baseSalary=baseSalary;
}
@Override
publicdoublegetSalary(intmonth){
returnsuper.getSalary(month)+baseSalary;
}
}
16.14汽车的练习:
代码的复用
使继承写出对应和程序:
有三种汽车:
巴士、卡车、出租车
汽车具有品牌,车牌的属性,加速和刹车的方法
巴士具有自己的最大载客数量的属性,报站和让座提示的方法
卡车具有自己的最大载重数量的属性,卸货的方法
出租车有所属公司的属性,打发票的方法
17类与类之间的关系
在java语法上任意两个类都可以继承。
在软件工程角度是不是任意两个类都应该去继承?
不是。
什么样两个类可以继承?
两个类要具备"is-a"是一个。
子类是一个父类。
类与类之间是有关系的:
三种情况:
"is-a"是一个,"ha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 面向 对象