fantasticDream

面向对象----(程序执行过程的内存分析01)

引用类型

Java 语言中除基本类型之外的变量类型都称之为引用类型.

Java中的对象是通过引用(reference)对其操作的.

类的属性

属性 field ,或者叫成员变量

属性用于定义该类或该类对象包含的数据或者说静态属性.

属性作用范围是整个类体

在定义成员变量时可以对其初始化,如果不对其初始化,java使用默认的值对其初始化.(数值: 0,0.0 char:\u0000, boolean:false,所有引用类型:null   )

属性定义格式:

            [修饰符]  属性类型   属性名 = [默认值]

 

 

 

  面向对象中,整个程序的基本单位是类,

 方法是从属于类的.

 方法定义格式:

  [修饰符] 方法返回值类型  方法名(形参列表) {

n条语句

 }

 java中方法参数传递是:值传递!没有引用传递  

内存分析( SxtStu..java )

:

存放:局部变量

:

存放new出来的对象

方法区:

存放:类的信息(代码), static变量, 常量池(字符串常量).

 

内存分析:

(自动分配连续的空间,后进先出)

放置:局部变量 

(不连续 , )

:放置new处的对象 

方法区():也是堆的一部分

类的信息(代码), static变量, 常量池(字符串常量).

存放:类的代码信息,static变量,常量池(字符串常量......) 

package cn.Test.oop;

/**

 *  以类的方式组织代码,以对象的方式封装(组织)数据!

    操作对象就是操作它的地址!

    对象以类为模板来的!

    所有的引用类型都是4个字节!

 * @author 神奇的梦

 *

 */

 

public class Student {

    //属性:静态的数据 private 私有

//  成员变量你不初始化,系统会帮你初始化一下

     String name;

     int id; //学号

     int age;//年龄

     String gender;//性别

     int weight;//体重   

    //动态的行为     

     public void study() {

//       局部变量不会初始化,需要自己初始化

         int a;

//       the local variable a 这个局部变量a

//       may not have been _initializeo 也许没有被初始化

//       System.out.print(a+3);

         System.out.println(name+"在学习");

     }

     sname是局部变量需要声明,name是成员变量已经声明;

     public void sayHello(String sname) {

         System.out.println(name+"向"+sname+"说:你好!");

     }

//   形参列表形式: 数据类型1 形参名1,数据类型2 形参名2,...

        public int add(int a,int b,int c) {           

            int k=a+b+c;

//          return语句用于终止方法的执行并指定要返回的数据

            return k;           

        }     

//   从代码上讲Student从属Student()有关系

//   从逻辑上讲Student和Student()没有关系     

//   main及和它有关系,又可以认为没关系,因为所有的方法都要从main开始

//   虚拟机跑起来之后就找main方法

//   java里面所有的方法只能放在main里面,不能放到类之外 

     public static void main(String[] a) {         

//       如果是对象的话除了八种数据类型之外的话都是null

//       如果是数字默认是0小数是0.0

//       boolean默认是false

//       char: 反斜杠u0000  表示一个unknown也是0

//       构造类的初始化 创建一个学生对象

//       有没赋值的时候系统会默认给其赋个值         

         Student s1=new Student();      

         s1.name="宝气";

         s1.study();

         s1.sayHello("马克");

         /**

          *

         到这一步_jvm虚拟机就会在内存空间里面找有没有Student这个类

         如果已经加载了这个信息我们这里可以直接用

         如果没加载就在类里面找到并加载,找不到就会报错,它找的是class字节码文件的类         

         通过类加载器Class Loader加载Student类的信息,

         加载后,在方法区中就有了类的信息         

         s2是一个局部变量  建一个对象把对象的值覆盖这个变量

         new Student()这是调用我们的构造器         

         只要通过new构造的对象都会丢到堆里面去

         (通过赋值符=指向s2的地址)       

          *

          */ 

         Student s2=new Student();

         /**

          * 方法区(也是堆)

          * 方法区():也是堆的一部分!类的信息(代码), static变量, 常量池(字符串常量)等.

                存放:类的代码信息,static变量,常量池(字符串常量......)

          * 代码

          *     一堆属性

          *     Study(){

          *     ......

          *     }

          *    

          *     sayHello(){

          *     ......

          *     }  

          * static变量(以后再说)

          * 常量池(字符串常量...)

          * "宝气","宝气22","宝气333"

          *

          *

          */

         

         /**

          *

          * 堆(不连续 , )堆:放置new处的对象

        "new出来的模板"

          * 这里存的是地址(引用)

          *

          * name=null

          * id:0;

          * age:0;

          * gender:null;

          * weight:0;

          *

          * study:

          * sayHello:

          *

          * 通过study:指向study()

          * 通过sayHello:指向sayHello()

          *

          * 通过赋值符=指向s1的地址

          *

          *

          */

         

         /**

          * 栈

          * 栈(自动分配连续的空间,后进先出)放置:局部变量

          * s1 地址

          *

          * 栈里面要进行操作开一个栈针(每个方法对应一个栈针),用完就没有了(斯泰格福瑞姆)

          */ 

//       它方法区里面的对象通过引用赋值给堆里面的name地址(引用),

//       然后指向s2的地址

//       通过study:指向study()

//       通过赋值符=指向s2的地址

//       基本数据类型是可以直接赋值的

         s2.age=18;

         s2.name="宝气";

//       study()会指向它的方法 堆里面

//       栈里面要进行操作开一个栈针(每个方法对应一个栈针),

//       用完就没有了(斯泰格福瑞姆)         

         s2.study();

//       sayHello()会指向它的方法 堆里面

//       找到s2后指向一个study:再找到Study()方法

         s2.sayHello("宝气22");         

          Student mt=new Student();

         int i=3,j=4,k=5;

         int result =mt.add(i, j, k);

//       调用方法调用的形式:对象引用.方法名(实参列表)

//       实参的数目,数据类型和次序必须和所调用方法声明的形参列表匹配

         System.out.println(result);   

     }     

}

posted on   神奇的梦  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示