类与对象
基本介绍
知识迁移:类比 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();⚠️对象在内存中的存在形式

过程分析
(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,即P1和P2指向同一块堆空间,结果一致
练习二
体会 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)属性如果不赋值,有默认值
| 数据类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0L |
| char | \u0000 |
| float | 0.0f |
| double | 0.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