面向对象(理解)
- 面向对象是对面向过程而言
- 面向过程思想概述:
面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
面向过程的代表语言:
C语言 - 面向对象思想概述:
当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了。这时就开始思索:能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
面向对象的代表语言:
Java Python - 总的来说,要完成一件事情,面向过程是关心要怎么做,而面向对象是关心谁来做。
- 面向对象思想特点: a:是一种更符合我们思想习惯的思想 b:可以将复杂的事情简单化 c:将我们从执行者变成了指挥者,角色发生了转换
面向对象思想举例
洗衣服:
-
换下脏衣服—找盆接水—泡一泡—手搓-----漂清----晾干(面向过程)
-
全自动洗衣机(面向对象,调用方法)
面向对象特征:
-
封装(encapsulation)
-
继承(inheritance)
-
多态(polymorphism)
面向对象(类与对象概述)(理解)
现实世界由事物构成,那我们如何描述一个事物,我们可以通过事物的属性和功能来描述这个事物,比如我们要描述手机,手机的属性就是外观是矩形,而且后面都有摄像头,它的功能是可以打电话、上网和发短信。我们通过对手机的属性和功能的描述就实现了对手机的描述。
而在Java语言中,类是最基本的单位,它和现实世界中的事物相对应,我们要来描述一个类就需要来描述这个类的属性的功能
- 现实中的事物和Java中类的对应关系:
事物 | 类 |
---|---|
属性 | 成员变量 |
功能 | 成员方法 |
- 定义类其实就是定义类的成员(成员变量和成员方法)
-
成员变量:和以前定义变量是一样的,只不过位置发生了改变,在类中、方法外。
-
成员方法:和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
类和对象的概念:
-
类:是一组相关的属性和行为的集合
-
对象:是该类事物的具体体现
-
举例:
类 | 学生 |
---|---|
对象 | 班长 |
面向对象(定义类)
在新建的工程下的src文件下新建一个包,在包里新建两个类,一个类中自定义类,另外一个作为测试类,测试类也是一个类,它里面有整个程序的入口,而在自定义类中,我们定义一个Student类来举例
package org.westos.demo3;
/**
* @Author: Administrator
* @CreateTime: 2019-04-05 15:21
*/
public class Student { //自定义类的基本格式
//成员变量 :不赋值有默认值
String name; //String为引用数据类型,默认复制为null
int age; //byte、int、long、short数据类型默认赋值为0
//成员方法
public int calc(int a,int b){ //与定义普通方法一样,但是不用写static
return a+b;
}
public void playGame(){
System.out.println("玩会游戏");
}
}
以上代码就包括了定义类的基本格式
-
学生事物
属性: 姓名 , 年龄 , 地址 …
行为: 吃饭 , 睡觉 , 上课 … -
学生事物与学生类的对应关系
属性 ----- 成员变量
行为 ----- 成员方法
通过上述操作我们自己定义了一个类,在测试类中我们便可以使用我们自定义的类,但是在使用之前我们还需要根据类来创建一个对象
面向对象(创建对象)
package org.westos.demo3;
/**
* @Author: Administrator
* @CreateTime: 2019-04-05 15:23
*/
public class MyTest { //测试类(包含程序入口)
public static void main(String[] args) {
Student student = new Student(); //对象的创建
String name = student.name; //调用成员变量
int age = student.age;
System.out.println(name);
System.out.println(age);
int calc = student.calc(10, 10);
student.playGame(); //调用成员方法
System.out.println(calc);
}
}
- 由于类是一个很抽象的东西,必须要通过将对象实例化才能使用,而创建对象就是对类进行实例化,将对象创建好以后便可以使用类的成员变量和成员方法。
- 由上面的代码块可知,通过
Student student = new Student();
代码便创建了一个叫student的对象,这是创建对象的基本格式(包括无参构造和有参构造,上面为无参构造,所以Student()
括号里面为空,有参构造后面会提到)。基本格式为类名 对象名 = new 类名();
- 通过
student.成员变量名
便可调用类的成员变量,通过student.成员方法名(参数列表)
便可实现对类中的成员方法的调用。
面向对象(对象在内存中的状态)
一个对象的内存图
在这里我地简单说一下Java中内存的分配:
Java中内存的分配:
- 栈内存 :存储局部变量(在方法定义中或者方法声明上的变量)
- 堆内存:存放new出来的东西
堆内存特点:
1.系统会为每一个new出来的东西分配一个内存的地址值
2.每一个元素都有默认的初始化值
byte, short, int, long ---->0
float, double ---->0.0
char ---->’\u0000’
boolean ---->false
引用数据类型 ---->null3.使用完毕以后就变成了垃圾,等待垃圾回收器对其回收
- 方法区(面向对象部分)
- 本地方法区(和系统相关)
- 寄存器(CPU)
介绍完Java语言中内存发分配后就可以讲解在创建对象时的内存图:(Teacher类在这里不做解释)
-
在程序编译完成后要运行时,程序的字节码被加载到方法区,之后 JVM(Java虚拟机) 会自动识别字节码中的
main
方法并且将它加载到栈内存中。 -
加载完成后按顺序执行,在执行到
Teacher teacher = new Teacher();
时,系统识别到使用了Teacher类后会将Teacher类的字节码加载进方法区。 -
加载进来后会在栈内存中创建
teacher局部变量
来作为引用,之后会在堆内存中分配空间来存放new出来的东西即teacher对象
的成员变量,分配的空间中存放name
和age
变量并分别初始化为null
和0
。 -
之后由于在自定义
Teacher类
时给成员变量name
赋为“张三”
,所以堆内存中的name
变量的null
又立刻会被“张三”
覆盖。 -
之后系统会将这块内存的地址值赋给teacher引用,之后便可根据这个地址值来进行成员变量的调用和赋值,即通过
teacher.成员变量
来调用。也可通过teacher.成员方法
来调用在方法区的成员方法。 -
后半部分程序不做过多解释。
面向对象(成员变量和局部变量的区别)
-
在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上(形参) -
在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存 -
生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 -
初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。注意事项:: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
面向对象(方法的形式参数是类名的时候如何调用)
-
Java中参数传递问题
形式参数
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数 -
方法的参数是类名
如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
面向对象(匿名对象的概述和应用)
匿名对象:
就是没有名字的对象
匿名对象应用场景:
- 调用方法,仅仅只调用一次的时候。
- 匿名对象可以作为实际参数传递