JAVA 类与对象简单介绍

文章目录

一、前言

二、类的定义

三、对象的创建与使用

四、对象的引用传递


写文章-CSDN创作中心icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/134896806

一、前言

在面向对象中,为了做到让程序对事物的描述与事物在现实中的形态保持一致,面向对象思想中提出了两个概念,即类和对象。在Java 程序中类和对象是最基本、最重要的单元。类表示某类群体的一些基本特征抽象,对象表示一个个具体的事物。

例如,在现实生活中,学生可以表示为一个类,而一名具体的学生,就可以称为对象。这名具体的学生会有自己的姓名和年龄等信息,这些信息在面向对象的概念中称为属性;学生可以看书和打篮球,而看书和打篮球这些行为在类中就称为方法。

类与对象的关系如图下图所示。

在图中,学生可以看作是一个类,小明、李华、大军都是学生类型的对象。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。对象是根据类创建的,一个类可以对应多个对象。 

二、类的定义

在面向对象的思想中最核心的就是对象,而创建对象的前提是需要定义一个类,类是Java 中一个重要的引用数据类型,也是组成 Java 程序的基本要素,所有的Java程序都是基于类的。

类是对象的抽象,用于描述一组对象的共同特征和行为。类中可以定义成员变量和成员方法,其中,成员变量用于描述对象的特征,成员变量也被称为对象的属性;成员方法用于描述对象的行为,可简称为方法。

类的定义格式如下:

class 类名{
    成员变量;
    成员方法;
}

根据上述格式定义一个学生类,成员变量包括姓名(name )、年龄(age)、性别(sex);成员方法包括
读书read()。学生类定义的示例代码如下:

class Student {
    String name;            //定义String类型的变量name
    int age;            //定义int类型的变量age
    String sex;        //定义String类型的变量sex
    //定义 read() 方法
    void read(){
        System.out.println("大家好!,我是"+name+",我在看书!");
    } 
}

上述代码中定义了一个学生类。其中,Student 是类名,name、age、sex 是成员变量,read ()是成员方法。在成员方法 read()中可以直接访问成员变量 name。 

温馨小提示:局部变量与成员变量的不同

在Java 中,定义在类中的变量称为成员变量,定义在方法中的变量称为局部变量。如果在某一个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时,在方法中通过变量名访问到的是局部变量,而并非成员变量。

示例代码如下:

    class Student{
        int age = 30;           //类中定义的变量称为成员变量
        void read(){
            int age = 50;       //方法内部定义的变量称为局部变量
            System.out.println("大家好!,我"+age+"岁了,我在看书!");
        }
    }

上述代码中,在 Student 类的read()方法中有一条打印语句,访问了变量age,此时访问的是局部变量age,也就是说当有另外一个程序调用 read()方法时,输出的age值为50,而不是30。

三、对象的创建与使用

在前面我们定义了一个 Shudent类,要想使用一个类则必须要有对象。在Java 程序中可以使用 new关键字创建对象,具体格式如下:

类名 对象名称 = null;
对象名称 = new 类名();


//上述格式中,创建对象分为声明对象和实例化对象两步,也可以直接通过下面的方式创建对象
类名 对象名称 = new 类名();


//例如,创建 Student类的实例对象,示例代码如下:
Student stu = new Student();

上述代码中,new Shudent()用于创建Shudent类的一个实例对象,Sudent stu 则是声明了一个 Shudent 类型的变量stu。运算符 “=” 将新创建的 Sudent 对象地址赋值给变量stu,变量stu引用的对象简称为stu对象。

了解了对象的创建之后,就可以使用类创建对象了,示例代码如下:

class Student{
      String name;          //声明姓名属性
      void read(){
          System.out.println("大家好!,我是"+name+",我在看书!");
      }
}

public class Test{
    public static void main(String[] args){
        Student stu = new Student();        //创建并实例化对象
      }
}

上述代码在 main() 方法中实例化了一个Sudent 对象,对象名称为stu。使用new关键字创建的对象在堆内存分配空间。stu对象的内存分配如图下图所示。

