您的位置  > 互联网

关于Java中关于对象和实例的概念,你了解多少?

阅读时间:5分钟

面向对象思想:对象、实例和实例化(Java表达)

面向对象编程(-)以对象为程序的核心,可以实现多态性、代码可重用性等,是一种哲学思想,可以帮助开发人员开发出健壮、优秀的程序。

Java 是一种很好支持面向对象特性的语言。 可以说,它几乎是“面向对象”的。 因此,详细理解面向对象的含义和特点对于Java开发人员来说极其重要。 本文将介绍Java中对象和实例的概念。

在查阅一些资料时,我对“对象实例化”等概念感到困惑。 本文还将区分几个不同的概念。

等级等级

类是一个抽象的概念,就像它的名字一样。 当你看到“类”时,你应该有“一种东西”的感觉。 事实上,在设计中,类代表某种类型的事物,或者说它是某些对象或项的抽象。 比如,人类是一个“范畴”,植物也是一个“范畴”,液体也是一个“范畴”。 它们都是抽象名词,不是具体的事物,而是一类事物的逻辑抽象。

这和分类类似,事实上分类对于理解类的概念很重要! 对于每个实际对象,我们可以想到它所属的类型,然后将其分配给它。 假设有人创造了世界上独一无二的突变蟑螂。 虽然只有一种,但它还是有自己的一类,即“变异蟑螂类”(以发明者的名字命名)。

那么为什么这种东西可以被抽象呢? 这是因为这些事物都有某些共同的特征。 人类都是高级灵长类动物,有两只眼睛、两只手、发达的大脑等等,这些都是人类的特征,我们称之为“阶级属性”。 它们还可以做一些事情,人们可以奔跑、制造和使用某些东西、说一句话等等,这些都是人类的行为,我们称之为“阶级行为”。

在面向对象编程中,我们将类的属性称为“Field”(域、字段或成员变量),将类的行为称为“”(类的方法,在某些语言中可能称为函数)。 要在程序中定义类,您需要指定类的名称、它具有的属性和方法(它是什么以及它可以做什么)。

// 为了便于讲述,下面的程序省略了很多细节
// 如:修饰符,构造器等
class MyClass {
    // 这里定义了类的域
    int a_number;
    int b_number;
    
    // 这里定义了类的方法
    void give_number(int a_num, int b_num) {
        a_number = a;
        b_number = b;
    }
    void do_something() {
        //do something here!
    }
    
}

定义了类之后,你的程序就可以像使用int一样使用它:可以定义一个int变量,也可以创建一个变量,应该说是该类的一个对象。

目的

(),按照本义,其实应该翻译为“事物”,它专指那些存在的事物。 对象对应于类。 例如,约翰是人,汤姆是猫,计算机是电子产品,拖鞋是服装。 如果我们要创建一个属于某个类的对象,那么这个对象就是一个类(废话)。

在Java中创建类的对象,需要使用new关键字。 当JVM遇到new时,会执行类加载、空间分配、自动域初始化等一系列过程。 这里我们只需要知道new就相当于在你的程序世界中释放了一个空间。 在这个空间里,恰到好处。 在空间中创建某种类型的物体。

// 不讨论使用反射、代理、反序列化等一系列创造对象的技术
// 我们用最一般,最正常的方式

// new了一个MyClass类的对象并让它调用方法做一些行为
new MyClass().do_something();
// new了一个MyClass类的对象
// 并用MyClass类型的变量myClass代表这个对象
// 然后通过myClass变量调用方法做一些行为
MyClass myClass = new MyClass();
myClass.do_something();

前面说过,类实际上可以看作是一个分类。 出现“子类”现象是很自然的。 子类有一个父类(子类-父类,派生类-超类)。 有一系列名称代表相同的含义)属性,例如人类必须具有动物的属性,并且可以执行相同的行为(取决于你是否可以做到)。 注意不要将某人与鱼进行比较,因为鱼也是动物的一个子类别。 鱼不代表动物。 它和人类是动物的两个分支。 这里的动物具有所有动物都具有的属性,例如知道自己做,详细信息请参阅分类学。

面向对象编程中也有一个类似的概念,那就是继承。 子类将继承父类的所有字段和方法。

class YourClass extends MyClass{
    int c_number;
    
    void give_c(int num) {
        c_number = num;
    }
}

现在继承了,它的效果如下所示(只是为了说明它也有这些字段和方法,实际上根本没有!)

class YourClass extends MyClass{
    int a_number;
    int b_number;
    int c_number;
    
    void give_c(int num) {
        c_number = num;
    }
    void give_number(int a_num, int b_num) {
        a_number = a;
        b_number = b;
    }
    void do_something() {
        //do something here!
    }
}

实例和实例化

我在网上看了一些中文文章,发现了一些奇怪的词语,比如“对象实例化”这个词,并引起了一些误解。 在这里我将详细介绍它们。

这只是一个例子的意思。 这里翻译成例子并没有什么问题。 它适用于物体,例如人类。 假设你正在向外星人介绍人类,他们要求你举个例子。 你说张三就是一个例子! 现在换个名词,那就是张三是人类的例子! 而通过对象和类的概念,我们可以知道张三也是人类的一个对象! 因此,某个类的实例就是该类的一个对象,因此创建某个类的对象的过程就被称为创建该类的实例。 其实他们有一个很重要的区别,看下个小标题!

MyClass myClass2 = new MyClass();
YourClass yourClass2 = new YourClass();

上面的代码可以说是创建了这两个类的对象,也可以说是实例化了这两个类,所以准确来说,应该叫“类实例化”,而不是“对象实例化”。

实例和对象之间的重要区别

在我们的表达中,对象这个词是非常严格的,它和类有着严格的对应关系。 张三是人的对象是绝对的,对象是类的对象也是绝对的,对象是类。 对象,没有其他关系。

ETC? ! 类是类的子类,那么为什么它不能是类的对象(这里可能有点混乱,注意对象和类这两个词)?

由于遗传,他们的差异变得明显。

您应该知道,对象关系比实例关系更严格。 使用哪个类将创建哪个类的对象。 这是一种严格的“是”、“一一对应”的关系。

而,就像它的意思“例子”一样,包容性要大得多。 注意这张图!

在这张图中,我们将丁香和迎春花视为两个特定的物体(实际上并非如此,只是假设这两种花存在于你的面前)。 丁香是丁香属的对象,茉莉花是茉莉属的对象。 。 如果我让你分别举出丁香花和茉莉花的例子,你一定会毫不犹豫地说出丁香花和迎春花。 但现在,如果我让你举一个木犀科的例子,是的,紫丁香和迎春花就是木犀科的例子! 就像我让你举一个动物的例子,你会说一个叫张三的人,一个叫李四的乌龟,一个叫吴的河豚等等,不管是什么,反正都是动物!

事实上,实例和对象的区别就是“实例的分类”和“实际对应”的区别。

在Java中,我们实际上可以用下面的代码来反映这一点

// 先实例化两个类的两个对象
MyClass myClass3 = new MyClass();
YourClass yourClass3 = new YourClass();
boolean a = myClass3.getClass() == yourClass3.getClass();
boolean b = myClass3 instanceOf MyClass;
boolean c = myClass3 instanceOf YourClass;
boolean d = yourClass3 instanceOf YourClass;
boolean e = yourClass3 instanceOf MyClass;
// a, b, c, d, e 的值分别为
// false, true, false, true, true

因为类是类的子类,就像上面的分类例子一样,这个对象既是类的实例,又是类的实例,但永远只是类的对象。

超过。