第三章 类和对象
本章目标:
1.了解面向对象的概念和特性
2.理解抽象和封装
3.掌握类和对象的创建
4.掌握类、成语变量和成员方法的使用
5。掌握包的声明和导入
一、面向对象和面向过程的区别
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象:把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
如:五子棋
面向过程的设计思路就是首先分析步骤:1 开始游戏 2 黑子先走 3 绘制画面 4 判断输赢等
面向对象则是把五子棋分为各个对象:1 黑白双方 2 棋盘系统 绘制画面 3 规则系统 判定输赢和犯规等
盖房子:
面向对象思想:
1、找建筑师,画图纸
2、找建材厂,买建材
3、找工程队,根据图纸造房子
4、直到完工
面向过程思想:
1、缺水泥,买水泥
2、缺钢筋,买钢筋
3、材料准备齐全,先建第一层楼(研究分几个房间,楼梯建哪里,厕所建哪里)
4、建好后,建第二层楼
5、直到完工
总结:面向对象和面向过程的区别
①面向对象:是从宏观方向思考问题,先抽象,后具体
①面向过程:是从细节思考问题,先细节,再整体
面向对象,往往也包含了面向过程的思想
面向对象较面向过程的优点和缺点
优点:
结构清晰
封装性
容易拓展,代码重用率高
缺点:
增加工作量
性能低:计算时间和空间存储大小开销大
面向对象的三大特点:封装、 继承、 多态
二、什么是类
类是具有相同属性和行为的一组对象的集合
比如说:人类,动物类等
三、什么是对象
具有明确行为的具体实体,具体行为和状态
类的实例,如某个人,某个动物
四、创建类
public class Person{
string name;
int age;
}
五、创建对象
先声明: 类名 对象名=null;
实例化:对象名=new 类名();
属性方法使用:对象名.属性 对象名.方法
Person p = new Person();
p.name="张三";
p.age=18;
六、对象的产生过程:栈存储对象名 堆存储值
Person p1=p2;
p1.setName();//p2也会改变
p1/p2只想同一个堆里的值
只声明对象出现的异常
修饰符
private 私有的 被private修饰的属性和方法 只能在当前类中使用
public 公共的 被public修饰的属性和方法 能在当前项目中所有类调用
七、封装
对用户隐藏实现细节,对对象信息进行封装
封装主要使用private,将属性私有化,生成对应的set和get方法
封装使数据和操作数据的方法成为一个整体,以实现独立性很强的功能模块
八、构造方法
1、构造方法的特点
访问修饰符 类名(){
}
2、构造方法的调用
只有在实例化对象的时候
3、构造方法的分类
a)有参数的构造方法(参数一般是给属性赋值)
b)无参数的构造方法
注意:有参数的构造方法存在之后,默认的无参数构造方法就不可用,需要用,就显示写出来
九、方法重载
1、什么是方法重载
方法名相同,参数的个数,类型或者顺序不一致
2、什么时候需要方法重载
计算2个数的和(int)
要做的同一件事情,但是可能需要的参数不一致,就可以用方法重载
十、继承
1、生活中的继承
继承家产:在原来的财富上,增加更多的财富
2、程序中的继承
把几种类的相同属性和行为,抽取出来,放在另外一个类里面,接着,这几种类就继承此类
人类:姓名,性别,年龄
学生类:所在班级,人类
教师类:教的班级,人类
员工类:人类
3、类继承类的语法:extends
修饰符 class 类名 extends 父类类名{
//自己的属性
//自己的方法
}
4、继承的注意事项
1)子类继承父类,就拥有了父类的所有属性和行为
2)不能继承私有的private修饰的属性和方法,构造方法也不能继承
3)单继承(子类只能有一个父类)
5、父类与子类的称呼
父类:基类、超类
子类:派生类、衍生类
十一、方法重写
1、什么是方法重写
子类重写父类的方法,返回值类型,方法名及参数一模一样
2、方法重写与方法重载的区别
1)方法重写:一定是父类继承
2)概念不一样
十二、子类产生的过程
1、生活中子类产生:
有孩子必须要有父母
2、java中子类产生:
子类有产生之前,也会先存在一个父类
3、程序中子类产生的过程
①先构造一个父类对象
②再构造一个子类对象
重点:子类对象创建之前,一定会先默认的创建好所有的父类对象
4、父类对象怎么产生?
①在子类的构造方法中,第一行,隐藏着一行代码:
super();//调用父类无参构造方法
②在子类的构造方法中,可以自己手动的(自己写)调用父类的有参构造方法
super(实际参数......);//隐藏的调用无参构造方法就不存在了
十三、super关键字
1、什么是super?
可认为是父类对象
2、在什么地方使用super?
在子类中使用
3、怎么使用super?
a)在子类的构造方法中使用
i.在每个子类的每个构造方法的第一行代码中,:
1.super();//存在一个隐藏的代码,调用父类的无参构造方法
2.super (实际参数......);//隐藏的super()就不存在了
b)在子类的任何方法中使用
i.super.属性;//使用父类的属性
ii.super.方法();//使用父类的方法
十四、this关键字
1、什么是this?
可认为是当前类对象
2、在什么地方使用this?
在任何类中使用
3、怎么使用this?
a)在构造方法中使用
i.可写在类的构造方法的第一行
1.this();//调用无参数的构造方法
2.this(参数,......);//调用有参数的构造方法
注意:此时,这个构造方法的隐藏调用父类的无参数构造方法,就不存在了
b)在子类的任何方法中使用
i.this.属性;//使用当前类的属性
ii.this.方法();//使用当前类的方法
十五、父子对象之间的特殊引用
1、父类对象可以当做子类对象使用
父类类名 对象名 = new 子类类名();
注意此时对象有使用限制:
①只能使用父类的属性和方法
②对于被子类重写的方法,则会使用重写后的方法
2、转换成真正的子类?直接使用强制类型转换
子类类名 对象名2 = (子类类名)对象名;
3、instanceof关键字:用来匹配类型
用法:
//是否可以匹配此类型
if(对象名 instanceof 类名){
//则可以强制转换成此类型使用
子类类名 对象名2 = (子类类名)对象名;
}
体现:面向对象中的多态