Java基础总结4(面向对象、类、对象、封装性、private和this关键字、构造方法)
面向过程和面向对象
面向过程(强调步骤):就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现。
面向对象(强调对象):就是把问题事务拆分成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在解决问题的步骤中的行为
面向对象的三大基本特征:封装、继承、多态
类和对象
类和对象:
类:是一组相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物
属性:就是该事物的状态信息
行为:就是该事物能够做什么
对象:是一类事物的具体体现。对象是类的一个实例。必然具备该类事物的属性和行为。
类的定义:
public class 类名{
}
成员变量(属性):
例子:String name; int age;
成员方法(行为):
例子:public void eat();public void study();
注意:
1、成员变量和局部变量不一样,是直接定义在类当中,方法外边。
2、成员方法不要写static关键字
对象的创建和使用:
通常情况下,一个类不能直接使用,需要根据类创建一个对象,才能使用
1、导包:就是指出需要使用的类,在什么位置
例子:import cn.itcast.student
2、创建对象:类名称 对象名 = new 类名称();
例子:Student stu =new Student();
3、使用
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)
tip:想用谁,就用对象名点谁
注意事项:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样
一个对象的内存图:
首先定义了两个类:Phone类和DemoPhoneOne类。
Phone类中有三个成员变量,分别是brand、price、color
两个成员方法,分别是call和sendMessage
DemoPhoneOne类中,只有一个主函数方法,里面调用了Phone类的一些属性和方法。
下面我们分析一下执行的流程:
1、首先,Java根据.class文件,在方法区中开辟内存空间存放这些.class文件。然后找到入口函数,也就是main方法执行。
2、执行方法,方法救护被压栈到栈里面。main方法被压栈后,执行main方法,发现里面Phone对象定义了one这个对象。然后堆就会new一个Phone对象出来,为它开辟内存空间,根据方法区的Phone类的成员变量和成员方法依次拷贝过来。注意的是,堆里面的成员变量存放的是具体值,而成员方法里存放的是方法区里成员方法的地址,这里是不一样的。然后把堆里面Phone对象的地址赋值给了栈里面的one。
3、当执行到main方法里的Phone对象定义的属性时,如one.brand=‘苹果’;栈就会根据one对象的地址值到堆里找到Phone对象开辟的内存空间,找到相应的属性值修改。
4、当执行到main方法里的Phone对象定义的方法时,如one.sendmessage();栈就会根据one对象的地址找到堆,堆又会根据对象成员方法的地址找到方法区,然后将方法区的成员方法压栈,等成员方法执行完毕后就出栈。
两个对象使用同一个方法的内存图:
同个类的不同对象的成员方法调用地址是一样的,都是方法区中保存该方法的地址。当调用的时候,把该方法进行压栈。结束该方法后就会出栈。
两个引用指向同一个对象的内存图:
同一个对象时,它们引用的地址是一样的,指向堆内存的对象地址也是一样的
使用对象类型作为方法的参数内存图:
当一个对象作为参数,传递到方法当中时,实际上传递的是对象的地址值
使用对象类型作为方法的返回值内存图:
当使用一个对象类型作为方法的返回值时,返回值其实就是对象的地址值
成员变量和局部变量的区别
1、定义的位置不一样
局部变量:在方法的内部
成员变量:在方法的外部,直接写在类当中
2、作用范围不一样
局部变量:只有方法当中才可以使用,出了方法就不能再使用
成员变量:整个类全都可以通用
3、默认值不一样
局部变量:没有默认值,如果要使用,必须手动赋值
成员变量:如果没有赋值,会有默认值,规则和数组一样
4、内存位置不一样
局部变量:位于栈内存
成员变量:位于堆内存
5、生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量: 随着对象创建而诞生,随着对象被销毁而消失
面向对象三大特性之封装性
1、方法就是一种封装
2、关键字private也是一种封装
封装性时是将一些细节信息隐藏起来,对外界不可见
private(私有)关键字的作用及使用
一旦使用了private修饰,那么本类当中仍然可以访问,但是超出本类的范围之外就不能直接访问了。
一般使用private修饰的变量,外部进行调用时,只能通过本类的公有函数进行赋值或者取值(getter,setter)
对于Getter来说,不能有参数,返回值类型和成员变量对应
对于Setter来说,不能有返回值,参数类型和成员变量对应
this关键字作用
当方法的局部变量和类的成员变量重名的时候,根据就近原则,会优先使用局部变量。
如果需要访问本类中的成员变量,需要使用格式:
this.成员变量名
this的主要作用就是在方法内部出现重名的情况下,起到成员变量和局部变量的区分效果
构造方法
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
格式:
public 类名称 (参数类型 参数名称){
方法体
}
注意事项:
1、构造方法的名称必须和所在类名称完全一样,就连大小写也要一样
2、构造方法不用写返回值类型
3、构造方法中不能写return
4、如果没有编写任何构造方法,那么编译器将会默认一个构造方法,没有参数、方法体什么事情都不做。(public 类名{})
5、一旦编写了至少一个构造方法,那么原来默认的构造方法就会销毁
6、构造方法也是可以重载的(无参、有参)
一个标准的类通常要拥有下面四个组成部分:
1、所有的成员变量都要使用private关键字修饰
2、为每一个成员变量编写一对Getter和Setter
3、编写一个无参数构造方法
4、编写一个全参数构造方法
这样标准的类也叫做Java Bean