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:想用谁,就用对象名点谁

注意事项:

如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样

一个对象的内存图:
Java基础总结4(面向对象、类、对象、封装性、private和this关键字、构造方法)

首先定义了两个类: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对象的地址找到堆,堆又会根据对象成员方法的地址找到方法区,然后将方法区的成员方法压栈,等成员方法执行完毕后就出栈。

两个对象使用同一个方法的内存图:
Java基础总结4(面向对象、类、对象、封装性、private和this关键字、构造方法)

同个类的不同对象的成员方法调用地址是一样的,都是方法区中保存该方法的地址。当调用的时候,把该方法进行压栈。结束该方法后就会出栈。

两个引用指向同一个对象的内存图:

Java基础总结4(面向对象、类、对象、封装性、private和this关键字、构造方法)

同一个对象时,它们引用的地址是一样的,指向堆内存的对象地址也是一样的

使用对象类型作为方法的参数内存图:
Java基础总结4(面向对象、类、对象、封装性、private和this关键字、构造方法)

当一个对象作为参数,传递到方法当中时,实际上传递的是对象的地址值

使用对象类型作为方法的返回值内存图:

Java基础总结4(面向对象、类、对象、封装性、private和this关键字、构造方法)

当使用一个对象类型作为方法的返回值时,返回值其实就是对象的地址值

成员变量和局部变量的区别

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