DAY 05
类与对象
- 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细的处理每一个细节
- 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我完成,偷懒
类与对象的关系
模拟现实世界
- 属性
- 行为
类是虚的,类不能打电话
对象是实的具体的,可以打电话,发短信
实例化就是创建
类的定义
定义一个类,用来模拟“学生”事物。其中就有两个组成部分。
- 属性:(是什么)
姓名
年龄 - 行为:(能做什么)
吃饭
睡觉
学习 - 对应到java类中
成员变量(属性):
String name;
int age;
成员方法(行为):
public void eat(){}//吃饭
public void sleep(){}//睡觉
public void study(){}//学习
注意事项: 1.成员变量是直接定义在类当中的,在方法外面 2.成员方法不要写static关键字 public class Student{ 成员变量,直接写在类中,不在方法中 String name; int age; 成员方法 public void eat(){ sout("吃饭") public void sleep(){ sout("睡觉") public void study(){ sout("睡觉") }; }
对象的创建和使用
通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
1.导包:也就是指出需要使用的类,在什么位置
import 包名称.类名称
对于和当前类属于同一个包的情况,可以省略导包语句不写。
2.创建:
类名称 对象名 = new 类名称();
3.使用
- 使用成员变量:对象名.成员变量名
- 使用成员方法:对象名.成员方法名(参数)
(也就是,想用谁,就用对象名点儿谁。) - 注意事项:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。引用的是Null,int类型的是0。两个对象使用同一个方法的内存
两个引用指向同一个对象的内存
使用对象类型作为方法的参数
当一个对象作为参数,传递到方法当中时,实际上传递进去的是对象的地址值。
0x666
使用对象类型作为方法的返回值
返回值其实就是对象的地址值
0x666
局部变量和成员变量
- 1.定义的位置不一样【重点】
局部变量:在方法内部
成员变量:在方法外部,直接写在类当中 - 2.作用范围不一样【重点】
局部变量:只有方法当中才可以使用,出了方法就不能再用
成员变量:整个类全都可以使用 - 3.默认值不一样【重点】
局部变量:没有默认值,如果要想用,必须手动进行赋值
成员变量:如果没有赋值,会有默认值,规则和数组一样 - 4.内存变量位置不一样
局部变量:位于栈内存
成员变量:位于堆内存 - 5.生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
面向对象三大特征之封装
封装性在Java中的体现:
- 方法就是一种封装
- 关键字private也是一种封装
public static void main(String[] args){ int[] array = {5,15,25,20,100}; int max = getMax(); sout("最大值:"+max); } public static int getMax(int[] array){ int max = array[0]; for(i=1;i<array.length;i++){ if (array[i]>max){ max = array[i]; } } return max; }
问题描述:定义person的年龄时,无法阻止不合理的数值被设置进来
解决方案:用private关键字将需要保护的成员变量进行修饰
一旦使用了private进行修饰,那么本类当中仍然可以随意访问。
但是!超出了本类之外就不能再直接访问了。
间接访问private成员变量:就定义一对儿Getter/Setter方法
必须叫setXxx或者是getXxx命名规则
public class Person{ String name; private int age;//!!!!!!!主角在此 public void show(){ sout("我叫:"+name+",年龄"+age); } //这个成员方法,专门用于向age设置数据 public void setAge(int num){ if (num < 100 && num >= 9){ age = num; }else{ sout("数据不合理!") } //这个成员方法,专门用于获取age的数据 public int getAge(){ return age; } } }
public class DemoPerson{ person person = new Person(); person.show(); person.name = "赵丽颖"; person.setAge(-20); person.show(); //我叫:null,年龄:0 数据不合理!我叫赵丽颖,年龄:0 }
对于基本类型中的boolean类型,Getter方法一定要写成isXxx的形式,而setXxx规则不变。
this
王思聪,你好。我是王思聪。
当局部变量和成员变量冲突的时候,优先使用局部变量
如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名
- 通过谁调用的方法,谁就是this
构造方法
1.构造方法的名称必须和类名完全一样,就连大小写也要一样
2.构造方法不要写返回值类型,连void都不需要写
3.构造方法不能return一个具体返回值
4.如果没有编写任何构造方法,那么编译器会赠送一个构造方法,没有参数,方法体什么都不做
5.一旦编写了至少一个构造方法,那么编译器不再赠送
6.构造方法也是可以重载的
重载:方法名称相同,参数列表不同
public class Student{ //用来创建对象 public Student(){ sout("构造方法执行啦!"); } }
new一个对象就是使用的构造方法
public class Demo01Student{ //用来创建对象 psvm{ Student stu = new Student();//调用构造方法Student } }
定义一个标准的类
一个标准的类通常拥有以下四个组成部分
1.所有的成员变量都要使用private关键字修饰
2.为每一个成员变量编写一对Getter/Setter方法
3.编写一个无参数的构造方法
4.编写一个全参数的构造方法
这样标准的类也叫Java Bean
public class Student{ private String name; private int age; ->code -> gennerate或者“ALT+INSERT” }