前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >面向对象基础部分之【类与对象】❣️

面向对象基础部分之【类与对象】❣️

作者头像
周小末天天开心
发布2022-10-26 17:06:49
发布2022-10-26 17:06:49
22800
代码可运行
举报
运行总次数:0
代码可运行

❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️ 🧑个人主页:@周小末天天开心 各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力 感谢!

        首先我们要了解一下本篇面向对象基础部分都会讲到什么。

        我们本篇文章主要会围绕类与对象、方法、构造器和this关键字来讲解,虽然内容很多,但只要小伙伴们用心去学,用心去理解,解决这章内容就完全不是问题啦🙃。

目录

📕类与对象

引入

类与对象的区别和联系

对象在内存中的存在形式(必须搞清楚)

 成员方法/属性 中的细节

如何创建对象

如何访问属性

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

练习

📕总结


类与对象

引入

首先引入一个养猫问题,来看看在学习面向对象之前的解决方法。

        周小末养了两只猫猫:一只名字叫小白,今年 3 岁,白色。还有一只叫小黑,今年 5岁,黑色。请编写一个程序,当用户 输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示 张老太没有这只猫猫

这种问题如果按照之前的方法写就是这样的:

代码语言:javascript
代码运行次数:0
复制
public class Object01 {
    public static void main(String[] args) {
        String cat1Name = "小白";
        int cat1Age = 3;
        String cat1Color = "白色";

        String cat2Name = "小黑";
        int cat2Age = 5;
        String cat2Color = "黑色";

        System.out.println(cat1Name + cat1Age + cat1Color);
        System.out.println(cat2Name + cat2Age + cat2Color);

    }
}

这种方法虽然可行,但是弊端有很多:

1)单独变量来解决 => 不利于数据的管理

2)效率低,步骤多。

所以我们可以用今天所学到的知识来解决这个问题。

先看一组代码,然后进行分析

代码语言:javascript
代码运行次数:0
复制
public class Object01 {
	public static void main(String[] args) {

		Cat cat1 = new Cat();
		cat1.name = "小白";
		cat1.age = 3;
		cat1.color = "白色";

		Cat cat2 = new Cat();
		cat2.name = "小黑";
		cat2.age = 5;
		cat2.color = "黑色";


		System.out.print("第一只猫" + cat1.name + " " + cat1.age + " " + cat1.color);
		System.out.print("\n第二只猫" + cat2.name + " " + cat2.age + " " + cat2.color);
	}
}

class Cat{
		String name;
		int age;
        String color;
}

输出结果为:

分析一下:

1)class Cat{ } 表示定义一个类,一个名叫Cat的类,其中包含用户定义的数据

2)class Cat{ }中定义的成为成员变量,又称为属性

3)new Cat( ) 代表创建一个猫对象。

4)Cat cat1 = new Cat(); 把创建的猫对象赋 cat1

5)赋完后cat1就成了一个对象

6)第二只猫对象的创建和第一只猫方法一样 Cat cat2 = new Cat();

类与对象的区别和联系

1)类是抽象的,概念的,代表一类事物,比如人类,猫类.., 即它是数据类型.

2)  对象是具体的,实际的,代表一个具体事物, 即 是实例.

3)  类是对象的模板,对象是类的一个个体,对应一个实例

对象在内存中的存在形式(必须搞清楚)

成员方法/属性 中的细节

1)从叫法上来看,属性 = 成员变量

2)属性的定义类型可以为任意类型,包含基本类型和引用类型

3)属性是类的一个组成部分,一般为基本数据类型

4)属性如果不赋值,则默认值和数组一致

5)属性的定义方法与变量相同。如:访问修饰符 数据类型 属性名;

如何创建对象

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

1)先声明后创建

代码语言:javascript
代码运行次数:0
复制
Cat cat1; // 声明对象 cat1
cat1 = new Cat(); // 创建对象 cat1

2)直接创建对象

代码语言:javascript
代码运行次数:0
复制
Cat cat1 = new Cat(); // 直接创建对象

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

如何访问属性

访问属性的基本语法为:

对象名.属性名;

如: cat.name;        cat.age;

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

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

代码语言:javascript
代码运行次数:0
复制
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;
}

输出结果是:

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

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

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

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

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

练习

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

代码语言:javascript
代码运行次数:0
复制
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; 
}

输出结果为:

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

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

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

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

结合下图分析:

        当运行到 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);不会受到影响。

总结

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


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类与对象
    • 引入
    • 类与对象的区别和联系
    • 对象在内存中的存在形式(必须搞清楚)
    • 成员方法/属性 中的细节
    • 如何创建对象
    • 如何访问属性
    • 类与对象的内存分配机制(重要)
    • 练习
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档