类,实例,引用,对象

对象与实例:

面向对象编程 (OOP) 是最流行的编程范例之一。 在 OOP 中,重点是根据现实世界的元素来思考要解决的问题,并根据对象及其行为来表示问题。 许多支持 OOP 关键方面的编程语言(称为 OOP 语言)都将类作为主要的编程工具。它们被称为基于类的。类是现实世界对象的抽象表示。 类具有称为属性的属性。属性被实现为全局变量和实例变量。类中的方法表示或定义这些类的行为。类的方法和属性称为类的成员。 用非常简单的术语来说,类是特定现实生活对象的蓝图或模板。所以,对象是用于根据此蓝图存储必要信息的内存块。实例是引用对象的内存块。

什么是类?

类是对象的蓝图。当你编写一个类时,您是在描述 JVM 应该如何创建该类型的对象(结构,房屋设计的蓝图就像一个类描述)。

什么是对象?

对象是实例化类的结果。 实例化是获取蓝图并定义每个属性和行为的过程,以便生成的对象实际上代表现实生活中的对象。 对象是分配给存储变量,方法或函数等信息的专用且连续的内存块。在Java编程语言中,对象是使用new运算符创建的。 例如,如果有一个名为 Person 的类,则可以使用以下方法创建 Person 类的对象。new Person(); 此处,一个 Person 对象由 new 运算符创建,并返回对该对象的引用。new 运算符与 Person 类的构造函数一起用于创建新对象。 对象的生命周期从调用它的构造函数开始到它被销毁为止。 一旦一个对象没有被引用,它就会被垃圾收集器删除/销毁。

什么是实例?

实例是一个内存块,其中包含对对象的引用。也就是说,Instance会保留对象所在的起始内存块的地址。 实际上,实例的名称可以用来访问对象内存区域的开始。起始内存的偏移量由运行时引擎计算,以便我们可以转到存储单个数据或方法引用的位置。 以下 Java 代码片段可用于创建 Person 对象的实例。Person myPerson = new Person(); 如上所述,new 运算符创建 Person 对象并返回对它的引用。此引用存储在 Person 类型变量 myPerson 中。所以,myPerson 是创建 Person 对象的实例。

对象和实例有什么区别?

对象是一个连续的内存块,用于存储将此对象与其他对象区分开来的实际信息,而实例是对对象的引用。 它是一块内存,指向存储对象的起始地址。两个实例可能引用同一个对象。对象和实例的生命周期是不相关的。 因此,实例可能为空。一旦指向一个对象的所有实例都被删除,该对象将被销毁。

代码如下

package org.example.helloswing.domain;

public class Animal extends Biology {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        super(name, age);
        this.name = name;
        this.age = age;
    }

}
package org.example.helloswing.domain;

public interface Behavior {

    void eat();

    void breath();

}
package org.example.helloswing.domain;

/**
 * 用生物当做抽象类,因为生物复杂多样,比如外星人,跨物种等等
 */
public abstract class Biology implements Behavior {
    private String name;
    private int age;

    public Biology() {
    }

    protected Biology(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void eat() {
        System.out.println(this.name + "\t吃东西……");
    }


    @Override
    public void breath() {
        System.out.println(this.name + "\t牛13气体……");
    }
}
package org.example.helloswing.domain;

import java.util.Objects;

public class Person extends Animal {
    private int id;
    private String name;
    private int age;

    public Person() {
        super();
    }

