类和对象

1. Java语言的基本元素:类和对象

1.1 类和对象概述

类(Class)对象(Object)是面向对象的核心概念。

1、什么是类

:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。

2、什么是对象

对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)

1.2 类的成员概述

面向对象程序设计的重点是类的设计

类的设计,其实就是类的成员的设计

  • 现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同理,Java代码世界是由诸多个不同功能的构成的。

  • 现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、…

    Java中用类class来描述事物也是如此。类,是一组相关属性行为的集合,这也是类最基本的两个成员。

    • 属性:该类事物的状态信息。对应类中的成员变量

      • 成员变量 <=> 属性 <=> Field
    • 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法

      • (成员)方法 <=> 函数 <=> Method

1.3 面向对象完成功能的三步骤(重要)

步骤1:类的定义

类的定义使用关键字:class。格式如下:

[修饰符] class 类名{  
    属性声明;  
    方法声明;  
}

步骤2:对象的创建

image-20220319213201568

  • 创建对象,使用关键字:new

  • 创建对象语法:

//方式1:给创建的对象命名  
//把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了  
类名 对象名 = new 类名();  
​  
//方式2:  
new 类名()//也称为匿名对象
  • 举例:
class PersonTest{  
    public static void main(String[] args){  
        //创建Person类的对象  
        Person per = new Person();  
        //创建Dog类的对象  
        Dog dog = new Dog();  
    }  
}

步骤3:对象调用属性或方法

  • 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。

  • 使用"对象名.属性" 或 "对象名.方法"的方式访问对象成员(包括属性和方法)

举例1:

//声明Animal类  
public class Animal { //动物类  
    public int legs;  
​  
    public void eat() {  
        System.out.println("Eating.");  
    }  
​  
    public void move() {  
        System.out.println("Move.");  
    }  
}

//声明测试类  
public class AnimalTest {  
    public static void main(String args[]) {  
        //创建对象  
        Animal xb = new Animal();  
        xb.legs = 4;//访问属性  
        System.out.println(xb.legs);  
        xb.eat();//访问方法  
        xb.move();//访问方法  
    }  
}

图示理解:image-20220319213753668

1.4 匿名对象 (anonymous object)

  • 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
    • 如:new Person().shout();
  • 使用情况
    • 如果一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
    • 我们经常将匿名对象作为实参传递给一个方法调用。

2. 对象的内存解析

2.1 JVM内存结构划分

HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。

JVM架构-简图

其中:

堆(Heap):此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

栈(Stack):是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。

方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.2 对象内存解析

举例:

class Person { //类:人  
    String name;  
    int age;  
    boolean isMale;  
}  
​  
public class PersonTest { //测试类  
    public static void main(String[] args) {  
        Person p1 = new Person();  
        p1.name = "赵同学";  
        p1.age = 20;  
        p1.isMale = true;  
​  
        Person p2 = new Person();  
        p2.age = 10;  
​  
        Person p3 = p1;  
        p3.name = "郭同学";  
    }  
}

内存解析图:

image-20220319215723183

说明:

  • 堆:凡是new出来的结构(对象、数组)都放在堆空间中。

  • 对象的属性存放在堆空间中。

  • 创建一个类的多个对象(比如p1、p2),则每个对象都拥有当前类的一套"副本"(即属性)。当通过一个对象修改其属性时,不会影响其它对象此属性的值。

  • 当声明一个新的变量使用现有的对象进行赋值时(比如p3 = p1),此时并没有在堆空间中创建新的对象。而是两个变量共同指向了堆空间中同一个对象。当通过一个对象修改属性时,会影响另外一个对象对此属性的调用。

3. 类的成员之一:成员变量(field)

3.1 如何声明成员变量

  • 语法格式:
[修饰符1] class 类名{  
    [修饰符2] 数据类型 成员变量名 [= 初始化值];   
}
  • 说明:
    • 位置要求:必须在类中,方法外
    • 修饰符2(暂不考虑)
      • 常用的权限修饰符有:private、缺省、protected、public
      • 其他修饰符:static、final
    • 数据类型
      • 任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
    • 成员变量名
      • 属于标识符,符合命名规则和规范即可。
    • 初始化值
      • 根据情况,可以显式赋值;也可以不赋值,使用默认值

3.2 成员变量 vs 局部变量

1、变量的分类:成员变量与局部变量

  • 在方法体外,类体内声明的变量称为成员变量。

  • 在方法体内部等位置声明的变量称为局部变量。
    image-20220511101608038

image-20220319230744617

其中,static可以将成员变量分为两大类,静态变量和非静态变量。其中静态变量又称为类变量,非静态变量又称为实例变量或者属性。接下来先学习实例变量。

2、成员变量 与 局部变量 的对比

  • 相同点

    • 变量声明的格式相同: 数据类型 变量名 = 初始化值
    • 变量必须先声明、后初始化、再使用。
    • 变量都有其对应的作用域。只在其作用域内是有效的
  • 不同点

    • 1、声明位置和方式

      • (1)实例变量:在类中方法外
      • (2)局部变量:在方法体{}中或方法的形参列表、代码块中
    • 2、在内存中存储的位置不同

      • (1)实例变量:堆
      • (2)局部变量:栈
    • 3、生命周期

      • (1)实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。
      • (2)局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
    • 4、作用域

      • (1)实例变量:通过对象就可以使用,本类中直接调用,其他类中“对象.实例变量”
      • (2)局部变量:出了作用域就不能使用
    • 5、修饰符(后面来讲)

      • (1)实例变量:public,protected,private,final,volatile,transient等
      • (2)局部变量:final
    • 6、默认值

      • (1)实例变量:有默认值
      • (2)局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。

3、对象属性的默认初始化赋值

当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。

image-20220319231821747

4、举例

class Person {//人类  
    //1.属性  
    String name;//姓名  
    int age = 1;//年龄  
    boolean isMale;//是否是男性  
​  
    public void show(String nation) {  
        //nation:局部变量  
        String color;//color:局部变量  
        color = "yellow";  
    }  
}  
​  
//测试类  
class PersonTest {  
    public static void main(String[] args) {  
        Person p = new Person();  
        p.show("CHN");  
    }  
}

image-20220319231703240

Java基础

Arrays工具类的使用

2025-8-8 10:26:55

Java基础

构造方法

2025-8-8 14:59:17

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索