JavaSe-day11-类和对象
类和对象概念
生活中所有的内容和事物,都可以用一个名词概括:东西
在Java中,所有的内容和事物,也都可以用一个名词概括:对象。
概念对比
生活中 Java中
类别/种类 类 - class
个体(具体的某个个体) 对象 - Object
属性:有什么参数 成员变量
行为:能干什么 成员方法
1、类和对象的关系
生活中:类别和个体的关系
类别是个体的抽象 //界门纲目科属种
个体是类别的真实一个存在
Java中:类和对象的关系
类是对象的抽象
对象是类的实例
类:具有相同属性和行为的一类事物的集合/抽象,封装的是这类事务共有的属性和行为。
对象:类下面真实存在的很具体的一个个体
对象的点在于非常非常具体的一个个体
类是对事物类别的一种描述,对象则为具体存在的某一个事物
对象属于某个类,一个类可以有多个具体的对象
Java中,类是对象的数据类型
eg:
int a =1
人 moumou =张三
Student s = new Student();
万物皆对象
面向对象
面向对象是一种思想,一种解决问题的思路,源于生活
面向过程:只关注解决问题的过程,而不关注多个解决方法之间的关系等
面向过程:关注的是解决问题的具体思路,相当于基层员工
做法:
求和
1. 获取两个数
2. 把两个数相加
.....
n. 拿到计算结果
面向对象:在寻找解决方案前,先找对象(能解决我问题的对象),让对象来帮我拿出解决方案
面向对象:关注的是能解决该类问题的对象,相当于领导
做法:
求和
1. 获取两个数
2. 让能实现求和的对象帮你算,算好了告诉你结果
2.1 定一个方法,这个方法有两个参数,方法体会运算结果,把结果返回
类的定义
生活中事物都有固有的属性,在Java中称之为成员变量,定义在类里面方法外面
局部变量定义在方法里面(暂定)
生活中事物都有一些行为,在Java中称之为成员方法,成员方法没有static关键字修饰
现实生活中事务(eg:人)这个类别由属性和行为组成
Java中类由成员变量和成员方法组成
类定义的格式
public class 类名{
成员变量;
数据类型 成员变量名1;
数据类型 成员变量名2;
成员方法(没有static关键修饰的方法,其他与之前方法的定义格式都一样):
public 返回值类型 成员方法名1(){……}
public 返回值类型 成员方法名2(){……}
}
命名规则
大驼峰(类):第一个单词首字母大写,后面的每个单词首也字母大写
小驼峰(方法、变量):第一个单词首字母小写,后面的每个单词首也字母大写
对应关系:
现实生活中 Java类中
属性 成员变量
行为 成员方法
对象/类的使用
使用位置
需要先编写一个测试类,测试类中有main方法(程序的入口)
评判一个类是不是测试类,可以以有没有main方法类来判断(暂时)
在main方法中通过创建被测试类的对象来使用其成员(成员变量和成员方法)。
创建对象的格式
类名 对象名 = new 类名();
Scanner sc = new Scanner(System.in);
Random r = new Random();
Phone p = new Phone();
调用成员的格式
对象名.成员变量
Phone p = new Phone();
p.brand = "华为"; //成员变量的使用
对象名.成员方法();
sc.nextInt(); --调用Scanner的成员方法
r.nextInt(); --调用Random的成员方法
成员的定义没有顺序,因为执行顺序由调用的顺序决定。
打印对象
直接打印对象,打印的是根据对象根据内存地址等信息生成的16进制的hash值
sout(new int[10]) - [I@a9d2c4
[ 数组
[[ 二维数组
I 数组中元素类型(如果是引用数据类型,前面会加一个L,然后类型是完整的类型名<包含包名和类型>)
9d2c4 根据内存地址等信息生成的16进制的hash值
sout(new Student()) - com.itheima.Student@f6d7a8
com.itheima.Student 完整的类型名(完整的类名<包名和类名>)
f6d7a8 根据内存地址等信息生成的16进制的hash值
对象的内存图
对象的引用
就是对象所属类型的变量
存在栈内存中,值为其所指向的对象的地址值
stu1不是对象 他仅仅是一个存在在栈内存中的一个引用类型的变量
叫他变量也行 叫他对象引用也可以
对象本身
存在堆内存中的一块内存空间,对象中成员变量的值有默认初始化值
整数类型 : 0
小数类型 : 0.0
字符类型 : '\u0000' (空字符)
布尔类型 : false
引用数据类型 : null
方法执行
被调用的方法进入栈内存才能运行,此为进栈
方法运行结束后方法出栈,此为弹栈
栈内存的运行特性:先进后出 - FILO
main方法执行的时候首先进栈,
main方法中调用的其他方法在被调用的时候进栈,调用结束后就弹栈
main方法继续执行调用上述方法后的代码,运行结束后弹栈
成员内存分布
成员变量:类下的每个对象独有,相互独立,存储在对象在堆内存开辟的空间中
成员方法:类下所有对象共享,存储在方法区
多个引用指向同一个对象
对比图示
多个对象引用(对象所属类类型的变量)存储的是同一个对象在堆内存中的地址值
通过任何一个引用修改对象内容/值,其他引用对应内容或值会同时发生改变。
单个引用指向单个对象内存图
成员变量使用过程
成员方法调用过程
上课内存图
多个引用指向不同对象内存图
成员变量使用过程
成员方法调用过程
图碎了
上课内存图
多个引用指向相同对象内存图
图示
上课图示
字节码对象
类的字节码加载到方法区中,以字节码对象的形式存在
字节码在被使用的时候才会加载进方法区,而且只加载一次
成员变量和局部变量
成员变量:定义在类中方法外的变量
局部变量:定义在方法内或者方法声明上的变量
区别图示
变量的作用域
变量只能在其定义的{}内可以使用,离开该区域后,变量将从内存中消失,不能继续使用
注意:
测试类中,main方法中不能使用main方法所在类的成员变量。因为静态只能调用静态,后续会讲。
结论<暂定>:
测试类中,编写的方法一般都要带static
实体类中,编写的方法一般不要带static
附件
对象内存图、局部成员变量的区别文字版.md
来源:CSDN
作者:ytzang
链接:https://blog.csdn.net/ytzang/article/details/104500506