    public Person(int id, String name, int age) {
        super(name, age);
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public void eat() {
        super.eat();
    }

    @Override
    public void breath() {
        super.breath();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return id == person.id && age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
package org.example.helloswing;


import org.example.helloswing.domain.Behavior;
import org.example.helloswing.domain.Biology;
import org.example.helloswing.domain.Person;

import java.lang.reflect.InvocationTargetException;


public class Main {
    /**
     * 类是数据类型,你使用这种类型来创建对象(Person,结构,房屋设计的蓝图就像一个类描述)。
     * 实例是指对象的引用(p1,就是一个地址引用)。
     * 对象是物理上占用一些内存(new Person(1, "Carlos", 20),物理存储)。
     *
     * @param args
     */
    public static void main(String[] args) {
        // 对于情况 1,类 Person 有两个实例,但两个实例代表同一个对象。
        // 对象是类的实例,实例是代表对象在该类下的副本。
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);
        // 对于情况 2,类 Person 有两个实例,但每个实例代表一个不同的对象,一个对象可以有多个实例。
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
        // 所以类、对象和实例是不同的东西。
        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
        System.out.println(p4);
        // 对象方法
        p1.eat();
        p2.eat();
        p3.eat();
        p4.eat();
        // 创建一个子类的对象
        Person person1 = new Person();
        // 你不能存储一个实例,但你可以存储一个对象(数据库的记录)
        Person person2 = person1;
        System.out.println(person1);
        System.out.println(person2);
        // 检查 person1 是否是子类的实例
        System.out.println(person1 instanceof Person);
        // 检查 person1 是否是父类的实例
        System.out.println(person1 instanceof Biology);
        // 检查 person1 是否是接口的实例
        System.out.println(person1 instanceof Behavior);


        // 我们可以为抽象类和接口创建一个实例,但我们不能为它们创建一个对象。
        // org.example.helloswing.domain.Behavior是抽象的; 无法实例化
        // 但是我个人对此持有疑惑加个中括号就可以了,无构造方法
        Behavior behavior = new Behavior() {
            @Override
            public void eat() {

            }

            @Override
            public void breath() {

            }
        };
        behavior.eat();
        behavior.breath();
        System.out.println("behavior instanceof Object:\t" + (behavior instanceof Object));
        System.out.println("behavior:\t" + (behavior instanceof Behavior));
        try {
            System.out.println("behavior:\t" + Class.forName("org.example.helloswing.domain.Behavior").isInstance(behavior));
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Behavior.class.getName());


        // java: org.example.helloswing.domain.Biology是抽象的; 无法实例化
        Biology biology = new Biology() {
        };
        Biology biology1 = new Biology() {
        };
        biology.setAge(11);
        biology.setName("抽象类");
        biology.eat();
        biology.breath();
        biology1.setAge(12);
        biology1.setName("AbstractClass");
        biology1.eat();
        biology1.breath();
        System.out.println(biology);
        System.out.println(biology1);
        System.out.println("biology:\t" + (biology instanceof Biology));
        try {
            System.out.println("biology:\t" + Class.forName("org.example.helloswing.domain.Biology").isInstance(biology));
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        /**
         * 创建对象的三种方法
         */
        try {
            // 反射跳过继承,
            Class<?> aClass = Class.forName("org.example.helloswing.domain.Person");
            Person person = (Person) aClass.getDeclaredConstructor().newInstance();
            person.setName("newInstance1");
            person.eat();

            /**
             * java.lang.NoSuchMethodException: org.example.helloswing.domain.Behavior.<init>()
             */
//            Class<?> bClass = Class.forName("org.example.helloswing.domain.Behavior");
//            Behavior behavior1 = (Behavior) bClass.getDeclaredConstructor().newInstance();
//            behavior1.eat();

            /**
             * java.lang.InstantiationException
             */
//            Class<?> cClass = Class.forName("org.example.helloswing.domain.Biology");
//            Biology biology2 = (Biology) cClass.getDeclaredConstructor().newInstance();
//            biology2.eat();

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException |
                 NoSuchMethodException e) {
            throw new RuntimeException(e);
        }


//        try {
//            // java: org.example.helloswing.domain.Behavior是抽象的; 无法实例化
//            Behavior behavior3 = new Behavior();
//            // java: org.example.helloswing.domain.Biology是抽象的; 无法实例化
//            Biology biology3 = new Biology();
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }

    }
}

实例对象引用是编程中一个重要的概念,下面从概念、原理及使用方面进行介绍。 ### 概念 从广义上讲,对象是能被存储到内存中且能被引用的一个相对独立的整体,而引用变量可以指向这个对象。在Python里讲对象,一般指Python中产生的;在Java等语言中,引用变量可以指向实例化后的对象。例如在Java中,使用引用变量来操作对象,就像在定义引用变量的数据型时,使引用变量拥有中的属性方法,如`Students student;` 这里的`student`就是一个引用变量,它可以指向`Students`实例化后的对象 [^1][^3]。 ### 原理 是产生多个实例的工厂,每个实例都有自己独立的数据。当创建一个对象时,系统会在内存中为对象分配存储空间,而引用变量则存储了对象在内存中的地址,通过这个地址可以访问操作对象。例如在Java代码`Students student = new Students();` 中,`new Students()`在内存中创建了一个`Students`对象,`student`这个引用变量存储了该对象的内存地址,从而可以通过`student`来调用对象的属性方法 [^3][^4]。 ### 使用 在代码中,实例对象引用的使用主要体现在对对象属性方法的操作上。以下分别给出PythonJava的示例: #### Python示例 ```python class Students: def __init__(self): self.name = None def set_name(self, name): self.name = name def get_name(self): return self.name def study(self): print(f"{self.name} is studying.") # 创建一个实例 student = Students() # 调用set方法,给名字赋值 student.set_name("xiaoming") # 调用get方法,获取名字属性值 name = student.get_name() # 引用变量student拥有了学习的方法,调用该方法 student.study() ``` #### Java示例 ```java class Students { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public void study() { System.out.println(name + " is studying."); } } public class Main { public static void main(String[] args) { // 定义一个引用变量,它的数据型是引用数据型Students Students student; // 创建一个实例 student = new Students(); // 调用set方法,给名字赋值 student.setName("xiaoming"); // 调用get方法,获取名字属性值 String name = student.getName(); // 引用变量student拥有了学习的方法,调用该方法 student.study(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值