一、类和对象
1.类
是一组相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。(就是对现实世界事物的一种模拟)
属性:就是该事物的状态信息
行为:就是该事物能够做什么。
2.对象
对象:是一类事物的具体体现。对象是类的一个实例,具有该类事物的属性和行为。
3.类和对象之间的关系
类是抽象的,对象是具体的;类是一个模板,对象是类的一个实例。
二、面向过程与面向对象
1.面向过程
当需要实现一个功能的时候,每一个步骤都要具体写出来,详细处理每一个细节。
2.面向对象
当需要实现一个功能的时候,不用关系具体的步骤是如何实现的,而是去找具有该功能的API。
【面向对象语言包括三大基本特征:封装、继承和多态。】
3.两者的区别
面向过程:强调实现的步骤
面向对象:强调通过调用对象的行为来实现功能,不需要自己来实现
面向对象是将复杂的问题尽量简单化,面向过程相当于执行者,而面向对象相当于指挥者。
4.实例分析
//现有一数组
int[] array = {1, 2, 3}
//要求打印格式:[1, 2, 3]
//使用面向过程,每一个步骤都要具体实现
System.out.print("[");
for (int i = 0; i < array.length; i++){
if(i == array.length - 1){ // 如果是最后一个元素
System.out.println(array[i] + "]");
}else {
System.out.print(array[i] + ", ");
}
}
//使用面向对象:找具有该功能的API,不需要自己实现具体的步骤
#Arrays.toString()方法,可以直接把数组变成想要的格式的字符串
System.out.println(Arrays.toString(array));
三、类的使用
类不能直接使用,需要根据类创建一个对象,然后进行使用,具体使用流程如下:
1.导包
指出需要使用的类,在什么位置,格式为:
import 包名称.类名称
当一个类和当前类属于同一个包时,可以省略导包语句。
2.根据类创建对象
类名称 对象名 = new 类名称();
eg.Student stu = new Student();
3.使用创建的对象
使用成员变量时:对象名.成员变量名
使用成员方法时:对象名.成员方法名(参数)
4.注意事项
类同数组一样,也属于引用数据类型,所以成员变量没有进行赋值时,会有一个默认值,规则和数组一样。
如何定义一个类?
类是用来模拟现实事物的,包括两个组成部分:属性和行为。其中属性指“是什么”,行为指“能做什么”。
在定义Java类的时候,也就有两个部分:成员变量和成员方法。
注意事项:
1.成员变量是直接【定义在类当中,方法外边】。
变量写在方法里边,是局部变量,而不是成员变量。
2.成员方法不能写static关键字。static关键字,代表该方法是静态方法。
四、对象的内存图分析
方法区内存中先有信息,然后变量和方法的执行在栈内存中进行,new出来的东西都在堆当中。
1.方法区(Method Area)
存放的是.class相关信息。
2.栈(Stack)
存放的是方法中的局部变量,方法的运行是在栈当中。
main方法或者成员方法想要执行,需要进栈/压栈,执行完毕,会出栈/弹栈。
3.堆(Heap)
new出来的东西,都是在堆内存中,堆内存里面的东西都有一个地址值,用十六进制表示。
对于成员变量,默认值就是保存在堆内存中。
对于成员方法,堆内存中保存的其实是地址值。该地址值指向方法区中的成员方法。
4.具体分析
//修改成员变量中的内容
首先根据【对象名】在【栈】中找到保存的对应的地址值
然后根据【栈】中的地址值找到【堆】中的成员变量
最后就可以进行修改了
//使用成员方法
首先根据【对象名】找到【栈】中保存的地址值
然后根据【栈】中的地址值找到【堆】中成员方法保存的地址值
再根据【堆】中成员方法保存的地址值找到【方法区】中成员方法对应的地址值
最后就可以使用对象的成员方法了
5.两个对象使用同一个方法
//两个对象之间是相互独立
//因为都是新建的对象,所以两个对象之间没有任何联系
Student stu1 = new Student();
Student stu2 = new Student();
//两个对象之间产生联系
Student stu3 = new Student();
Student stu4 = stu3; //将stu3中保存的对象地址值赋值给stu4
五、对象类型作为方法的参数或者返回值
当一个对象作为方法的参数时,实际上传递进去的是对象的地址值。
当一个对象类型作为方法的返回值时,返回值其实也是对象的地址值。
六、局部变量和成员变量的区别
1.定义的位置不一样【重点】
局部变量:在方法的内部
成员变量:类当中,方法外部
2.作用范围不一样【重点】
局部变量:只有方法当中才可以使用,出了方法就不能再用
成员变量:整个类全都可以通用。
3.默认值不一样【重点】
局部变量:没有默认值,如果想要使用,必须手动进行赋值
成员变量:如果没有赋值,会有默认值,规则和数组一样
4,内存的位置不一样【了解】
局部变量:位于栈内存
成员变量:位于堆内存
5.生命周期不一样【了解】
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象创建而诞生,随着对象垃圾回收而消失
七、面向对象三大特征之封装性
封装就是将具体信息隐藏起来,对于外界不可见。
方法其实就是一种封装,关键字private等也是一种封装。
八、private关键字
private关键字可以【提高代码的安全性】。如果没有private,就无法阻止不合理的数值被设置进来,所以可以用private关键字将需要保护的成员变量进行修饰。
一旦使用了private关键字修饰了成员变量,那么在【本类当中】仍然可以随【意访问】;但是,超【出本类范围】,就【不能直接访问】了。
【间接访问】private成员变量,就是定义一对儿Getter和Setter方法。
【必须叫setXxx或者是getXxx命名规则】。
对于getter来说,不能有参数,返回值类型和成员变量对应。
对于setter来说,不能有返回值,参数类型和成员变量对应。
注意事项:
对于基本数据类型当中的【Boolean值】,getter方法一定要写成isXxx的形式,而setXxx规则不变。
private boolean male;
public boolean isMale(){return male;}
public void setMale(boolean b){male = b;}
九、this关键字
当方法的局部变量和类的成员变量重名的时候。根据【就近原则】,优先使用局部变量。
如果需要访问本类当中的成员变量,需要使用this关键字:
//this关键字可以解决重名的问题
//this指向的是调用方法的对象
this.成员变量名
十、构造方法
构造方法是专门用来创建对象的方法,之前通过关键字new来创建对象时,其实就是在调用构造方法。
构造方法的定义格式:
public 类名称(参数类型 参数名称){
方法体
}
注意事项:
1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样。
2.构造方法不可以写返回值类型。
3.构造方法不能return一个具体的返回值
4.如果没有编写任何构造方法,那么编译器将会默认有一个无参构造方法
public Student(){}
5.一旦编写了至少一个构造方法,那么编译器将不再使用默认的无参构造方法。
6.构造方法也是可以进行重载的。
重载:方法名称一样,参数列表不一样。
十一、new关键字
new关键字其实就是在调用构造方法。
构造方法是可以【重载】的,即方法名称一样,参数列表不一样,这样可以在创建对象的时候更加方便,因为可以直接用过参数的形式设置进来,【省去了多次调用SetXxx方法】。
Student stu = new Student();
//通过new关键字加上空格来实现构造方法的调用,new后面的类名称其实就是构造方法的名称。
Student stu2 = new Student("张三", 20);
//重载形式,通过全参构造方法,直接将数据通过参数形式设置进来,省去了多次调用SetXxx方法
十二、如何定义一个标准类
一个标准类通常包含四个组成部分:
1.所有的成员变量都用private关键字修饰
2.为每一个成员变量编写一对儿Getter/Setter方法
3.编写一个无参构造方法
4.编写一个全参构造方法