类,实例,引用,对象
对象与实例:
面向对象编程 (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 对象的实例。
对象和实例有什么区别?
对象是一个连续的内存块,用于存储将此对象与其他对象区分开来的实际信息,而实例是对对象的引用。 它是一块内存,指向存储对象的起始地址。两个实例可能引用同一个对象。对象和实例的生命周期是不相关的。 因此,实例可能为空。一旦指向一个对象的所有实例都被删除,该对象将被销毁。
![](/assets/blank.gif)
代码如下
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);
// }}
}
类,实例,引用,对象相关推荐
- 类、类实例、对象实例
类:与类型等价.是内存中的一个结构 类对象:isa.对类本体的引用. 实例对象:数据. 类具有双重属性: 既是类型结构,也是对象. 这个一个哲学的问题. 涉及到等价性与不完备对象.
- 《JavaSE-第七章》之抽象的类-实例的对象-合理的封装
前言 之前我们所写的代码几乎都是在main方法里面,我们也操作了一些对象如String,Math等.但是将大量的代码写入main里面不是面向对象编程的做法,接下来我们将脱离面向过程,走向面向对象,慢慢 ...
- Effective Java之通过接口引用对象(五十二)
List< ? > list= new ArrayList< ? > Map< ?,? > map = new HashMap< ?,? > 这样使用接 ...
- java实例和对象对象的区别_java中实例与对象的区别和联系
对象是抽象的说法,你可以把它看作一个符合它自身定义的所有实例的代表,而实例则是对象的现实体现. 你可以说一个实例是一个对象,但你不能说一个对象是一个实例.因为定义对象时只是把自身的规则和逻辑定义好,实 ...
- 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )
文章目录 一. 内存中最大的对象 二. 查看每个类的对象实例的个数 三. 查看对象的引用与被引用 四. 查看对象到 GC Roots 的最短距离 1. 选择 Merge Shortest Paths ...
- C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...
- 【一个实体对象不能由多个 IEntityChangeTracker 实例引用】原因及解决方法
转自firechun 使用ADO实体框架(EF)对建立了关系的表新增记录时出现"一个实体对象不能由多个 IEntityChangeTracker 实例引用"错误,网上反复搜索后,没 ...
- 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)
27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...
- 比较默认对象和默认约束的异同_UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)...
官方介绍https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Objects The UCLASS macro give ...
- 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys
目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...
最新文章
- RabbitMQ超详细安装教程(Linux)
- 深度学习对抗样本的八个误解与事实
- Win7+Ubuntu双系统启动项修复总结
- fp-tree算法matlab实现,现代设计优化算法MATLAB实现
- kafka常用的shell命令
- python怎么用gamma函数_如何通俗的理解伽马(gamma)函数
- Java 针对每个人安装的位置不同的情况 从快捷方式中获取到安装位置 运行谷歌浏览器
- JZOJ1728. Antimonotonicity
- 你的网名OUT了吗?盘点那些曾经超in的网名
- 如何提高学生线上学习率的有效方法——以高一数学基础模块复习教学为例
- 开博第一篇,为什么要开通博客,开通博客的申请理由
- 七剑下天山,独领自动化测试技术
- 崛起的云平台,彰显信息国产化的中国力量
- 信号傅里叶变换后的实数和虚数部分理解
- 短链接的生成之工具类的编写--三种方式(亲测可用)
- jekenis+tomcat部署更新war失败【踩坑日记】
- 国产CI/CD工具Commander
- linux中出现不在 sudoers 文件中。此事将被报告的解决方法
- 专业专注、以客户为中心-是我们的服务理念
- 北外《战略管理》知识点分解