一、面向对象概述
1.1 面向对象和面向过程
面向过程:面向过程其实就是面向具体的每一个步骤和过程,也就是面对具体的每一个功能函数这些功能函数相互调用,完成需求。即就是朝着要实现的功能,一步步的去操作。
面向过程:面向对象是基于面向过程,对象是将功能进行了封装。只要找到了具体的类,创建出对象,就可以调用其中的具体功能。面向对象也是用来解决问题的一种思维模式。即就是朝着要实现功能的目标,有该功能就调用类。没有的话,就自己设计类。
1.2 面向对象和面向过程差异(面向对象的好处)
面向对象
是一种更符合人们思考习惯的思想面向过程
中更多的体现的是执行者,面向对象
中更多的体现是指挥者。指挥对象做事情。面向对象
将复杂的问题简单
1.3 面向对象程序设计
案例:
把大象装进冰箱
针对具体的需求,可以使用名词提炼法
进行分析,寻找具体的对象。
- 要求:把大象装冰箱里
- 对象:大象、冰箱
实施的步骤:
- 打开冰箱门。
- 将大象装进去。
- 关闭冰箱门。
以上步骤有个问题就是:这些行为的发起者是谁???谁来完成???
分析发现打开、装、关闭都是冰箱的功能。即冰箱对象具备如下功能:
- 冰箱打开。
- 冰箱存储。
- 冰箱关闭。
用伪代码描述,上述需求中有两个具体的事物 大象 和 冰箱 。
public class 大象{}// 大象类
public class 冰箱{// 冰箱类
打开(){};
存储(大象){};
关闭(){};
}
当把具体的事物描述清楚之后,需要使用这些具体的事物,Java使用具体的事物,需要通过new关键字
来创建这个事物的具体实例。
// 创建冰箱对象
冰箱 bx = new 冰箱();
// 调用冰箱的功能
对象.功能();
bx.打开();
bx.存储(new 大象());
bx.关闭();
总结:
- 先按照
名词提炼
问题领域中的对象
。 - 对
对象
进行描述,其实就是在明确对象
中应该具备的属性
和功能
。 - 通过
new关键字
就可以创建该事物的具体对象
。 - 通过该
对象
调用它以后的功能。使用.
访问属性
和调用方法()
如: 大象.鼻子
二.类的定义
2.1什么是类
类是对现实生活中一类具有共同属性和行为的事务抽象
类的特点:
- 类是对象的数据类型
- 类是具有相同属性和行为的一组对象的集合;
2.2类的重要性
类是java程序的基本组成单位
2.3类的组成(属性和行为):
- 属性 在类中通过成员变量来体现(类中方法外的变量)
- 行为 在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
2.4类的定义步骤:
- 定义类---手机 小米 华为 等
- 定义成员变量 手机属于什么品牌、价格... 参数
- 定义成员方法 手机发送短信、手机拨打电话 行为
三.对象的使用
3.1.创建对象
- 格式:类名 对象名 = new 类名();
- 范例:Phone phone1 =new Phone();
3.2.使用对象
3.2.1使用成员变量
- 格式: 对象名称.变量
- 范例: phone1 .brand="xiaomi";
3.2.2使用成员方法
- 格式: 对象名称.方法名
- 范例:phone1.call();
四.对象内存图
4.1.一个对象的内存图
当在创建一个对象的时候,内存里面就会做至少7件事情
Student s = new Student();
- 加载class文件
- 申明局部变量(对s进行申明)
- 在堆区开辟一块空间(new关键字)
- 默认初始化
- 显示初始化(就地初始化)
- 构造方法初始化
- 将堆区中的地址值赋值给左边的局部变量(s)
public class Student {
String name;
int age;
public void study(){
System.out.println("好好学习");
}
}
public class TestStudent {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s);
System.out.println(s.name + "..." + s.age);
s.name = "小黄";
s.age = 18;
System.out.println(s.name + "..." + s.age);
s.study();
}
}
1.
TestStudent这个类的字节码文件加载到方法区,方法区临时存储main方法
然后虚拟机会自动调用main方法(程序的主入口),此时main方法会被加载到栈里
4.2.创建对象:(7件事)Student s = new Student() ;
(1)加载class文件
(2)申明局部变量
栈区上开辟一块叫s(局部变量)的空间,用来存放Student这个类的对象的地址值
(3)在堆区开辟空间(new关键字)
把Student这个类里面所有的成员变量都拷贝一份放到堆区,包括所有成员方法的地址(方便以后调用的时候能找到对应方法),目前还没有初始化
(4)默认初始化
将引用类型赋值为null,其他类型的赋值给0/0.0
(5)显示初始化(就地初始化)
如果在定义成员变量的时候就进行了初始化(就地初始化),此时默认初始化的值就会被就地初始化的值所覆盖。没有就地初始化则忽略。
(6)构造方法初始化
创建对象的同时进行构造方法初始化,如果()里为空,则代表调用空参构造
若是有参构造,则就把就地初始化的值继续覆盖。
(7)把堆内存中的地址赋值给局部变量(s)
将堆区上所开辟空间的地址值赋值给s(局部变量),此时s就通过地址值指向了堆区上开辟的空间。
如果直接通过sout打印s,显示的就是s通过哈希变换的地址值
当整个main方法执行完毕的时候,main方法就从栈区上被销毁,main方法里的变量就被销毁了,此时堆区上的对象不再被任何变量所引用,java中不被任何变量所引用(指向)的对象就会自动销毁
4.2.多个对象的内存图
创建第二个对象的时候.class字节码文件不需要再加载一次,且两个对象之间是互相独立的,不会相互影响
4.3.两个变量指向同一个对象的内存图
五.成员变量与局部变量的区别
5.1.什么是成员变量与局部变量
- 成员变量:类中的方法外的变量 就是为成员变量
- 局部变量:方法中的变量 局部变量
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中方法外 | 类中方法里(方法声明传递参数) |
内存中位值 | 堆内存 | 栈内存 |
生命周期不同 | 随对象存在而存在,随对象消失而消失 | 随方法调用存在而存在,随方法结束消失而消失 |
初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义赋值后使用 |
5.2访问修饰符之private
1.是一个权限修饰符;
2.可以修饰成员变量和成员方法;
3.被其修饰的成员只能在本类中被访问,可以保护成员不被其他类使用。
1.提供“ get变量名() ”方法,用于获得成员变量的值, 方法用public修饰
2.提供“ set变量名(参数) ”方法, 用于设置成员变量的值, 方法用public修饰
六.this关键字与构造方法
6.1this关键字
6.1.1this修饰的变量用于指代成员变量
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
6.1.2什么时候用this?
- 解决局部变量隐藏成员变量
- this:代表所在的类对象的引用
- 方法被哪个对象调用,this就代表哪个对象
6.1.3this使用细节
- this关键字可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表)
- 访问构造器语法:this(参数列表);注意只能在构造器使用(即只能在构造器中访问另外一个构造器) 必须放在第一条语句
- this不能在类定义的外部使用,只能在类定义的方法中使用
6.2构造方法
构造方法是一种特殊的方法 作用创建对象
public class Student {
修饰符 类的名称(参数) {
}
}
功能:主要是完成对象数据的初始化
6.2.1构造方法-注意事项
构造方法的创建
- 如果没有定义构造方法,系统将给出一个默认的无参构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
- 方法重载:构造方法名称相同但是参数列表不同 这就是重载。
- 注意:如果自定义了带参数的构造方法,还要使用无参数构造方法,就必须要写一个无参构造方法 主要给我们对象中的 成员变量 赋值的操作