目录
前言
学习面向对象三大特征相关知识之前首先引入类和对象的概念,以及类的组成,定义方式。
一、类和对象的理解
客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。
类的理解
类是对现实生活中一类具有共同属性和行为的事物的抽象
类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
简单理解:类就是对现实事物的一种描述
类的组成
属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
类和对象的关系
类:类是对现实生活中一类具有共同属性和行为的事物的抽象
对象:是能够看得到摸的着的真实存在的实体
简单理解:类是对事物的一种描述,对象则为具体存在的事物
二、类的定义
类的组成- - - - -两部分组成
属性:在类中通过成员变量来体现(类中方法外的变量)
行为:在类中通过成员方法来体现
类的定义步骤:
①定义类
②编写类的变量(成员变量)
③编写类的方法(成员方法、构造方法)
成员变量和局部变量
请思考:
1.类中有成员变量,方法中有局部变量,那么二者之间有什么区别?
2.若成员变量的名字与类中的方法中的局部变量方法同名如何处理?
区别:
类中位置: 成员变量(类中方法外)
局部变量(方法内部或方法声明上)
内存中位置:成员变量(堆内存)
局部变量(栈内存)
生命周期: 成员变量(随着对象的存在而存在,随着对象的消失而消失)
局部变量(随着方法的调用而存在,随着方法的调用完毕而消失)
初始化值: 成员变量(有默认初始化值)
局部变量(没有默认初始化值,必须先定义,赋值才能使用)
补充:This关键字
用于解决成员变量的名字与类中的方法中的局部变量方法同名的问题。
注!this修饰的变量用于指代成员变量,其主要作用是区分局部变量和成员变量的重名问题
主要分为i两种情况:
方法的形参如果与成员变量 同名:不带this修饰的变量指的是形参,而不是成员变量
方法的形参与成员变量 不同名:不带this修饰的变量指的是成员变量
成员方法、构造方法
成员方法
成员方法
成员方法作用概述:表示对象所具有的功能(和行为)。
成员方法格式
返回类型,可以为void类型,也可以是基本数据类型或引用类型。
成员方法名可以和类名相同,也可以不同。
构造方法
构造方法 - - - - - 可以理解为特殊的构造方法
构造方法作用概述:用于对象的数据进行初始化
构造方法格式
1.方法名与类名相同
2.没有返回值类型,连void都没有
3.没有具体的返回值
构造方法注意事项
1.如果你不提供构造方法,系统会给出默认构造方法
2.如果你提供了构造方法,系统将不再提供
3.构造方法也是可以重载的
注意:定义类的时候,建议自己添加无参的构造方法。
构造方法和成员方法的区别
格式:
构造方法和类名相同,并且没有返回类型,也没有返回值。
普通成员方法可以任意起名,必须有返回类型,可以没有返回值。
作用:
构造方法用于创建对象,并进行初始化值。
普通成员方法是用于完成特定功能的。调用:
构造方法是在创建对象时被调用的,一个对象建立,只调用一次相应构造函数
普通成员方法是由创建好的对象调用,可以调用多次
类定义实例:
代码如下:
class Student {
//成员变量
String name;
int age;
//成员方法
public void study() {
System.out.println("好好学习,天天向上");
}
public void doHomework() {
System.out.println("键盘敲烂,月薪过万");
}
}
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用对象
System.out.println(s.name + "," + s.age);
s.name = "林青霞";
s.age = 30;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
三、对象的使用
创建对象的格式: (使用构造方法)
无参
类名 对象名 = new 类名();
有参
类名 对象名 = new 类名(参数列表);
调用成员的格式:
对象名.成员变量
对象名.成员方法();
四、对象内存图
以类的定义中示例为例:
单个对象内存图
成员变量使用过程

1.程序执行从main 方法开始,所以main 方法首先加入到栈内存
2.执行 Student s = new Student();
Student s 执行到这里 ,它就会在main 方法中出现
new Student() 执行到这里,new Student() 就会在堆内存中开辟空间,由于这里调用的是无参的构造方法,所以系统会默认为对象的属性初始化,String类型属性name 默认为 null ,int类型属性 age 默认为 0。初始化完成后在堆内存中生成地址001 并赋值给栈内存中的对象 s。
3.第一条输出语句:
System.out.println(s) ;
- - - - -输出:001
s 初始化完成后存储了对象的地址001 。所以输出s 实际上是输出对象的地址(实际编程过程中一般会自动输出s.toString生成的一段字符,这个涉及到继承的相关知识这里不过多解释。)
4.第二条输出语句:
System.out.println(s.name+","+s.age);
- - - - -输出:null,0
s.name , s.age 通过栈内存中的001 指向堆内存中的对象位置,name/age 分别访问堆内
存中name 、 age 所对应的值,而这里对象初始化的 name 为 null ,int类型属性 age 为 0
所以输出结果 为 null , 0 。
5.s.name = "张曼玉", s.age= 28
这里与上一条同理 通过 栈内存中 s 指向的 001地址 指向 堆内存 中 001 对应的对象的
name 、age 属性 ,并用赋值语句对其进行了修改
6.第三条输出语句:
System.out.println(s.name+","+s.age);
- - - - -输出:张曼玉,28
与4.中同理。
成员方法调用过程

1.程序执行到 s.study();
在栈内存中出现 方法:study (s 表示main 方法中创建的 Stundent 对象 所以 调用者为 s ,地址为 001 )
执行方法:study() 之后 ,在控制台输出了 好好学习 ,
执行完毕:study() 就会从 栈内存中 消失
2.程序执行到 s.doHomework();
与上一步同理。
3.所有代码执行结束
main 方法执行完毕,main 方法也会从 栈内存中消失。
多个对象内存图

与单个对象内存图同理,所以这里讲解过程省略,接下来讲解一下多个对象指向相同内存图。
多个对象指向相同内存图
前面的部分与单个对象同理
重点:
从Student s2 = s1 ; 这段语句开始。
1.这里 s2 后面并没有 new 一个 Student 对象 ,而是将 s1 的地址赋值给了s2。
此时在栈内存的main 方法中 s1、s2的值都是 001 ,都指向堆内存 001.
2.然后用s2.name = 、s2.age 将对象的属性进行赋值操作,会使得在堆内存位置001的Stundent对象的属性 随之改变。
3.由于 s1、s2 都指向堆内存 001,所以最终输出 s1、s2 的属性值 时 结果都为,张曼玉,28
总结:
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
总结
对类和对象的理解,在学习面向对象的过程中是相当重要的基础环节,也是学好面向对象的重要保证,本篇文章主要讲述了类与对象的概述、类的组成部分以及如何定义、对象的创建与使用流程。希望大家通过对本篇文章的阅读,能够对面向对象的基础产生更加深入的认识和理解,最后祝大家学业有成工作顺利,芜湖!

8000

被折叠的 条评论
为什么被折叠?



