类与对象

  • 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细的处理每一个细节
  • 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我完成,偷懒

类与对象的关系

模拟现实世界

  • 属性
  • 行为

图片说明
类是虚的,类不能打电话
对象是实的具体的,可以打电话,发短信
实例化就是创建

类的定义

定义一个类,用来模拟“学生”事物。其中就有两个组成部分。

  • 属性:(是什么)
    姓名
    年龄
  • 行为:(能做什么)
    吃饭
    睡觉
    学习
  • 对应到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”
}

图片说明
图片说明