面向对象基础

本文介绍了封装的概念与优点,如何通过private和set/get方法实现封装,以及构造方法(包括无参和带参)在对象创建中的作用。还探讨了对象内存图的创建步骤和this关键字在方法中的内存原理。
摘要由CSDN通过智能技术生成

一.封装:

 尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。

系统的其他对象只能通过包裹在数据外面的已经授权的操作(简单的外部接口)来与这个封装的对象进行交流和交互。

也就是说用户是无需知道对象内部的细节,但可以通过该对象对外提供的接口来访问该对象。

优点:

         1.保证内部结构的安全

         2.屏蔽复杂,暴露简单

实现:所有成员变量添加private关键字,设置set和get函数

public class Student {
    private String name;
    private int age;
    private char gender;

    public void setName(String name) {
        //this的作用:区分成员变量和局部变量
        this.name = name;
    }

    public void setAge(int age) {
        if (age >= 18 && age <= 50) {
            this.age = age;
        }else{
            System.out.println("数据非法");
        }
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public char getGender() {
        return gender;
    }
}

 封装思想的应用:

        当一个函数的参数不确定时,或者参数很多时,可以把这些参数封装成一个对象。传递参数时,就只要传递这个整体的对象就可以了,不需要管底层零散的数据。

User userInfo = new User(username, password, null, null);
//以User对象作为参数传递,而不是内部零散的一些属性
boolean result = checkUserInfo(list, userInfo);

二.构造方法

 创建对象时,由虚拟机自动调用,作用是给成员变量初始化。

1.无参构造方法:

 初始化对象时,成员变量的数据均采用默认值

public class Student {
    private String name;
    private int age;
    private char gender;

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

 注意:如果我们自己没有写任何的构造方法,那么虚拟机会自动创建一个默认的无参构造方法

 2.带参构造方法:

 初始化对时,同时为对象赋值

public class Student {
    private String name;
    private int age;
    private char gender;

    public Student(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}

注意:如果已经定义了构造方法,那么虚拟机将不再提供默认的无参构造方法

解决方法:无论是否都使用,都要同时手写无参构造方法和全参构造方法

三.对象内存图

1.创建一个对象所需要的步骤(7步):

①加载class字节码文件(进入方法区/元空间)

②申明局部变量

③在堆内存中开辟一个空间

④默认初始化

⑤显示初始化

如果在定义成员变量时,已经初始化值,则执行该步骤;否则可以忽略

⑥构造方法初始化

如果使用的是有带构造方法创建对象,则需要执行该步骤;否则可以忽略

例如:

public class Main {
    public static void main(String[] args) {
        Student s=new Student("李四",18);
    }
}

所以,构造方法≠创建对象,构造方法只是创建对象7步中的一步

⑦将堆内存中的地址赋值给局部变量

2.两个引用指向一个对象

public class Main {
    public static void main(String[] args) {
        Student s1=new Student("zhangsan",23);
        Student s2=s1;
    }
}

四.this的内存原理

本质:方法调用者的地址值

作用:区分成员变量和局部变量

举个🌰🌰🌰

主函数: 

首先创建了一个对象,地址值为001

 

s1调用setName方法进行赋值,setName方法加载进栈

执行setName方法

此时,s1是setName方法的调用者,对于setName方法中的this,代表的就是调用者s1的地址值。

也就是将参数 "竹小玲" 赋值给this(001)中的name

setName方法执行完毕,出栈

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值