面向对象内存解析

本文介绍了Java中的面向对象编程概念,包括类、对象的创建与使用,以及类的成员如属性和方法。通过Phone类的例子展示了如何定义和调用属性与方法。文章还讨论了面向对象的三大特征:封装、继承和多态,并提到了this和super等关键字的用途。此外,还解释了对象在内存中的存储结构,包括栈、堆和方法区的角色。
摘要由CSDN通过智能技术生成

面向对象的主要内容

  1. Java类及类的成员:属性,方法,构造器;代码块, 内部类
  2. 面向对象的特征:封装, 继承,多态
  3. 其他关键字的使用:this, super, package,import,static, final,abstract, interface等
1.1面向过程和面向对象的程序设计思想

在这里插入图片描述

面向过程(Process Oriented Programming):Oriented 发音:奥润忒的
面向对象(Object Oriented Programming):
1.2类(Class)和对象(Object)

类:对具有相同特征的一类事物的抽象描述

对象:在实际上具体存在的,对象又被称为类的实例;

类的内部成员:

属性(Field)又称为 成员变量,字段,域。

方法(Method)又称为函数。

1.3面向对象完成具体功能的三大步骤
  1. 创建类。

  2. 创建类的对象。

  3. 对象调用属性和方法。

    下面是举例说明

    //Ps:下面一共有两个类
    
    //1. 创建Phone类
    public class Phone {
        //1.1 设计类的属性
        String name;//属性:手机品牌
    
        //1.2 设计类的方法
        public void call() {
            System.out.println("手机能够拨打电话");
        }
        public void sendMessage(String message) {
            System.out.println("发送信息:" + message);
        }
    }
    
    //Phone的测试类:PhoneTest
    public class PhoneTest {
        public static void main(String[] args) {//main方法也是方法
            //2. 创建Phone的第一个对象
            Phone phone1 = new Phone();
            
            //3. 通过Phone的对象去调用属性和方法,格式为: 对象.属性,对象.方法
            
            //(1)调用属性
            phone1.name = "hua wei mate50";//给属性赋值
            System.out.println("name = " + phone1.name);
            
            //(2)调用方法
            phone1.call();
            phone1.sendMessage("你好,华为!");
            
            //创建Phone的第二个对象,这里要说明的是: 每一个对象的属性都互不干扰,独立存在
            //即如果修改第一个对象的属性,而第二个类的属性不会改变。具体看下面图1.1
            Phone phone2 = new Phone();
            phone2.name = "IPhone6"
            System.out.println("name = " + phone2.name);
            System.out.println("name = " + phone1.name);
             
        }
    }
    
    补充://创建完类的对象后,即使不给对象的属性赋值,也有默认值
    byte short int long char 的默认值是 0float double  的默认值是 0.0boolean 的默认值是 false;
    引用数据类型的默认值是 null;
    

    图1.1

在这里插入图片描述
对图1.1 的解析:

​ 栈帧:存入栈中的一个方法,这里只有一个main()方法,所以只有一个栈帧,如果在main()方法里调用其他的方法,则其他的方法按照顺序入栈成为一个栈帧

  1. main()方法入栈,局部变量中的形参args 首先存入到main()方法这个栈帧中。

  2. Person对象的变量 p1 存入main栈帧, 通过new创建Phone类的变量,同时在堆中为其开辟一块内存空间 ,空间内存储了对象p1的成员变量 name,age,gender, 这片空间的首地址值赋给变量p1。

  3. 然后通过对象p1.的方式调用属性name,age为其赋值;

  4. 再往后就重复2,3步,需要注意的是:每创建一个对象,都要在堆中为其开辟一片内存空间。

    ”创建一个的对象“ 指的是new出来的对象,如 Phone p2 = new Phone(); ,而 Phone p3 = p2这样的根本不叫创建了一个新的对象,这是直接赋值引用。 p1,p2 只是变量而已,只不过这个变量我们声明存储的是Person对象的首地址值,就int a ,我们声明a中存储的数据是int类型。真正的对象存储在堆中,p1作用:我们利用其存储的对象地址 通过“p1.”的方式 来调用对象的属性和方法。

    java变量分类图,来源于https://blog.csdn.net/qq_43842093/article/details/127200896,具体可以看看这个。

在这里插入图片描述

1.4对象在内存的结构解析

栈: 方法内定义的变量,Ps:main方法也是方法,所以在程序入口main方法内定义的phone1,phone2 存入栈中

堆:new出来的结构(即对象或数组),包括对象里面的属性,即上面Phone类对象中的name属性

方法区:存放类的模板(类就相当于创建对象的模板)

在程序入口main方法内定义的phone1,phone2 存入栈中

堆:new出来的结构(即对象或数组),包括对象里面的属性,即上面Phone类对象中的name属性

方法区:存放类的模板(类就相当于创建对象的模板)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值