面向对象
面向对象思想
- 一切客观存在的事务都是对象,万物皆对象
- 任何对象,一定具有自己的特征和行为
特征
称为属性,一般为名词,代表对象有什么
行为
称为方法,一般为动词,代表对象能做什么
生活中面向对象
面向过程: 自己是执行者的身份
面向对象:找一个对象帮你处理任务
技术中面向对象
现实中的对象对象多数来自于模板,程序中的对象也应有模板
-
面向对象中的类和对象的概念
-
类:一类事物的抽象 例如:水果类 老师类
对象:一类事物中的具体的实例(个体) 菠萝 老李
-
-
面向对象的编程设计:(先抽象–类,后具体—对象)
- 创建一个类,类中有属性和方法;实例化一个对象,通过对象调属性和方法
类
抽取
在一组相同或类似的对象中,抽取共性的特征和行为,保留所关注的部分
例如:通过对狗的抽取可取得以下共性
定义
属性
通过变量表示,又称实例变量
语法 数据类型 属性名;
位置 类的内部 方法的外部;
public class Dog{
String breed; //品种
int age; //年龄
String sex; //性别
String color; //毛色
}
方法
通过方法表示,又称实例方法
语法 不再写static
public class Dog{
public void eat(){
}
public void sleep(){
}
}
对象的创建
通过new关键字进行对象的创建实例化
public class TestCat {
public static void main(String[] args) {
//通过类,来创建对象/实例 并赋予属性
Cat cat1 = new Cat("啾啾","母",2,"白色","布偶猫");
System.out.println("这是一只"+cat1.color+"叫"+cat1.name+"的"+cat1.age+"岁"+cat1.color+cat1.type);
//猫的行为
cat1.cry();
cat1.play();
cat1.action();
}
}
类和对象的关系
类:定义了对象应有的特征和行为,类是对象的模板
对象:拥有多个特征和行为的实体,对象是类的实例
实例变量
默认值
- 整数:0
- 小数:0.0
- 字符:空格
- 布尔:false
- 其他:null
实例变量vs局部变量
实例方法
对象的实例方法包含两部分:方法的声明和方法的实现
方法声明
- 代表对象能做什么
- 组成:修饰符 返回值类型 方法名(形参列表)
方法的实现
- 代表对象怎么做:即如何实现对应的功能
- 组成:逻辑代码
方法重载
在某些情况下 对象的同一种行为可能存在多种实现过程
重载:一个类中定义多个相同的方法
要求:
- 方法名相同
- 参数列表不同(类型、个数、顺序)
- 与访问修饰符、返回值类型无关
调用带有重载的方法时,需要根据传入的实参去找与之匹配的方法
好处:灵活、方便、屏蔽使用差异
构造方法
构造方法:类中的特殊方法,主要用于创建对象
特点:
- 名称与类名完全相同
- 没有返回值类型
- 创建对象时,触发构造方法的调用,不可通过句点手动调用
注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法
对象创建过程
- 内存中开辟对象空间
- 为各个属性赋予初始值
- 执行构造方法中的代码
- [将对象的地址赋值给变量]
对象的内存分配
存储对象的变量中保存对象的地址,通过变量中的地址访问对象的属性和方法
构造方法重载
构造方法的重载也遵循重载规则
默认构造方法
- 在类中,如果没有定义构造方法,则编辑器默认提供无参构造方法
- 如果手动添加有参构造方法,则无参构造方法不再提供,可根据需求自动添加
构造方法为属性赋值
- 创建对象的同时,将值传入构造方法
- 由构造方法为各个属性赋值
this关键字
- 类时模板,可服务与此类的所有对象,this时类中的默认引用,代表当前实例,此类服务某个对象时,this指向这个对象
使用方法
- 调用实例属性 实例方法 如:this.name;this.sayHi()
- 调用本类中的其他构造方法。如:this()、this(实参)
方法值传递
-
基本数据类型的变量中直接存放数据值本身,所以改的时候改的是数据值本身
-
引用类型不同的地方在于真正的数据并没有在栈区的变量中保存,而是在堆区里面保存着,所以虽然也拷贝了一份,也是副本,但是二者指向的是同一块堆区。
-
当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值
-
当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容,则会实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区;
-
当使用引用数据类型作为方法的形参时,若在方法体中修改形参变量的指向,此时不会对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区;