C#中对象和类的区别是什么?

14

我有几个问题:

  1. 每个类的实例(抽象类除外)都是对象吗?
  2. 由于无法实例化抽象类,因此它们不是对象?

有人可以帮我更好地理解上述概念与C#的关系吗?

可能重复:
对象和实例的区别


  1. 是的(鉴于#2),和2. 是的。一个曲线球是静态类,它们基本上是进程生命周期内的单个对象。
- M.Babcock
将抽象类视为等同于接口有助于理解。它们只是可以提供默认实现的接口。 - Cody Gray
相关:https://dev59.com/QXA75IYBdhLWcg3wYYBQ和https://dev59.com/qHA65IYBdhLWcg3wrgsa - Cody Gray
相关帖子 - http://careerbaba.in/2014/03/oops-interview-questions-and-answers-part-one/ - Yasser Shaikh
6个回答

27
  1. 对象是类的一个实例。

  2. 类是对象的定义。只有在实例化后,它才变成一个对象。由于抽象类无法实例化,因此不能创建该类型的任何对象。需要定义子类才能创建对象。


那么这是否意味着对象和类的实例是相同的? - Aladdin

12
  1. 是的, 每个类的实例都是一个对象。

  2. 类(无论是抽象还是非抽象)都不是对象。它们是类型。


即使抽象类可以被实例化,它们仍然不是对象。 - David Schwartz
需要注意的是,在某些编程语言中,类也是对象。 - marco-fiset
@marco-fiset 这是关于C#语言的问题,不确定其他编程语言如何相关。 - jdmdevdotnet

11

有一个通用的比喻可以更清楚地展示类和对象的概念区别。

类就像食谱,而对象则是蛋糕。通过一个食谱我们可以做出许多个蛋糕。食谱只能提供提示(即抽象),为你自己创造的食谱(即实现类)留下一些空间,然后你可以从这些食谱中制作出蛋糕(即对象)。

因此,类不是对象,它描述了该类对象的外观。抽象类包含对实现派生自此抽象类的类有用的方法和其他信息。无法从抽象类创建/实例化对象(因为其定义不完整)。


7
class Cat {} // It is a cat. Just a cat. Class is a general issue.

myCat = new Cat("red", "5kg", "likes milk", "3 years old"); // It is my cat. It is an object. It is really a cat. 

yourCat = new Cat("gary", "3kg", "likes a meal", "5 years old"); // It is your cat. Another cat. Not my cat. It is really a cat too. It is an object;

abstract class Animal {} // Abstract class
animal = new Animal(); // It is not correct. What is 'animal'? Cat, dog, cow? I don't know.

class Dog : Animal {} // It is a class. It is a dog in general. 
someDog = new Dog("brown", "10 kg", "likes cats"); // It is really a dog. It is an object.

2

抽象类不能被实例化(因此也不能成为一个对象)。如果您创建了从抽象基类继承的类,并对其进行实例化,它将具有抽象类的属性以及自己的属性。创建抽象基类的目的是“强制”派生类实现某些功能(类似于接口,但不完全相同)。


换句话说,接口不能任何实现的方法,而只是一个接口。 - Gravity

2

每个类的实例(抽象类除外)都是一个对象?

是的。这就是“实例”的定义。

抽象类不能被实例化,因此它们不是对象?

类不同于实例或对象。对象是类的一个实例。想象一下动物园模拟。对象就像是一个特定的狮子,而类更像是对狮子的描述。抽象类是描述那些过于模糊,仅凭描述无法合理构建的事物(例如“动物”)。这就是为什么你无法实例化它们的原因。像动物这样的东西可能过于模糊,程序无法直接请求;相反,程序只会请求更具体的东西,如狮子、老虎或猫鼬。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接