Skip to content

类与对象


基本介绍

知识迁移:类比 C 语言中的结构体

类的描述

类是一个对象的抽象,从字面意思就表示一个类的事物,类具有属性方法(行为)对象是类的一个具体表现

总结:对象抽象对象映射

举例:创建一个猫类

属性:姓名,年龄,体色.....

方法(行为):吃饭,跑步....

对象的引出

由这个猫类可以映射出不同的猫(对象),当属性方法变化时只需要在类中进行修改就可以映射到不同的类上,这也体现了类的便捷性

类与对象的关系

(1)类是抽象的、概念的,代表一类事物,比如人类、猫类……,即是一种数据类型(引用数据类型

(2)对象具体的、实际的,代表一个具体事物,即是实例

(3)是对象的抽象,对象是类的一个个体,对应一个实例


如何创建类

关键字 new(new 对象)

方式一:直接创建

java
public class hello{
    public static void main(String[] args){
        person person1 = new person();  //直接创建
    }
}
class person{
    int age;
    String name;
    double height;
    String[] job; //属性既可以基本数据类型,也可以是引用类型
}

方式二:先声明,后创建

java
public class hello{
    public static void main(String[] args){
        //先声明一个对象,然后创建
        person person1;
        person1 = new person();
    }
}
class person{
    int age;
    String name;
    double height;
    String[] job; //属性既可以基本数据类型,也可以是引用类型
}

⭐ 底层创建机制

java
person person1 = new person();

⚠️对象在内存中的存在形式

alt text

过程分析

(1)初始时,当还没有创建 cat 这个类并用一个数据类型为 cat 这个类的一个对象接收时,cat 在栈空间中指向空

(2)⭐ 类创建过程分析

1. 在方法区加载类的属性和方法,只会加载一次

2. 在堆空间中分配一段空间,存储类中的成员变量,初始为对应数据类型的默认值(默认初始化),最后返回地址给 cat,使得 cat 指向这个堆空间

3. 当成员变量中有 String 出现时,会把 String 的属性值放到方法区中的常量池里面,然后把地址返回给堆空间中的 String

4. 构造器初始化(显示初始化

练习一

java
Person p1 = new Person();
p1.age  = 10;
p1.name = "小明";

Person p2 = p1;

P2的属性是否和P1一致?

首先明确一点,类是引用类型,在传值的过程中传的地址,代码中把P1的地址赋给了P2,即P1P2指向同一块堆空间,结果一致

练习二

体会 b 的指向变化

java
// Person.java
public class Person {
    public int age;
    public String name;
}

// Main.java
public class Main {
    public static void main(String[] args) {
        Person a = new Person();
        a.age = 10;
        a.name = "小明";

        Person b;
        b = a;

        System.out.println(b.name);  // 小明

        b.age = 200;
        b = null;

        System.out.println(a.age);  // 200
        System.out.println(b.age);  // 会抛出 NullPointerException
    }
}

属性(成员变量 / 字段)

成员变量 = 属性 = field ( 字段 )

访问修饰符

访问修饰符分类:public、protected、默认修饰符、private

作用:用来控制属性的访问范围

使用细节

(1)属性的定义类型可以为任意类型,包含基本类型引用类型

(2)属性如果不赋值,有默认值

数据类型默认值
byte0
short0
int0
long0L
char\u0000
float0.0f
double0.0d
String(是一个类)null

(3)属性的访问方法:使用 类 . 属性 的方式访问,可以用一个变量接收

代码示例(这个时候还没有学习构造器,暂且使用赋值的方式完成初始化)

java
public clas objectexercise{
    public static void main(String[] args){
        person person1 = new person();
        int age = person1.age = 18;
        double height = person1.height = 1.63;
        String name = person1.name = "jackson";
        person1.job = new String[] {"student","programmer"};
        String[] job = person1.job
        System.out.println("age: " + age);
        System.out.println("height: " + height);
        System.out.println("name: " + name);
        System.out.print("job: ");
        for(int i = 0; i < person1.job.length; i++){
            System.out.print("第" + (i+1) + "份工作是:" + person1.job[i] + " ");
        }
    }
}
class person{
    int age;
    String name;
    double height;
    String[] job; //属性既可以基本数据类型,也可以是引用类型
}

//输出结果
age: 18
height: 1.63
name: jackson
job: 第1份工作是:student 第2份工作是:programmer