面向对象
类:对象共同特征的描述
对象:真实存在的具体东西
在java中,必须先设计类,才能获取对象。
1 | public class 类名{ |
类名 对象名 = new 类名();
1 | Phone p = new Phone(); |
访问属性:对象名.成员变量
访问行为:对象名.方法名(…)
- 使用时建议
(1)类名首字母建议大写、英文、有意义、满足驼峰模式,不能用关键字,满足标识符规定
(2)一个代码文件中可以定义多个类,但只能有一个类是public修饰的,public修饰的类名必须是Java代码的文件名称(一般建议一个文件只定义一个类)
(3)定义类时不需要给属性赋值
原则:对象代表什么,就要封装对应的数据,并提供数据对应的行为
简化编程。只需要找对象,调方法就行
降低学习成本,可以少学、少记,或者不用学、不用记对象有哪些方法,需要时去找就行
如果直接对price赋值一个负数,在语法上是没有问题的,不会出现报错,但是不符合常理
private关键字
(1)是一个权限修饰符
(2)可以修饰成员(变量和方法)
(3)被private修饰的成员只能在本类中访问
1 | public class Phone{ |
通过以上修饰后,当再次对新的对象赋值会出现报错(赋值合理也会报错)
1 | Phone p1 = new Phone(); |
改写:
1 | public class Phone{ |
分别使用“setXxx(参数)”方法为变量赋值与“getXxx()”方法获取变量的值。方法用public修饰(get方法要根据数据变量的类型确定返回值类型
1 | public class PhoneTest{ |
1 | public class Phone{ |
成员变量与局部变量重复时,会采用就近原则。由此可知上方输出的是局部变量中的price,结果为10.
如果一定要成员变量price,需要使用this关键字
1 | public class Phone{ |
this用于区分成员变量和局部变量
也称为构造器、构造函数
作用:在创建对象时给成员变量进行初始化(赋值,功能相当于上面的set方法)
特点:
(1)方法名与类名相同,大小写一致
(2)没有返回值类型,也没有void
(3)没有具体返回值(不能由return带回结果数据)
构造时机:
创建对象时由虚拟机调用,不能手动调用构造方法
每次创建一次对象,就会调用一次构造方法
注意事项:
①构造方法的定义
如果没有定义构造方法,系统将给出一个默认的无参数的构造方法
如果定义了构造方法,系统将不再提供默认的构造方法(如:你已经定义了一个有参构造,再去使用无参构造方法的话就会报错)
②构造方法的重载
带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这叫构造方法的重载
1 | //无参构造 |
1 | //带参构造 |
③推荐的使用方法
无论是否使用,都要手动书写两种构造方法
①类名要见名知意(驼峰命名)
②成员变量使用private修饰
③提供无参和带参的两种构造方法
④成员方法
- 提供每个成员变量对应的setXxx()/getXxx()
- 其他的行为(若没有则不用写)
(有一些idea可用的快捷键,但是我自己用的是vscode就先不写了)
一个对象的内存图
当所有方法执行完毕后,就会从栈里出去。main方法出栈后里面的变量就没有人使用了,堆内存中的空间也会消失。
两个对象的内存图
两个引用指向同一个对象
区别在于:
1 | Student stu2 = stu1; |
此时stu2指向的地址跟stu1相同,后续对stu2的操作也会影响stu1。如上图:当对stu2.name赋值为“阿珍”时,原本的名字也被重置了。