【Java】P7 面向对象(2)属性
创始人
2025-05-30 00:07:23
0

属性

  • 属性的分类
  • 局部变量 与 形参
  • 基本数据类型 与 引用数据类型
  • 实例化
  • 堆空间 与 栈空间
  • 附完整代码如下


属性的分类

在类中,我们有两个成员,一个是 属性,另一个是 方法

class Person {// 定义属性String name;int age;char gender;// 定义方法public void eat() {String food = "宫保鸡丁";   // 定义局部变量System.out.println("我喜欢吃" + food);}public void sleep(int hour) {    // 形参:属于局部变量System.out.println("人至少睡眠" + hour + "小时");}
}

属性中, 变量的定义可以分为:基本数据类型引用数据类型
方法中, 变量的定义可以分为:局部变量形参

即:

在这里插入图片描述

因为本文主要围绕的是 属性 部分,所以下文将首先介绍 方法 部分,然后详细介绍属性部分的 基本数据类型引用数据类型


局部变量 与 形参

// 定义方法
public void eat() {String food = "宫保鸡丁";   // 定义局部变量System.out.println("我喜欢吃" + food);
}
public void sleep(int hour) {    // 形参:属于局部变量System.out.println("人至少睡眠" + hour + "小时");
}

在定义方法部分,我们一共对 Person 类定义了两个方法:eatsleep;而在方法 eat 中,我们通过定义局部变量 food 并赋值,最后通过 sout 打印;

public void eat() {String food = "宫保鸡丁";   // 定义局部变量System.out.println("我喜欢吃" + food);
}

需要注意的是,在定义局部变量时,我们必须对其进行赋值,而不是仅仅初始化;

在方法 sleep 中,我们通过定义形参 hour,并且通过传参的方式将其值传入,最终通过 sout 打印;

public void sleep(int hour) {    // 形参:属于局部变量System.out.println("人至少睡眠" + hour + "小时");
}

需要注意的是,与局部变量对比,形参因为可以在被调用时候传入值,所以我们可以仅执行初始化操作,而不赋值;


基本数据类型 与 引用数据类型

我们定义一个类 Employee,并定义属性如下:

public class Employee {// 定义属性int id;     // 编号String name;        // 姓名int age;        // 年龄double salary;      // 薪资
}

其实通过观察不难发现,好像 String 与另外三个属性不太相同;仔细思考,其实是因为 String 不属于 基本数据类型,而是属于 引用数据类型

Java 的基本数据类型包括以下几种:整型:byte、short、int、long
浮点型:float、double
字符型:char
布尔型:boolean这些数据类型分别代表不同的数据类型,可以用于声明变量、函数参数、函数返回值等。
其中,整型用来表示整数,浮点型用来表示小数,字符型用来表示单个字符,布尔型用来表示真或假。
Java 的引用数据类型可以被理解为指向对象的指针
它们不存储实际的数据值,而是存储指向对象的内存地址。Java 中常见的引用数据类型包括以下几种:类类型(Class Type):包括所有的类、接口和数组类型。
接口类型(Interface Type):指的是所有的接口类型。
数组类型(Array Type):指的是所有的数组类型,无论是基本数据类型的数组还是对象类型的数组。这些引用数据类型都需要在使用前进行实例化,即通过 new 关键字创建对象并分配内存空间。
在实例化后,引用数据类型变量会存储对象的内存地址,从而允许程序通过引用来访问对象的属性和方法。

上述两段初学不会完全理解,结合下述的代码去理解就好;

public class Employee {// 定义属性int id;     // 编号String name;        // 姓名int age;        // 年龄double salary;      // 薪资MyDate birthday;       // 生日
}

我们在上述代码的基础上再加上一行 引用数据类型 变量,即 MyDate

MyDateString 不同的在于,其是我们自己定义的 引用数据类型

public class MyDate {int year;int month;int day;
}

创建一个名为 MyDate 的类;在类中,定义三个成员变量:yearmonthday,分别代表年月日;

然后我们将其实例化:


实例化

我们另创建一个名为 EmployeeTest 的类,在类中,我们创建两个实例:emp1 以及 emp2

