对象与实例:

面向对象编程 (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;}@Overridepublic void eat() {System.out.println(this.name + "\t吃东西……");}@Overridepublic 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;}@Overridepublic void eat() {super.eat();}@Overridepublic void breath() {super.breath();}@Overridepublic 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);}@Overridepublic 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() {@Overridepublic void eat() {}@Overridepublic 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);
//        }}
}

类,实例,引用,对象相关推荐

  1. 类、类实例、对象实例

    类:与类型等价.是内存中的一个结构 类对象:isa.对类本体的引用. 实例对象:数据. 类具有双重属性: 既是类型结构,也是对象. 这个一个哲学的问题. 涉及到等价性与不完备对象.

  2. 《JavaSE-第七章》之抽象的类-实例的对象-合理的封装

    前言 之前我们所写的代码几乎都是在main方法里面,我们也操作了一些对象如String,Math等.但是将大量的代码写入main里面不是面向对象编程的做法,接下来我们将脱离面向过程,走向面向对象,慢慢 ...

  3. Effective Java之通过接口引用对象(五十二)

    List< ? > list= new ArrayList< ? > Map< ?,? > map = new HashMap< ?,? > 这样使用接 ...

  4. java实例和对象对象的区别_java中实例与对象的区别和联系

    对象是抽象的说法,你可以把它看作一个符合它自身定义的所有实例的代表,而实例则是对象的现实体现. 你可以说一个实例是一个对象,但你不能说一个对象是一个实例.因为定义对象时只是把自身的规则和逻辑定义好,实 ...

  5. 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )

    文章目录 一. 内存中最大的对象 二. 查看每个类的对象实例的个数 三. 查看对象的引用与被引用 四. 查看对象到 GC Roots 的最短距离 1. 选择 Merge Shortest Paths ...

  6. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  7. 【一个实体对象不能由多个 IEntityChangeTracker 实例引用】原因及解决方法

    转自firechun 使用ADO实体框架(EF)对建立了关系的表新增记录时出现"一个实体对象不能由多个 IEntityChangeTracker 实例引用"错误,网上反复搜索后,没 ...

  8. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  9. 比较默认对象和默认约束的异同_UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)...

    官方介绍https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Objects The UCLASS macro give ...

  10. 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys

    目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...

最新文章

  1. RabbitMQ超详细安装教程(Linux)
  2. 深度学习对抗样本的八个误解与事实
  3. Win7+Ubuntu双系统启动项修复总结
  4. fp-tree算法matlab实现,现代设计优化算法MATLAB实现
  5. kafka常用的shell命令
  6. python怎么用gamma函数_如何通俗的理解伽马(gamma)函数
  7. Java 针对每个人安装的位置不同的情况 从快捷方式中获取到安装位置 运行谷歌浏览器
  8. JZOJ1728. Antimonotonicity
  9. 你的网名OUT了吗?盘点那些曾经超in的网名
  10. 如何提高学生线上学习率的有效方法——以高一数学基础模块复习教学为例
  11. 开博第一篇,为什么要开通博客,开通博客的申请理由
  12. 七剑下天山,独领自动化测试技术
  13. 崛起的云平台,彰显信息国产化的中国力量
  14. 信号傅里叶变换后的实数和虚数部分理解
  15. 短链接的生成之工具类的编写--三种方式(亲测可用)
  16. jekenis+tomcat部署更新war失败【踩坑日记】
  17. 国产CI/CD工具Commander
  18. linux中出现不在 sudoers 文件中。此事将被报告的解决方法
  19. 专业专注、以客户为中心-是我们的服务理念
  20. 北外《战略管理》知识点分解

热门文章

  1. 互联网金融十大生意模式
  2. Python爬虫ExcelTableau可视化数据分析
  3. Win10 快速启动对驱动的影响
  4. android 环信消息撤回
  5. 天刀服务器的位置2018,江湖前沿 2018天刀版本爆料分析
  6. 【pandas-汇总3】DataFrame常用属性、函数以及索引方式
  7. 从你选的颜色可以反映出你的性格和心理状态!
  8. JeeSite 4.x 消息管理、消息推送、消息提醒
  9. 六种用于文本分类的开源预训练模型
  10. L-Edit 标尺使用方法