我知道Java类提供了对象的蓝图
我也知道所有类都继承自Object
类。
考虑到这些事实 Java类仍然被认为是对象本身吗?
我搜索了很多资源,但仍然感到困惑。许多参考文献都会说 Java中的所有东西(除了原语)都是对象,包括类和你的类文件......比如这里:
http://howtoprogramwithjava.com/podcast-episode-10-objects-and-static-keyword
我搜索了StackExchange并且this问题有所帮助,但没有完全回答我的具体问题。
答案 0 :(得分:11)
在某种意义上,类本身不是对象,因为没有直接用于执行类的运行时对象。存在其他对象,但是它们是类的表示,并且在内存中强制转换它们的更改不会改变该类的字节码的执行。但是,每个类都有一个与之关联的Class
对象,允许通过反射与该类,其实例和成员进行交互。
这个类实际上是通用的,因为FooClass.class实际上是java.lang.Class<FooClass>
,它可以帮助传递一个Class对象的泛型,可以在运行时解析泛型返回类型和约束。
答案 1 :(得分:5)
从概念上讲,类是对状态和行为的描述。对象(实例)是包含该状态和行为的数据结构。
例如,给定一个类
class User {
String name;
void setName(String name) {
this.name = name
}
}
班级User
有行为和状态,即。它有一个名为Field
的{{1}}和一个名为name
的{{1}}。以上描述了这种行为。如果您创建实例
Method
您现在拥有一个包含实际状态和展示行为的数据结构。
在Java中,您拥有所谓的Reflection,它基本上描述了类的元数据,其状态和行为。这被分别解释为setName
,User user = new User();
user.setName("Jon");
和Class
类的实例。
在上面的例子中,由于字段Field
本身具有状态和行为(它有一个名称(“name”),我们可以读取它或写入它),有一个类必须描述它。描述该状态和行为的类是Method
,name
的实例包含状态和行为。
同样,Field
类描述了一种方法。方法有一个状态,其名称为ex。 Field
,它所接受的论据,例如。一个Method
。它也有行为,例如。它返回void(不返回任何内容)。
最后,您有一个类setName
,它描述了类的状态和行为。 String
的实例描述了类的状态和行为。例如,Class
类的Class
实例将有一个Class
对象和一个User
对象(它实际上有更多,但请耐心等待)。字段和方法是类的状态。例如,行为是creating an instance of the class。
答案 2 :(得分:2)
编辑: 在调用时,类也是的对象。否则它们是引用类型。
对于每个类定义,类加载器调用java.lang.Class的实例,并将这些特殊的类对象存储在JVM内存的PermGen空间中。
有关详细信息,请参阅here。
答案 3 :(得分:1)
考虑到这些事实,Java类仍然被认为是 对象本身?
不,你不能说java类/类型作为对象/实例
对象/类的对象意味着在Heap上的内存分配(其中内存依赖于在类中定义的成员变量)。当您使用new
关键字调用类型/类构造函数时,确实会发生这种情况。
但是当类java.lang.Class将类加载到JVM时,会有一个类/类Class(ClassLoader)关联或创建的对象。此Class对象有助于JVM跟踪在JVM中运行的类,并在同步时获取静态方法上的LOCK。另一方面,对于程序员来说,类的Class对象在很多方面都很有用。
例如:REFLECTION。(java.lang.reflect)...
至于Object(java.lang.Object)只是所有类的超类,它不会使类成为对象/实例。但是如果有一个名为A的类,我们知道它本质上是java.lang.Object的子类,现在任何类A的对象/实例都具有类A和java.lang.Object的属性。
底线:JVM中的每个操作都将在面向对象原则(OOP)的影响下发生,因此除了原语之外,“Everything is Objects”也是如此。为了证明如果有一个类加载到没有new
关键字的JVM中,它也会有一个java.lang.Class对象/实例与之关联。
答案 4 :(得分:0)
类和对象是不同的。但是一个对象是一个类的实例。
该类用于声明适当的程序和程序。
然后根据类创建对象。
示例:您有一个动物类和一个狗对象
答案 5 :(得分:0)
这应该更好地解释它;这个例子简单地说, Car是一个类。但我们可以拥有许多汽车,具体取决于他们的功能/属性。 对象帮助我们定义那些。所以类不是对象。来自Oracle Docs. (将自行车替换为汽车,因为我们都与它有关并且更好地理解。)
在现实世界中,你经常会发现许多单独的物体 同样的。可能存在数千种其他自行车, 所有相同的品牌和型号。每辆自行车都是用同样的车建造的 一组蓝图,因此包含相同的组件。在 面向对象的术语,我们说你的自行车是一个实例 一类被称为自行车的物体。一个类是蓝图 创建了哪些单个对象。
以下Car类是自行车的一种可能实现方式:
class Car{
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}