public class EmployeeTest {public static void main(String[] args) {// 创建类的实例,类的实例化Employee emp1 = new Employee();System.out.println(emp1);      // 类型@地址// 创建实例变量emp1.id = 1001;emp1.name = "Tom";emp1.age = 21;emp1.salary = 7800;emp1.birthday = new MyDate();emp1.birthday.year = 1999;emp1.birthday.month = 1;emp1.birthday.day = 15;System.out.println("id = " + emp1.id + ",name = " + emp1.name + ",age = " + emp1.age + ",salary = " + emp1.salary + ",birthday = " + emp1.birthday.year + "年  " + emp1.birthday.month + "月" + emp1.birthday.day + "日");// 创建第二个对象Employee emp2 = new Employee();     // 开辟空间给第二个对象System.out.println(emp2);//        emp2.id = ;
//        emp2.name = ;
//        emp2.age = ;
//        emp2.salary = ;System.out.println("id = " + emp2.id + ",name = " + emp2.name + ",age = " + emp2.age + ",salary = " + emp2.salary);}
}

观察第一个实例化部分:emp1

Employee emp1 = new Employee();// System.out.println(emp1);      // 类型@地址// 实例变量赋值
emp1.id = 1001;
emp1.name = "Tom";
emp1.age = 21;
emp1.salary = 7800;
emp1.birthday = new MyDate();
emp1.birthday.year = 1999;
emp1.birthday.month = 1;
emp1.birthday.day = 15;System.out.println("id = " + emp1.id + ",name = " + emp1.name + ",age = " + emp1.age + ",salary = " + emp1.salary + ",birthday = " + emp1.birthday.year + "年  " + emp1.birthday.month + "月" + emp1.birthday.day + "日");

首先我们通过 new 方法给实例 emp1 开辟 堆空间

Employee emp1 = new Employee();

然后我们对实例变量进行赋值:

emp1.id = 1001;
emp1.name = "Tom";
emp1.age = 21;
emp1.salary = 7800;
emp1.birthday = new MyDate();
emp1.birthday.year = 1999;
emp1.birthday.month = 1;
emp1.birthday.day = 15;

需要注意的是,在 emp1.birthday 开始,我们首先又一次执行了 new,即:

emp1.birthday = new MyDate();

即,我们给 emp1.birthday 开辟 堆空间 ;并且把地址信息给 emp1.birthday 属性;然后给属性赋值:

emp1.birthday.year = 1999;
emp1.birthday.month = 1;
emp1.birthday.day = 15;

在这里读者应该产生困惑有两点,第一点是 堆空间,第二点是 地址信息;下一个部分的内容将阐述这两个点;

我们在赋值给引用数据类型 emp1.birthday 赋值后,可以打印内容如下:

System.out.println("id = " + emp1.id + ",name = " + emp1.name + ",age = " + emp1.age + ",salary = " + emp1.salary + ",birthday = " + emp1.birthday.year + "年  " + emp1.birthday.month + "月" + emp1.birthday.day + "日");

堆空间 与 栈空间

在 Java 中,堆空间和栈空间都是用来存储程序中的数据的内存区域,但是它们有着不同的特点和用途。

堆空间(Heap Space): 堆空间是用于存储对象的内存区域。所有通过 new 关键字创建的对象都存储在堆空间中,而且这些对象的生命周期由垃圾收集器来管理。堆空间的大小一般由 JVM 参数进行设置,可以动态扩展,因此它可以存储任意数量的对象。

栈空间(Stack Space): 栈空间是用于存储方法调用的内存区域。每个线程都有自己的栈空间,用于存储方法调用的参数、局部变量和方法返回值等数据。栈空间的大小是由 JVM 预设的,不能动态扩展,因此它的空间较小,只能存储相对较小的数据。

需要注意的是,基本数据类型的变量也可以存储在栈空间中,但是它们和对象的引用不同,基本数据类型的变量存储的是数据本身而不是内存地址。此外,在方法调用结束后,方法的栈帧会被弹出并释放相应的内存空间,因此栈空间中的数据只有在方法执行期间才是有效的。

在这里插入图片描述
在该程序中,我们有两次 new,第一次开辟 堆空间emp1 实例,第二次开辟 堆空间emp1.birthday 引用数据类型属性;而如果我们将 emp1 以及 emp1.birthday 打印可以发现,其存储的都是 类型@地址 的地址信息:

System.out.println(emp1);      			// 类型@地址
System.out.println(emp1.birthday);      // 类型@地址

附完整代码如下

MyDate.java

package com.athongduo.idea;/*** ClassName: MyDate* Description:** @Author: XU Hongduo* @Create 2023/3/17 14:28* @Version 1.0*/
public class MyDate {int year;int month;int day;
}

Employee.java

package com.athongduo.idea;/*** ClassName: Employee* Description:** @Author: XU Hongduo* @Create 2023/3/17 14:16* @Version 1.0*/
public class Employee {// 定义属性int id;     // 编号String name;        // 姓名int age;        // 年龄double salary;      // 薪资MyDate birthday;       // 生日
}

EmployeeTest.java

package com.athongduo.idea;/*** ClassName: EmployeeTest* Description:** @Author: XU Hongduo* @Create 2023/3/17 14:18* @Version 1.0*/
public class EmployeeTest {public static void main(String[] args) {// 创建类的实例,类的实例化Employee emp1 = new Employee();System.out.println(emp1);      // 类型@地址// 创建实例变量emp1.id = 1001;emp1.name = "Tom";emp1.age = 21;emp1.salary = 7800;emp1.birthday = new MyDate();emp1.birthday.year = 1999;emp1.birthday.month = 1;emp1.birthday.day = 15;System.out.println("id = " + emp1.id + ",name = " + emp1.name + ",age = " + emp1.age + ",salary = " + emp1.salary + ",birthday = " +emp1.birthday.year + "年  " + emp1.birthday.month + "月" + emp1.birthday.day + "日");// 创建第二个对象Employee emp2 = new Employee();     // 开辟空间给第二个对象System.out.println(emp2);//        emp2.id = ;
//        emp2.name = ;
//        emp2.age = ;
//        emp2.salary = ;System.out.println("id = " + emp2.id + ",name = " + emp2.name + ",age = " + emp2.age + ",salary = " + emp2.salary);}
}

相关内容

热门资讯

安卓系统的总体框架,架构与核心... 你有没有想过,你的手机里那个神奇的安卓系统,它到底是怎么运作的呢?今天,就让我带你一探究竟,揭开安卓...
谁的安卓系统好,谁家的安卓系统... 说到安卓系统,这可是个热门话题呢!你有没有想过,这么多安卓手机品牌,哪个的操作系统最让你心动?今天,...
安卓系统信付通,安全无忧的移动... 你知道吗?在安卓手机的世界里,有一个超级好用的支付工具,它就是信付通。今天,就让我带你来全方位了解一...
小米官方系统安卓包,深度解析与... 亲爱的数码爱好者们,你是否曾为手机系统而烦恼?市面上那么多手机品牌,各种操作系统让人眼花缭乱。今天,...
自制安卓手机双系统,自制安卓手... 你有没有想过,自己的手机可以同时运行两个操作系统呢?没错,就是那种安卓手机双系统!听起来是不是很酷?...
小米安卓系统怎么设置,科技前沿... 小米手机的用户们,是不是觉得安卓系统有点复杂,设置起来有点头疼呢?别担心,今天就来手把手教你如何轻松...
点歌系统支持安卓系统么,安卓用... 你有没有想过,在手机上点歌听歌,是不是也能像在KTV里那样随心所欲呢?现在,就让我来告诉你一个超级酷...
原版安卓系统刷机,解锁无限可能 你有没有想过,你的安卓手机其实可以焕然一新?没错,就是那种原汁原味的安卓系统,让你的手机重新找回当初...
欧尚改装安卓系统,打造智能驾驶... 你有没有想过,你的欧尚汽车其实也可以变身成为智能座驾呢?没错,就是那个你每天上下班的伙伴——欧尚,现...
安卓系统最新事件,揭秘最新重大... 你知道吗?最近安卓系统可是发生了一件超级大事件,简直让人兴奋得心跳加速!这不,我就迫不及待地来和你分...
早期电话手表安卓系统,安卓系统... 你有没有想过,小时候那些看似简单的玩具,现在竟然也能玩出花来?比如,早期的电话手表,那时候的功能可真...
安卓老系统手机游戏,安卓老系统... 你有没有发现,那些安卓老系统手机,虽然看起来有点古老,但它们在游戏界可是有着自己独特的魅力呢!想象那...
安卓系统重启还是开关,重启与开... 手机突然卡壳了,是不是又该给安卓系统来个重启大法了?别急,今天就来聊聊这个让人又爱又恨的“安卓系统重...
安卓系统刷入iso,轻松实现个... 你有没有想过,你的安卓手机其实可以像变形金刚一样,换上全新的“皮肤”?没错,就是刷入ISO系统!这可...
安卓机系统无法关机,探究原因与... 最近我的安卓手机怎么啦?总是关机不成功,真是让人头疼啊!这可怎么办呢?别急,让我来帮你分析找出解决这...
安卓什么系统广告最多,揭秘最新... 你有没有发现,每次打开安卓手机,广告就像无处不在的小精灵,跳来跳去,让人眼花缭乱?今天,就让我带你一...
禁止中国使用安卓系统,“安卓系... 你知道吗?最近互联网上掀起了一股热议,那就是关于中国是否应该禁止使用安卓系统的话题。这可不是闹着玩的...
如何分辨ios系统和安卓系统,... 你有没有想过,你的手机里装的是iOS系统还是安卓系统呢?这两种系统各有千秋,但分辨它们其实并不难。今...
如何查询安卓系统版本,安卓系统... 你有没有想过,你的安卓手机里隐藏着一个小秘密——那就是它的系统版本!知道这个秘密,不仅能让你更好地了...
lg电视系统和安卓系统比较,性... 你有没有发现,现在家里的电视已经不再是那个傻乎乎的“大盒子”了?它变得聪明起来,能和你互动,能上网,...