创建对象内存分析与继承

本文通过分析Java代码展示了类与对象的内存分配,解释了栈和堆内存的区别,以及方法区的作用。在Pet类实例化过程中,详细阐述了对象的创建、属性赋值和方法调用。同时,文章强调了封装的重要性,包括数据隐藏和提供公共接口,以增强程序的安全性和可维护性,并通过Student类的示例展示了get/set方法的使用。
摘要由CSDN通过智能技术生成
package com.rgf.oop.Demo04;

public class Application {
    public static void main(String[] args) {
        Pet dog = new Pet();
        dog.name="旺财";
        dog.age=3;
        dog.shout();
        System.out.println(dog.name);
        System.out.println(dog.age);
       
    }
}
package com.rgf.oop.Demo04;

public class Pet {
    public String name;
    public int age;
    //无参构造
    public void shout(){
        System.out.println("叫了一声");
    }
}

我们根据这两块代码来进行对于此刻的内存分析:

内存分为栈和堆,在堆里面还有方法区。

第一步的时候,我们会把Application这个类的一些代码信息放进去内存里面,即在堆里面的方法区里面加载Application类,这个类里面有main()方法,还有一些字符串,我们一般称为常量。一般有一个常量池,里面存放一些常量。例如:常量池:旺财

之后我们执行main方法的时候,main方法是在栈里面的最底下,我们执行main方法的时候,我们要new一个类,叫Pet,我们要创建这个类Pet,这个类里面有name和age这两个字段,还有一个方法叫shout( )。我们有Pet这个类之后,我们进行new这个类的时候,我们进入Pet这个类。new完所生成的对象名是在栈里面(引用变量名),而真正的对象是在堆里面。

在堆里面我们所new的类Pet,会有一个内存地址,我们假设0x0001,即该对象的内存地址。而且有默认的name=null,age=0,还有一个方法shout(),这个方法在new的时候所调用的是堆里面的方法区里面的Pet的shout()方法。

之后完成上述我们成功new出来一个对象,之后我们要对这些对象进行赋值

而且在堆里面的方法区也有静态方法区static,这个里面的方法是和类一起加载的,所有对象都是可以使用这个静态方法的。

在栈里面,main()方法压入栈底,然后调用其他方法,其他方法调用完毕之后,main()方法弹出,程序结束。

类与对象的总结:

package com.rgf.oop.Application;

public class Application {
    /*
    1.类与对象
    类是一个模板:抽象,对象是一个具体的实例
    2.方法
    定义、调用
    3.对象的引用
    引用类型:基本类型(8)
    对象是通过引用来操作的:栈(引用对象)----->堆(真实对象,地址)
    4.属性:字段Field 成员变量
    默认初始化:
    数字:  0  0.0
    char:u0000
    boolea:false
    引用:null
    属性的定义:
    修饰符  属性类型 属性名=属性值!
    5.方法:定义和调用
    6 .对象的创建和使用:
    (1)必须使用new关键字创造对象,构造器Person rgf=new Person();
    (2)对象的属性   rgf.name;
    (3)对象的方法    rgf.sleep();
    7.类:
    静态的属性   属性
    动态的行为   方法
  封装、继承、多态
    
     */
}

封装:该露的露,该藏的藏

我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;

低耦合:仅暴露少量的方法给外部使用。

封装(数据的隐藏)

通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。

记住这句话就够啦:属性私有,get/set

封装思想的具体体现:

package com.rgf.oop.Demo05;
/*
1.提高程序的安全性,保护数据。
2.隐藏代码的实现细节
3.统一接口
4.提高了系统的可维护性
 */
public class Application {
    public static void main(String[] args) {
        Student stu1 = new Student();
        stu1.getId();
        stu1.getAge();
        //在java中,如果判断一个类的两个方法是否相同,
        // 主要参考两个东西,方法名和参数列表,如果方法名相同,方法一定相同,
        //如果参数列表相同,那么一定是同一个方法。
        stu1.setName("rgf");
        stu1.setId(5);
        stu1.setAge(5);
        //stu1.setAge(999); //不合法的
        System.out.println(stu1.getAge()); //println方法的重载
        System.out.println(stu1.getName());
        System.out.println(stu1.getId());
    }
}
package com.rgf.oop.Demo05;
//类  private:私有访问权限
public class Student {

    //属性私有
    private String name; //名字
    private int id; //学号
    private char sex;//性别
    private int age;//年龄

    //提供一些可以操作这个属性的方法!
    //提供一些public的get、set方法。

    //get 获得这个数据
    public String getName() {
        return this.name;
    }

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 120 || age < 0) {
            this.age = 3;
        } else {
            this.age = age;
        }
    }

        //set 给这个数据设置值
        public void setName (String name){
            this.name = name;
        }

        public void setId ( int id){
            this.id = id;

        }
    }

运行界面如下:

 我们可以快速利用IDEA进行set和get方法的实现:

1.点击鼠标右键,选择Generate。

 2.点击Generate之后,点击Getter和Setter。

 3.选择所要创建的get或者set方法的属性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直再追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值