面向过程和面向对象的区别
面向过程 ➡ 面向对象
执行者 ➡ 指挥者
面向对象的概念
三个阶段:
- 面向对象分析
对象:我,爸爸,妈妈
类:人类
类里具有:
(1)动词 ➡ 动态特性 ➡ 方法
(2)名词 ➡ 静态特性 ➡ 属性 - 面向对象设计
- 面向对象编程
对象与类
- 含义
对象:具体的事务、实体。
类:对象向上抽取出像的部分,形成类。类是抽象的,是一个模板。
一边先写类,再根据类创建对应的对象。
eg:类是我的课本,数据结构书是一个具体的对象。 - 创建
过程:
(1)在第一次遇到一个类的时候,对这个类进行加载,只需加载一次;
(2)创建对象,在堆中开辟空间;
(3)对对象进行初始化操作,属性赋值都是默认的;
(4)new关键字调用构造器,执行构造方法,在构造器中对属性重新进行赋值。
- 属性的分类
静态属性(类变量)
非静态变量(实例变量)
局部变量与成员变量
区别 | 成员变量 | 局部变量 |
---|---|---|
代码位置 | 方法外 | 方法/代码块内 |
作用范围 | 当前类中的很多方法 | 当前一个方法/代码块 |
是否有默认值 | 有 | 没有 |
是否要初始化 | 不需要 | 一定要 |
内存中位置 | 堆内存 | 栈内存 |
作用时间 | 当前对象从创建到销毁 | 当前方法从开始执行到执行完毕 |
构造器
- 创建一个Person类具体的对象/实例/实体的过程:
(1)第一次遇到Person的时候,进行类的加载(只加载一次;
(2)创建对象,为这个对象在堆中开辟空间;
(3)为对象进行属性的初始化操作 ;
(4)new
关键字实际是在调用一个方法,称为构造方法(构造器) - 调用构造器的时候,如果你的类中没有写构造器,系统就会默认分配一个,只是对我们不可见。可以自己显式地将构造器编写出来。
– 构造器格式:[修饰符] 构造器的名字(){ }
。
– 构造器和方法的区别:构造器没有方法的返回值类型,方法体内不能有return语句,构造器的名字必须和类名一样。
– 构造器的作用:给属性赋值,而不是创建对象。
Person A = new Person();//先右遍赋值,再左边接收
- 一般保证空参构造器的存在,不在其中进行属性赋值操作,一般重载构造器,在重载构造器中进行属性赋值操作,重载之后,系统不会默认分配构造器,需自己构造。
内存分析
- java程序运行之后,虚拟机JVM会向内存申请一块儿空间,
该空间专门给程序中产生的变量、数据等用。 - 栈:局部变量,形参
堆:new出来的对象,数组
方法区:字节码信息,字符串常量池
public class Person{
int id;
int age;
public static void main[String args]{
person p1 = new Person();
}
}
public class Person
{
int id;
int age;
String name;
public Person(int a,int b,String c){
id=a;
age=b;
name=c;
}
public static void main(String args[]){
Person p = new Person(1,20,乐乐);
}
}
this的使用
this指代当前对象,其功能为:
- 修饰属性
当形参名字和属性的名字重名时,会出现就近原则,此时使用this
修饰,指代创建的对象。不发生重名问题,可以省略this。
- 修饰方法(在同一个类中,方法可以互相调用)
方法中,this
指代正在调用方法的对象,可以省略。
this
可以修饰构造器(在同一个类中,构造器可以互相调用)
this修饰语句必须放在第一行。
static的使用
- 修饰属性
在类加载的时候,会将静态内容也加载到方法区的静态域中,静态的内容先于对象存在,这个静态内容被所有该类的对象共享。
- 可以使用类名.属性名对其访问。
不创建对象也可以访问,因为在加载Test类的时,属性已经被加载在静态域中。(静态内容先于对象存在)
Test.sid = 20;
- 适用场景
某些特定的数据在内存中共享。
- 属性的分类
静态属性(类变量)
非静态变量(实例变量)
-
修饰方法
-
修饰代码块
-
修饰内部类