面向对象之1:类和对象的关系、构造器、创建对象、this关键字、static关键字 的 总结:

 

目录

简述面向过程和面向对象的区别:

简述类和对象之间的关系:

类中的五大基本组成部分:

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

构造器(constructor):

构造器作用说明:

构造器的特点如下:

构造器的重载:

创建对象过程简要流程图示:

this关键字:

this关键字的作用:

this关键字在内存中存在形式简要图示:

static关键字:

静态变量的存在形式简要图示:

静态变量的存在形式注意事项:

静态变量和实例变量和局部变量的区别:

静态方法和实例方法的区别:

静态变量和实例变量、静态方法和实例方法的访问格式及8个疑问:


简述面向过程和面向对象的区别:

面向过程:将事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤、过程,注重的是过程中具体的行为,以函数为最小单位,主要考虑怎么完成这件事情。

                 比如:吃饭:面向过程的做法就是:走路去菜市场 -》选菜、买菜 -》付钱 -》回家 -》洗菜、切菜 -》做饭、做菜 -》吃饭 -》洗碗

面向对象:注重的是找参与者,将功能封装进对象,强调具备了功能的对象,以类、对象为最小单位。主要考虑这件事由谁来做。

                 比如:吃饭:面向对象的做法就是:打开美团APP -》 选择吃什么 -》下单付钱 -》坐等外卖上门
 

面向过程和面向对象:其实就是以  执行者(面向过程)---到--- 指挥者(面向对象)的一个这么一个过渡。

两者相辅相成,并不是对立的,如果是解决复杂问题,通过面向对象的方式更方便于从宏观上把握事物之间的复杂的关系,方便分析整个系统,具体的微观操作,仍然使用面向过程的方式来处理!


简述类和对象之间的关系:

  • 类:类是抽象的,是一个模板,类是对对象抽取出具体像的部分,公共的部分,从而来形成类。比如:月饼模板、人类、猫类、……
  • 对象:具体的事物、实体、实例。模板下具体的产品。比如:月饼模板下的每个月饼,人类下的每个人,猫类下的每只猫、……
  • 世间万物皆对象。

面向对象的三大步骤:

  1. OOA:Object Oriented Analysis (面向对象分析)分析类中应该定义什么属性(名词)、方法(动词)
  2. OOD:Object Oriented Design (面向对象设计)怎么设计类,是否合理
  3. OOP:Object Oriented Programming(面向对象编程)具体使用什么对象,怎么编写代码实现功能。

 


类中的五大基本组成部分:

  1. 成员变量:成员变量用于定义该类或者该类对象包含的数据或者静态特征,属性作用范围属于整个类体。
  2. 成员方法:方法用于定义该类或该类实例的行为特征和功能实现,方法是类和对象行为特征的抽象。方法类似于面向过程中的函数,面向过程,函数为最基本的单位,整个程序有一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是属于类和对象的。
  3. 代码块:即该代码块的代码在什么范围内才有效。
  4. 内部类:即该类只属于类或者对象的类。
  5. 构造器:用于初始化成员变量的数据的构造器(特殊的一种方法)。
  6. 静态常量:即用static final修饰的变量:只能赋值一次!
  7. (内部枚举):可以用 private、缺省、protected、public修饰。
  8. (内部接口):可以用 private、缺省、protected、public修饰。(一般都不会在一个类中再定义一个内部接口,除非有特殊需要)

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

  1. 代码中所处位置不同:
    1. 成员变量:定义在类中方法外的变量。
    2. 局部变量:定义在方法中、代码块中的变量。
  2. 代码的作用域不同:作用域,即一个 {} 为一个作用域!
    1. 成员变量:当前类的方法(实例方法、静态方法)、代码块(实例代码块、静态代码块)、内部类(实例内部类、静态内部类)、构造器中都可以使用。
    2. 局部方法:当前该方法(当前代码块)
  3. 是否有默认值:
    1. 成员变量:有,所以定义成员变量时一般都不用初始化值。
    2. 局部变量:没有,所以定义局部变量是必须要初始化值!
  4. 内存中位置不同:
    1. 成员变量:存储在堆内存
    2. 局部变量:存储在栈内存
  5. 作用时间不同:
    1. 成员变量:当前对象从创建到销毁。或者随着类的使用完毕而销毁。
    2. 局部变量:当前方法从入栈开始执行到弹栈执行完毕。

构造器(constructor):

构造器作用说明:

  1. 构造器又称(构造方法、构造函数),是属于类的一种特殊的方法,它不是为了创建对象,因为在调用构造器之前,该类的对象就已经被JVM创建好了,并且属性有默认的初始化的值。构造器的主要作用就是对 新对象成员变量 的值的初始化操作。

