一.什么是面向对象编程(OOP)
1.1面向过程编程
要之前的学习中,我们用到的思想叫做面向过程编程(Procedure Orientedprogramming),简称POP
顾名思义该思想是站在过程的角度思考问题,强调的就是功能的执行过程,即先干啥,后干啥。而每一个功能我们都使用函数(类似于方法)把这些步骤一步一步实现,使用的时候依次调用函数就可以了。
1.2面向对象编程
Object-Oriented Programming
思想:物以类聚,分类。
本质:以类的方式组织代码,以对象的方式封装数据
优点:面向对象更加符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
在我们身边有很多这种思维方式。
例如:
这既是我们的面向对象的思维方式,带入到我们的代码中我们会有这样几个名词:
- 类:一种抽象的数据类型,定义或者描述了某一类事物,类似现实中的人,车。类是对象的模板,关键词class。
- 对象:抽象概念(类)的具体实例,例如,一个叫张三的人,一两具体的车。
- 实例化:创建对象的过程,关键字是new。
- 属性:字段,例如String name=”Lily”中的name。代表类的基础属性。
- 方法:前面的博文已经讲过,相当于上图中的功能,类似于其他语言的函数
在面向对象中是会有面向过程的。不可以理解为面向对象一定就优于面向过程的设计。面向对象是基于面向过程的,永远不可能取代面向过程.
1.3类与对象的关系
先有类,后有对象。
类是对象的模板,对象是类的实例
二.对象的基本操作
首先我们需要创建一个类
//学生类
public class Student {
//属性
String name;
int age;
//方法
public void study(){
System.out.println(this.name+"在学习");
}
}
然后对类进行实例化,即创建对象类 对象名 = new 类名();
public class Application {
public static void main(String[] args) {
//实例化 类 对象名 = new 类名();
Student xm = new Student();//类实例化后产生一个自己的对象
Student xh = new Student();
}
}
- 使用new创建到时候,系统会分配空间,并且还会进行默认的初始化(打印上图的xm.name,xm.age会分别出现null,及0)及对类中的构造器的调用(一会会讲到)
- 一个类可以有多个对象
然后进行赋值对象名.变量 = 值;
,取值变量 = 对象名.变量;
public class Application {
public static void main(String[] args) {
//实例化 类 对象名 = new 类名();
Student xm = new Student();
Student xh = new Student();
//赋值
xm.name ="小明";
xm.age = 21;
//取值
String n = xm.name;
int a = xm.age;
System.out.println(n);
System.out.println(a);
}
}
三.构造器
3.1无参构造
上面提到创建对象会调用构造器,那么什么是构造器?(构造方法,构造函数/构造器/构造子.)
我们首先创建一个Person类,什么都不写。但是在主方法区却依旧可以new一个对象
为什么可以new?这就是构造器作用,下面我们看一下
public class Person {
}
public class Application {
public static void main(String[] args) {
//实例化 类 对象名 = new 类名();
Person zhangsan = new Person();
}
}
我们运行程序,通过idea找到编译后的目录,找到对应的class文件,并用idea查看
我们会发现在编译后出现了一个Person方法,这就是一个构造器
通过以上我们发现这样几点:
- 一个什么都不写,也会存在一个方法,既构造犯法
- 方法名与类名相同
- 无参数,无返回值
3.2有参构造
我们手动写一个构造器
public class Person {
String name;
public Person(String na){
this.name = na; //this指的是类本身
}
}
到这里我们会发现一个错误:构造器无法应用
解决办法:当我们定义了有参构造,无参构造就必须显式定义。
public class Person {
String name;
public Person(){
}
public Person(String na){
this.name = na;
}
}
这是我们可以进传参,它会调用有参构造(之前讲过的方法重载)
public class Application {
public static void main(String[] args) {
//实例化 类 对象名 = new 类名();
Person zhangsan = new Person("张三");
System.out.println(zhangsan.name);
}
}
Tips:在idea中 Alt + inster
3.3构造器小结
- 构造器:
- 与类名相同
- 无返回值
- 作用:
- new本质就是在调用构造方法
- 初始化对象的值
- 注意点:
- 当我们定义了有参构造,无参构造就必须显式定义。
四.内存分析
创建对象时内存分析(简单)
1、在方法区加载Application类;
2、main()方法进栈
3、加载Student类
4、在栈内存申请空间,声明变量xm;
5、在堆内存中开辟空间,分配对象地址。在对象空间中,对对象的属性进行默认初始化,并调用类构造器
6、初始化完成后,将堆内存中的地址赋给引用变量
本过程仅为方便理解对象创建过程,并非真实内存变化