前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java——类与对象(基本概念、定义、内存分析、引用传递)

Java——类与对象(基本概念、定义、内存分析、引用传递)

作者头像
Winter_world
发布2020-09-25 10:41:10
4470
发布2020-09-25 10:41:10
举报
文章被收录于专栏:技术小屋-未分类

1、面向对象简介

       软件开发模式有两种:面向过程、面向对象。

  • 面向过程:指的是只完成自己所需要的操作,但这种设计缺少可维护性;
  • 面向对象:本质上来讲是一种组件化(模块化)设计。方便进行代码局部维护。但设计上要求的规范较多,且对整个项目的整体把控较为关键。

      面向概念中有以下几个特点:

  • 封装性:保护内部的操作对外不可见;
  • 继承性:相当于一代代传承;
  • 多态性:在一个范围内的定义改变。

    面向对象的开发中有三个阶段:

  • OOA:面向对象分析;
  • OOD:面向对象设计;
  • OOP:面向对象编程;

2、类与对象

2.1、类与对象基本概念

        类指的是具备某一共性的群体集合。而对象是一种个性的描述。对象包含具体的信息内容。对象所能具备的操作行为实际上由类定义的,要想使用类要有具体的描述对象,对象是可以明确使用的,而类是不能直接使用的。

2.2、类与对象的定义

        开发中先有类,再有对象,要定义类,Java中使用class关键字来描述,而在类中组成包括:属性(变量)、方法。

代码语言:javascript
复制
class Person{

        String name;
        int age;

        public void tell(){
            System.out.println("hello");
        }

    }

2.3、对象内存分析

类属于引用数据类型,先对其进行内存分析,分析前首先给出两块内存控件的概念:

  • 堆内存空间(Heap):保存对象中具体的属性信息;
  • 栈内存空间(Stack):保存的堆内存的地址数值,简化一点,假设保存在栈内存中的是对象的名称。一个栈内存只能保存一块对应的堆内存的地址空间。

按以上分析,可以得出如下内存关系图:

1)声明并实例化对象:Person per = new Person();

2)分步,先声明,再实例化:Person per= null;  per = new Person();

注意:关于引用数据类型操作存在的重要问题

当对象开辟堆内存时,即实例化对象,属性才会进行内存的分配,那么如果使用了没有实例化的对象,程序编译OK,但是执行时会返回NullPointerEcepition异常,原因就是使用了没有开辟堆内存空间的引用对象。

2.4、引用传递初步

        引用传递是在引用数据类型上所用的一个操作定义,是Java的精髓,操作性质与C语言相同,进行内存的操作。换到程序中,就是一个堆内存空间可以被多个栈内存所指向。

【举例】:引用传递

代码语言:javascript
复制
Person perA = new Person();
perA.name = "张三";
perA.age= 30;
Person perB = perA
perB.name = "李四";

以上是采用了声明对象的方式进行引用数据类型的接收,如果两个对象都已经实例化并有内容会是什么效果?

【举例】:观察引用传递

代码语言:javascript
复制
Person perA = new Person();
Person perB = new Person();
perA.name = "张三";
perA.age= 30;
perB.name = "王五";
perB.age= 10;
perB = perA;
perB.name = "赵六";
//输出perA,可观察到"赵六",30

以上分析可知:

  • 使用关键字new 可以开辟堆内存空间(保存属性);
  • 栈内存只能保存一块堆内存的使用地址;
  • 引用传递的本质是同一块堆内存空间可以被不同的栈内存所指向;
  • 发生引用传递时,如果操作的栈内存原有堆内存指向,则改变堆空间意味着改变内存指向;
  • 若某一个堆内存空间没有被任何的栈内存所指向,则会产生垃圾空间,会自动被GC(Garbage Collector,垃圾收集器)回收并且释放(垃圾回收执行时间不确定,所以做好少产生垃圾空间)。

除了改变引用可以产生垃圾空间,还可以设置为null,eg:perB = null,这样perB放弃了原本的指向,变为一个没有指向的栈内存。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、面向对象简介
  • 2、类与对象
    • 2.1、类与对象基本概念
      • 2.2、类与对象的定义
        • 2.3、对象内存分析
          • 2.4、引用传递初步
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档