构造器的特点如下:

  1. 构造器的访问权限修饰符可以由 public -》 protected -》 缺省(default)-》private 修饰 !
  2. 构造器不能使用其他非访问权限修饰符进行修饰!
  3. 构造器没有返回值,构造器内部不能有return 返回值 语句 !
  4. 构造器的名字必须和类名的一模一样!
  5. 构造器的形参列名和成员方法的规则一样
  6. 构造器是由JVM完成调用,在创建对象时,JVM会自动调用该类的构造器完成对 对象的初始化操作!
  7. 构造器中可以调用本类的成员方法,也可以调用其他类的成员方法。但本类中的成员方法不能调用构造器。
  8. 构造器只能在其他构造器中调用。
  9. 构造器格式:
    1. 访问权限修饰符 类名(形参列表){赋值语句;}
  10. 一般不会在无参构造器中进行初始化操作,因为那样操作的话每个对象的属性就都一样了。

构造器的重载:

  1. 如果开发者 没有定义构造器,即没有重载构造器,JVM会自动给类隐式的生成(分配)一个默认的无参构造器(也叫默认构造器)。可以通过javap -c查看,(无参构造器的主要作用就是加载父类的构造器,完成父类初始化工作。[再完成子类对象的默认值初始化],当然这一点也是有参构造器所具备的!
  2. 如果开发者 一旦定义了自己的构造器,就构成了构造器的重载,此时,默认的无参构造器就被覆盖了,就不能再使用 无参构造器了,除非显式的重新定义一下无参构造器,(一般都会加上,难免会用到,比如反射、有的框架:比如Spring 都会使用无参构造器!)(如果使用了有参构造器创建对象那么默认值就会以传入过来的值为准!覆盖默认值)
  3. 重载构造器可以根据该类的成员变量的多少重载 多个构造器。
  4. 当形参名字和成员变量的名字相同的时候,根据代码的作用域,会出现就近原则:
    1. 当要表示该对象的实例变量赋值的时候加上 this. 来修饰,this关键字代表的是创建的那个对象。
    2. 当要表示给类的静态变量赋值的时候 加上 类名. 来修饰即可。

创建对象过程简要流程图示:

比如:

理解对象创建过程注意事项:

  1. 第一次创建类的对象的时候,会第一次加载类的.class文件,会进行类的加载,如果没有使用有参构造器给对象初始化值,对象的属性没有赋值,有默认的初始化值。
  2. 再次创建类的对象的时候,就不会再进行类的.class文件加载了,因为元空间区已经有.class文件 类信息了,就好比是一个模板,不需要重复加载类文件。每个对象都是类文件下的一个产品!所以类的加载只会在第一次创建对象的时候只需要加载一次.class文件 类信息到元空间区即可。
  3. 不同的对象,成员变量都有自己特有的值。方法是调用类中通用的方法。
    1. 每个对象的成员变量都是对象独立的。
    2. 每个对象的方法都是共享类中的方法的。
  4. new 关键字实际上就是在调用类的构造器,调用构造器初始化对象的时候,如果类中没有重载的构造器,那么JVM就会默认隐式的生成一个无参构造器。从而只能使用无参构造器
  5. 创建对象简要流程:

this关键字:

this关键字的作用:

  1. this关键字可以用来访问本类的实例成员变量、实例成员方法、构造器。
  2. this用于区分当前类的实例成员变量和局部变量。
  3. 访问实例成员方法的语法格式: this.方法名(形参列表);   访问实例成员变量的语法格式:this.变量名; 
  4. (在本类中访问实例成员方法实例成员变量,this关键可以省略不写,除非实例成员变量和局部变量重名的情况下, 可以用this关键字进行区分!)
  5. 访问构造器的格式:this(形参列表); 注意事项: 只能在构造器器访问另外一个构造器(不能在一个构造器访问多个构造器),不能在类中的其他成员方法中访问构造器!(构造器可以访问本类中所有的成员方法和其他类的成员方法!)
  6. this关键字如果在构造器中同时调用构造器和类中的成员方法或者是其他类中的成员方法的时候,调用构造器的代码必须放在第一行!(对this的调用必须是构造器中的第一个语句!)
  7. this不能在类中的静态方法、静态代码块中使用,只能在类定义的实例方法、实例代码块 中使用。
  8. this代表当前对象。如图:

this关键字在内存中存在形式简要图示:


static关键字:

(题外话:)成员方法、成员变量的访问修饰符和非访问修饰符的优先级是一样的,并列的并没有先后顺序,先写谁后写谁都是可以的!只是良好的编程习惯促就了 习惯将访问修饰符写在首位!

static关键字的作用:

  1. static关键字可以修饰成员变量:称之为 静态成员变量(静态变量、类变量),属于类本身;
  2. static关键字可以修饰成员方法:称之为 静态成员方法(静态方法、类方法),属于类本身;
  3. static关键字可以修饰内部类:称之为静态成员内部类(静态内部类、类内部类),属于类本身;
  4. static关键字可以修饰代码块:称之为静态成员代码块(静态代码块、类代码块),属于类本身、由JVM执行调用,开发者不能主动调用静态代码块,也无法调用。

静态变量的存在形式简要图示:

比如:

 


静态变量的存在形式注意事项:

  1. 有争议的一点:
    1. 有的人认为静态变量在JDK1.8之后 是跟随每个类的Class类对象存储 在堆内存区域中,有的人认为静态变量是随着类的加载在方法区(元空间)中有块内存区域叫 静态域 的内存区域用来存储静态变量。说法没有唯一的,都比较笼统,但是不管静态变量存储在堆中还是存储在方法区(元空间)中还是在堆中,静态变量都是每个对象可以share(共享)的。JVM内存中的 堆、方法区(元空间)、直接内存(用来操作NIO的)这三块内存区域都是被线程share的!
    2. 有的人认为每个类的Class类对象都是虽然是对象,但是它比较特殊,是存储在方法区中的,(甚至有的人认为方法区是和堆是在同一块内存区域的,所以才被说成静态变量是存在于堆内存中的。),每本书上的解释都不太一样。
  2. 一个的静态变量的值一旦被改变了,那么这个类的不管是那个对象来访问,访问的值都是最后一个改变后的值!

静态变量和实例变量和局部变量的区别:

  1. 局部变量:是定义在方法中或者代码块中的变量,必须初始化值,它属于当前方法或者代码块的作用域中的!它随着方法或者代码块的执行结束而销毁。
  2. 实例变量:定义在类中方法外,没有用static修饰的成员变量称之为实例变量(有的也称之为:普通变量,实例成员变量、非静态成员变量),不用初始化值有默认的初始化值。它属于对象本身,实例变量是属于每个对象自己的,不能共享!它随着对象的创建而初始化,随着对象的GC回收(销毁)而销毁。
  3. 静态变量:定义在类中方法外,用static修饰的成员变量称之为静态变量(有的也称之为:类变量!),不用初始化值有默认的初始化值,它属于类本身,静态变量可以被类的所有对象共享!。它随着类的加载而初始化,随着类的消亡而销毁。

静态方法和实例方法的区别:

  1. 实例方法:定义在类中方法外,没有用static修饰的成员方法称之为实例方法(普通方法,实例成员方法,非静态方法),它属于所有的对象,必须创建对象之后才能调用实例方法!不能用类名调用实例方法!随着方法的入栈而执行,随着方法的弹栈而结束。
  2. 静态方法:定义在类中方法外,用static修饰的成员方法称之为静态方法(类方法),它属于类本身,静态方法可以被类的所有的对象共享。随着方法的入栈而执行,随着方法的弹栈而结束。

静态变量和实例变量、静态方法和实例方法的访问格式及8个疑问:

  1. 静态变量:类名.变量名; (推荐) 、对象名.变量名;(不推荐)、this.变量名;(在本类实例方法中访问,不推荐) 。
  2. 实例变量:对象名.变量名; 、this.变量名;(在本类实例方法中访问)。
  3. 静态方法:类名.方法名;(推荐)、对象名.方法名; (不推荐)、this.方法名;(在本类实例方法中访问,不推荐) 。(在本类静态、实例方法中访问,类名可以省略不写。)
  4. 实例方法:对象名.方法名; this.方法名;(在本类实例方法中访问)。(在本类实例方法中访问,this可以省略不写)

8个疑问:

  • 静态方法是否可以直接访问静态变量? ----》 可以直接访问,因为静态变量随着类的加载只会在方法区(元空间区)中产生一份,属于类本身。可以被共享访问。
  • 静态方法是否可以直接访问实例变量?----》 不可以,因为实例变量必须要创建对象才能访问,而静态的内容要先于对象的内容而存在的,所以无法访问!
  • 静态方法是否可以直接调用静态方法? ----》 可以直接调用,因为都属于类本身,可以被共享访问。
  • 静态方法是否可以直接访问实例方法? ----》 不可以,因为实例方法必须要创建对象才能访问,而静态的内容要先于对象的内容而存在的,所以无法访问!
  •  
  • 实例方法是否可以直接访问静态变量? ----》可以直接访问,因为静态变量随着类的加载只会在方法区(元空间区)中产生一份,属于类本身。可以被共享访问。
  • 实例方法是否可以直接访问实例变量?----》 可以直接访问,因为都属于对象本身。并且实例变量只能通过对象访问!
  • 实例方法是否可以直接调用静态方法?----》可以直接调用,因为都属于类本身,可以被共享访问。
  • 实例方法是否可以直接调用实际方法?----》 可以直接调用,因为都属于对象本身,并且实例方法只能通过对象访问!

 

下一篇:面向对象之2:代码块 的总结:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值