面向对象和面向过程的思想对比:
面向过程:自己一步一步进行编程,以 过程 为中心
面向对象:通过指挥对象实现具体的功能,以 对象 为中心
面向对象是基于面向过程演变而来的,因为对象自己必须一步一步编写执行过程
面向对象小结:
1.客观存在的任何事物,都可以看为程序对象(任何事物都是一步步演变的)
2.使用面向对象可将复杂的问题简单化(调用对象即可)
3.从执行者的位置,变成指挥者
类:
含义:类是对现实生活中一类具有崆峒属性和行为的抽象、描述
类的组成:
1.属性:该事物的各种特征。例:姓名、年龄。。。 (成员变量)
2.行为:该事物存在的功能(能够做的事情)(成员方法,写法和之前方法一样,只不过去掉了staitc关键字 )
对象:
含义:是能够看得到摸得着的真实存在的实体
类和对象的关系:
类是对象的描述,
对象是类的具体
为什么不把psvm直接写到Student类里?
因为Student类里的描述无需psvm
例:
public class Student{
成员变量;
(String name = "张三";int age = 16; 不能赋值,如果赋值就变成具体的类了,而且每次创建都是同一个对象张三,无法灵活运用?????)(成员变量在具体应用中有什么作用???)-------应该是这样问:为什么成员变量要private不让外类访问,主要目的是限制成员变量只能在本类中进行条件限制,成员变量是个容器,用来装数据的,最后用带参构造封装到一个地址中
成员方法;(成员变量和成员方法都是对Student这个类的描述)
}
Student这一整个类,只是对具体事物的抽象化,不是具体存在的事物,可以类比成设计图
public class TestStudent{
psvm{
创建对象;
调用方法;
}
}
没有主方法(psvm),程序是无法运行的,且主方法不是Student的描述内容。
创建对象:
格式:类名 对象名 = new 类名();
例:Student a = new Student();
sout(a) = com.it.object.Student@bc213s2
全类名:包名+类名
@:分隔符
bc213s2:16进制地址值
使用对象:
1.使用成员变量
格式:对象名.成员变量名
a.name;
2.使用成员方法
格式:对象名.成员方法名
a.study();
main方法正常被方法区和栈内存调用,当检测到Student s = 时 (还没new对象之前),方法区会将Student类加载进入方法区,方法区产生了main.class和Student.class 两个字节码文件,
方法区:Student.class文件
String name |
int age |
study() |
当Student s = new Student()时,new了一个对象。在堆内存产生001地址值,001地址值这个空间会分为两个部分 成员变量 和 成员方法,默认成员变量的值为默认初始值,而成员方法则记录的是指向 “方法区:Student.class文件的study()” 的成员方法的地址值。
堆内存:(地址值:001)
String name |
null |
int age |
0 |
成员方法地址(指向 “方法区:Student.class文件的study()” 的成员方法的地址值) |
sout(s)=001;
当s.study(); 时,流程是通过s进入001这个地址值,再通过“成员方法地址”进入方法区,然后调用方法,进入栈内存执行
注意:方法区一定要有对应的字节码文件,否则进不到栈内存和堆内存
创建多个对象(两个及以上),方法区的字节码文件只用加载一次,后面复用即可,因为Student是抽象的,且都是同一个类。且当new完后,在堆内存会创建对应数量的堆内存空间,并将地址值返回,(具体参考上面的:堆内存001这个地址)这里其中注意一点,虽然每个地址值都不一样,但是每个地址值里的 【成员方法地址】 都是指向同一个地址,即指向 “方法区:Student.class文件的study()”
两个引用指向同一个对象:
Student s1 = new Student();
sout(s1)=001;
Student s2 = s1;
s1 = null;
sout(s1.name)= 报错 ------- NullPointException
当s2也等于null时,s1和s2都切断了和堆内存的地址指向后,堆内存的对象无法被找到,会被jvm判定成“垃圾对象”,当java垃圾回收器空闲时会自动清理。
垃圾回收器:
当堆内存中,对象或数组产生的地址,通过任何方式都不能被找到,就会被jvm判定成“垃圾对象”,当java垃圾回收器空闲时会自动清理。(意味着有些是得手动清理)
成员变量和局部变量的关系:
成员变量:类中方法外
局部变量:方法中的变量,包含方法(形参)
区别 | 成员方法 | 局部方法 |
类中位置不同 | 类中方法外 | 方法中的变量,包含方法(形参) |
内存中的位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 栈内存中的有对象存在且指向堆内存的对象,成员方法就会一直存在。只要该对象弹栈了,或切断了指向(对象名被赋值了null)堆中的对象会被jvm虚拟机判定成垃圾对象,且被java垃圾回收器清理。一般弹栈即消失 | 随着方法的存在而存在,弹栈后消失 |
初始化值不同 | 有默认初始化值 | 没有默认初始值,必须先定义,才能使用(形参也必须先赋值??????)-----形参在调用之前就必须被赋值,否则无法创建有参构造,意思是创建有参构造必须先输入值,然后才能创建成功 |