从图中可以看出,对象名称stu 保存在栈内存中,而对象的属性信息则保存在对应的堆内存中。创建Student对象后,可以使用对象访问类中的某个属性或方法,对象属性和方法的访问通过 “.” 运算符实现,格式如下:

对象名称.属性名
对象名称.方法名

 下面通过一个案例认识对象属性和方法的访问。

class Student{
    String name;         //声明姓名属性
    void read(){
        System.out.println("大家好,我是"+name);
    }
}

class Example01{
    public static void main(String[] args) {
        Student stu1 = new Student();       //创建第一个 Student 对象
        Student stu2 = new Student();       //创建第二个 Student 对象
        stu1.name = "小明";                  //为stu1对象的name 属性赋值
        stu1.read();                        //调用对象的方法
        stu2.name = "小刚";
        stu2.read();
    }
}

 程序运行结果如下图所示

在上面的代码中,第2~5行代码声明了一个 String类型的 name 属性和一个read()方法,第9~10行代码创建了stul 对象和 stu2对象;

第11行代码为 stul 对象 name 属性赋值;第12行代码通过 stul 对象调用 read()方法; 第13行代码为 stu2 对象name属性赋值;

第14行代码通过stu2对象调用 read()方法。

从运行图所示的运行结果可以看出,stu1 对象和stu2对象在调用 read()方法时,打印的name 值不相同。这是因为 stul 对象和 stu2 对象是两个完全独立的个体,它们分别拥有各自的name属性,对stul 对象的name 属性赋值并不会影响到 stu2 对象 name 属性的值。为stul 对象和 stu2 对象中的属性赋值后,stu1对象和stu2对象的内存变化如下面所示。

从图中可以看出,程序分别实例化了两个Student 对象 stul 和su2,分别指向其各自的堆内存空间。

四、对象的引用传递

类属于引用数据类型,引用数据类型就是指内存空间可以同时被多个栈内存引用。下面通过一个案例为大家详细讲解对象的引用传递,如下所示。

public class Student {
    String name;         //声明姓名属性
    int age;             //声明年龄属性
    void read(){
        System.out.println("大家好,我是"+name+",年龄"+age);
    }
}


public class Example02 {
    public static void main(String[] args) {
        Student stu1 = new Student();       //声明stu1 对象并实例化
        Student stu2 = null;               //声明stu2对象,但不对其进行实例化
        stu2 = stu1;                       //stu1给Stu2分配空间使用权
        stu1.name = "小明";                 //为stu1对象的name属性赋值
        stu1.age = 20;
        stu2.age = 50;
        stu1.read();                       //调用对象的方法
        stu2.read();
    }
}

程序运行结果如下所示。

在上面的代码中,第2~3行代码分别声明了一个 String类型的 name 属性和一个int类型的age属性;第4~6行代码定义了一个 read()方法。

第10行代码声明 stul 对象并实例化;第11行代码声明stu2 对象,但不对其进行实例化。第12行代码把 stul 对象的堆内存空间使用权分配给 stu2。

第13~14行代码为 stul 对象的name 属性和age 属性赋值;第15行代码为 stu2 对象的age 属性赋值;第16~17行代码分别使用 stul 对象和stu2 对象调用read()方法。

从程序运行图中可以发现,两个对象输出的内容是一样的,这是因为 shu2 对象获得了 stul 对象的堆内存空间的使用权。在代码中,第14行代码对 stu1 对象的age属性赋值之后,第15行代码通过stu2 对象对age 属性值进行了修改。

实际上,所谓的引用传递,就是将一个堆内存空间的使用权给多个栈内存空间使用。每个栈内存空间都可以修改堆内存空间的内容,上面代码对象引用传递的内存分配如图下图所示。

 

从图中可以发现堆内存、栈内存空间的变化,在程序的最后,stu2 对象将 age的值修改为50,因此最终结果stul的 age 属性值是50。

温馨小提示:一个栈内存空间只能指向一个堆内存空间,如果想要再指向其他堆内存空间,就必须先断开已有的指向后才能再分配新的指向。

本文就暂时讲到这里了,接下来的内容会在后续的文章中给大家继续分享。

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值