面向对象基础部分——类与对象(2)

举报
周小末天天开心 发表于 2022/11/19 16:38:31 2022/11/19
【摘要】 如何创建对象创建对象有两种方法,一种是先声明在创建,一种是直接创建1)先声明后创建Cat cat1; // 声明对象 cat1cat1 = new Cat(); // 创建对象 cat12)直接创建对象Cat cat1 = new Cat(); // 直接创建对象一般我们都会使用第二种直接创建对象的方法创建对象,但并不能说第一种方法没用,有的情况下我们也需要使用第一种方法进行创建对象。如何访...

如何创建对象

创建对象有两种方法,一种是先声明在创建,一种是直接创建

1)先声明后创建

Cat cat1; // 声明对象 cat1
cat1 = new Cat(); // 创建对象 cat1

2)直接创建对象

Cat cat1 = new Cat(); // 直接创建对象

一般我们都会使用第二种直接创建对象的方法创建对象,但并不能说第一种方法没用,有的情况下我们也需要使用第一种方法进行创建对象。

如何访问属性

访问属性的基本语法为:

对象名.属性名;

如: cat.name;        cat.age;

类与对象的内存分配机制(重要)

看看下一段代码,思考结果是什么

public class Object02 {
    public sttaic void main(String[] args) {
 
        Person p1 = new Person();
        
        p1.name = "周小末";
        p1.age = 18;
 
        Person p2 = p1; //p1 指向 p2
        System.out.println(p2.name + p2.age);
    }
}
 
class Person {
    String name;
    int age;
}

输出结果为:

QQ图片20221009230752.png


可以看出,把 p1 赋给 p2 (让p1指向p2)后,p1 和 p2 指向了同一个内存空间,所以输出p2中的name和age就是周小末 18。

这里就要和小伙伴们说一下Java内存的结构分析了😋

1)栈:一般存放基本数据类型,也就是局部变量

2)堆:堆主要存放对象(Cat cat1 ,数组等)

3)方法区:包含常量池(常量,如字符串等),类加载信息

练习

阅读下面一段代码,写出输出结果

public class Object03 { 
 
	public static void main(String[] args) {
 
		Person a=new Person();
		a.age=10;
		a.name="小明";
        Person b;
        b = a;
        System.out.println(b.name);
		b.age = 20;
        b = null;
		System.out.println(a.age); 
        System.out.println(b.age); 
	}
}
 
class Person {
	String name;
	int age; 
}

输出结果为:


QQ图片20221009232242.png

 可以看出,前两个输出语句都可以正常输出,但是第三个却出现了异常,这就需要分析一波内存分配了。

1)运行第一个输出语句时已经执行了 b = a,说明a和b都指向了同一个数据空间,所以输出b.name就是输出 小明。

2)第二个输出语句输出的是 a.age ,因为已经执行了 b.age = 20,所以说明更改了内存中原来的年龄10变为了20,(注意:因为a和b指向同一个内存空间,所以更改b.age就是更改内存中的地址,导致a的值也会改变!!!)所以会输出20。

3)第三个输出要很注意,为什么抛出了一个异常?这里就要去了解这个b = null语句执行后内存中发生了什么变化。

结合下图分析:

QQ图片20221011155937 (2).png

当运行到 b = a 时,说明a和b都指向了同一个内存空间0x0011(自命名,纯属讲课使用),执行了b.age后,内存中的age由10变成了20。所以执行语句System.out.println(a.age);后输出a中的年龄也是20。

        然后运行 b = null,这里要特别注意,把空字符赋给b后,堆中的内存并不会发生改变,因为将空字符指向b后代表的是让b不再指向内存空间0x0011,就等于将图中黄色的线切断,b不再指向堆,但不会影响堆中内存的值。所以语句System.out.println(a.age);不会受到影响。

总结

类与对象是学习面向对象的基础,一定要将基础打牢,循序渐进去学习,才能有所收获✔️

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。