第三章 类和对象

本章目标:

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 = (子类类名)对象名;
}

体现:面向对象中的多态