第九节(对象和引用)

  Java把内存划分成两种:一种是栈内存,一种是堆内存

    一. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配      

    当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所

    分配的内存空间,该内存空间可以立即被另作他用。

   二. 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理

   1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。                      

   2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。

    但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

   3. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。

    但缺点是,由于要在运行时动态分配内存,存取速度较慢。

例题1:
public class Student{

    //学号
    int id;

    // 姓名
    String name;

    // 性别
    boolean sex;

    // 年龄
    int age;
}

/*

    当不使用 new关键字时,会出现什么问题?

*/
public class OOTest03{

    public static void main(String[] args){

        // 创建对象
        //Student student = new Student();

        Student student = null;

        student.id = 1001;
        student.name = "ming";
        student.sex = true;
        student.age = 18;

        /*
            抛出了空指针异常,因为student对象没有指向任何对象,
            所以地址为 null, 我们又调用了student的属性,就导致了 空指针异常
        */

        System.out.println("id = " + student.id);
        System.out.println("name = " + student.name);
        System.out.println("sex = " + student.sex);
        System.out.println("age = " + student.age);
    }
}
例题2:前面已提过 

/*
    定义一个Ming类
        面向对象的封装性:
            1. 属性私有化
            2. 对外需要提供公开的setter 和 getter

*/

public class Ming{

    private int age; 

    // set赋值
    public void setAge(int a){
        if(a < 0 || a > 10000){
            System.out.println("你输入的年龄不合法 !");
            return;
        }
        age = a;
    }

    // get取值
    public int getAge(){
        return age;
    }

    public static void main(String[] args){

        //
    }
}

/*
    面向对象的封装性
*/
public class OOTest02{

    public static void main(String[] args){

        // 创建一个Arry类型的对象
        Ming ming = new Ming();

        // 取值(不能取)
        // System.out.println(arry.age);

        // 赋值(不能赋值)
        //arry.age = 18;
        //System.out.println(arry.age);

        arry.setAge(-1);

        System.out.println("ming的年龄是:"+ming.getAge());

    }

}
例题3:
/*
    参数传递
        值传递(传递过去的都是值)

    结论:只要是 基本数据类型,传递过去的都是值

    基本数据类型 都是“值传递”

*/

public class OOTest04{

    // java入口
    public static void main(String[] args){

        int i = 10;
        method01(i);
        System.out.println(i);//输出为10

    }

    public static void method01(int temp){
        temp = 1;
    }
}
例题4:

/*
    引用传递(传址)

    结论: 除了基本类型外 都是 址传递(引用传递)

*/

public class OOTest05{

    public static void main(String[] args){

        // 创建一个对象
        Student stu = new Student();

        stu.id = 10001;
        stu.name = "arry";
        stu.sex = true;
        stu.age = 18;    

        method01(stu);

        System.out.println("id = " + stu.id );
        System.out.println("name = " + stu.name);
        System.out.println("sex = " + stu.sex );
        System.out.println("age = " + stu.age);

    }

    public static void method01(Student temp){

        temp.name = "齐天";

    }

    /*
        执行流程:

        1. 执行main方法时,会在栈中创建main方法的栈帧,将局部变量 stu 引用保存到栈中

        2. 将Student对象放在堆区中,并赋值

        3. 调用method01方法,创建method01方法的栈帧

        4. 将局部变量stu引用(也就是stu对象的地址),传递到method01方法中,并赋值给 temp

        5. 此时,temp 和 stu 引用指向是同一个对象

        6. 当method01方法中将name属性改变为 “齐天” 时,改变的是堆中属性

        7. 所以会影响输出结果,最后输出结果为:“齐天”

        8. main方法执行结束,此时的stu对象还在堆中,我们无法使用了,就变成了“垃圾对象”

        java的 垃圾收集器GC会在某个时刻,将其清除

        以上的程序执行过程,是址传递,也就是引用的传递

        结论:
        */
}
时间: 2024-10-10 20:49:04

第九节(对象和引用)的相关文章

第九节:对象复活

前面“终结操作解密”讲过,需要终结一个对象被认为死亡时,垃圾回收器会强制对象重生,使它的Finalize方法得以调用.Finalize方法调用之后,对象才真正死亡.总之,需要终结的一个对象会经历死亡.重生.再死亡的“三部曲”.一个死亡的对象重生的过程称为复活. 准备调用对象的Finalize方法,这是复活的一种形式.垃圾回收器将一个对象引用放入freachable队列时,对象就从根可达,得以复活.这是必须的,因为只有这样,Finalize方法中的代码才能访问对象的字段.最终,对象的Finaliz

[ExtJS学习笔记]第九节 Extjs5的mvc与mvvm框架结构简介

本文地址:http://blog.csdn.net/sushengmiyan/article/details/38537431 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源:http://docs.sencha.com/ext

Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数

本文参考<Android系统源代码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/binder ----BpBinder.cpp ----Parcel.cpp ----ProcessState.cpp ----Binder.cpp ----IInterface.cpp ----IPCThreadState.cpp ----IServiceManager.cpp ----Static.cpp ~/Androi

JAVA 年轻代收集器 第九节

JAVA 年轻代收集器  第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低. 因此我们在必要的时候需要对虚拟机进行调优,那么调优的主要目标之一就是降低STW的时间,也就是减少Full GC的次数.那么这里我们从调优的角度来分析各个收集器的优势与不足. 首先从作用于年轻代的收集器开始(采用复制的收集算法): Serial收集器:一个单线程收集器,在进行回收的时候,必须暂停其他所有的工

2014年辛星完全解读Javascript第六节 对象

随着面向对象的普及,现在很多语言都在支持面向对象,Javascript也不例外,所谓对象,就是拥有属性和方法的数据.这里的属性其实就是变量,这里的方法,其实就是函数.但是Javascript的面向对象和其他编程语言还是有很大区别的. ************对象************* 1.Javascript中的对象的定义“属性的无序集合,每个属性存放一个初始值.函数或者对象”,也就是说,对象是没有额定顺序的值的数组. 2.Javascript中的对象一般可以分为本地对象.内置对象.宿主对象

Linux学习第九节课-shell脚本编程

Linux第九节课 -------------------------------------------------------------------------------------------------------------------------------- 程序:算法+数据结构 数据:程序的核心 算法:处理数据的方式 程序编程风格 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 高级编程语言 编译:高级语言→编译器→机器代码→执行,例如c,c++等

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

第九节:mybatis关联查询之一对多查询

一对多,是最常见的一种设计.就是 A 表的一条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键.这主要看以哪张表为中心,下面的测试数据中,从employee 表来看,一个员工对应一个部门,是一对一关系,如果从部门角度来看,则是一对多的关系,一个部门对应多个员工,本节主要研究一对多的关系. 查询部门的时候将部门对应的所有员工信息也查询出来 1,数据表建立 新建数据表department,有两个字段,插入两条数据如下: id dept_name 1 CIA 2 FSB 新建数据表emp

Java对象及其引用 (1)

Java对象及其引用 [文章转载自:http://zwmf.iteye.com/blog/1738574] 说明:所有转载为个人学习存档使用,凡转载内容均注明转载出处.以后不再说明. 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术.把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路. 为便于说明,我们先定