1如何声明一个类?如何创建类的对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1如何声明一个类?如何创建类的对象?相关的知识,希望对你有一定的参考价值。

要标准详细答案!
谢谢!

当你创建一个类时,你创建了一种新的数据类型。你可以使用这种类型来声明该种类型的对象。然而,要获得一个类的对象需要两步。第一步,你必须声明该类类型的一个变量,这个变量没有定义一个对象。实际上,它只是一个能够引用对象的简单变量。第二步,该声明要创建一个对象的实际的物理拷贝,并把对于该对象的引用赋给该变量。这是通过使用new 运算符实现的。new运算符为对象动态分配(即在运行时分配)内存空间,并返回对它的一个引用。这个引用或多或少的是new分配给对象的内存地址。然后这个引用被存储在该变量中。这样,在Java 中,所有的类对象都必须动态分配。让我们详细看一下该过程。
在前面的例子中,用下面的语句来声明一个Box类型的对象:

Box mybox = new Box();
本例将上面讲到的两步组合到了一起,可以将该语句改写为下面的形式,以便将每一步讲的更清楚:

Box mybox; // declare reference to object(声明一个类)
mybox = new Box(); // allocate a Box object (声明一个对象)

第一行声明了mybox ,把它作为对于Box类型的对象的引用。当本句执行后,mybox 包含的值为null ,表示它没有引用对象。这时任何引用mybox 的尝试都将导致一个编译错误。第二行创建了一个实际的对象,并把对于它的引用赋给mybox 。现在,你可以把mybox 作为Box的对象来使用。但实际上,mybox 仅仅保存实际的Box 对象的内存地址。这两行语句的效果如图6-1 所示。

图6-1 声明Box 类型的对象
注意:那些熟悉C/C++ 语言的读者,可能已经注意到了对象的引用看起来和指针类似。这种怀疑实质上是正确的。一个对象引用和内存指针类似。主要的差别(也就是Java安全的关键)是你不能像实际的指针那样来操作它。这样,对于对象引用,你就不能像指针那样任意分配内存地址,或像整数一样操作它。

6.2.1 深入研究new 运算符

刚才已经解释过,new运算符动态地为一个对象分配地址。它的通用格式如下:

class-var = new classname( );

其中,class-var 是所创建类类型的变量。classname 是被实例化的类的名字。类的后面跟的圆括号指定了类的构造函数。构造函数定义当创建一个类的对象时将发生什么。构造函数是所有类的重要组成部分,并有许多重要的属性。大多数类在他们自己的内部显式地定义构造函数。如果一个类没有显式的定义它自己的构造函数,那么Java 将自动地提供一个默认的构造函数。对类Box 的定义就是这种情况。现在,我们将使用默认的构造函数。不久,你将看到如何定义自己的构造函数。

这时,你可能想知道为什么对整数或字符这样的简单变量不使用new 运算符。答案是Java 的简单类型不是作为对象实现的。出于效率的考虑,它们是作为“常规”变量实现的。你将看到,对象有许多特性和属性,使Java 对对象的处理不同于简单类型。由于对处理对象和处理简单类型的开销不同,Java 能更高效地实现简单类型。后面,你将看见,对于那些需要完全对象类型的情况下,简单类型的对象版本也是可用的。

理解new运算符是在运行期间为对象分配内存的是很重要的。这样做的好处是你的程序在运行期间可以创建它所需要的内存。但是,内存是有限的,因此new有可能由于内存不足而无法给一个对象分配内存。如果出现这种情况,就会发生运行时异常(你将在第10 章学习如何处理这种异常以及其他异常情况)。对于本书中的示例程序,你不必担心内存不足的情况,但是在实际的编程中你必须考虑这种可能性。

让我们再次复习类和对象之间的区别。类创建一种新的数据类型,该种类型能被用来创建对象。也就是,类创建了一个逻辑的框架,该框架定义了它的成员之间的关系。当你声明类的对象时,你正在创造该类的实例。因此,类是一个逻辑构造,对象有物理的真实性(也就是对象占用内存空间)。弄清楚这个区别是很重要的。
参考技术A /**
* 创建类
* @author admin
*
*/
public class CreatClass

public CreatClass()




/**
* 创建类的对象
* @author admin
*
*/
public class Test1

public static void main(String[] args) throws Exception
CreatClass c=new CreatClass();


参考技术B public class TestClass//创建类
public TestClass()
System.out.println("创建类");//构造函数




public class Test
public static void main(String[] args)
TestClass tc=new TestClass();//创建类对象

本回答被提问者采纳

Laravel 如何创建任何类的对象

【中文标题】Laravel 如何创建任何类的对象【英文标题】:How Laravel creates object of any class 【发布时间】:2021-11-30 23:35:33 【问题描述】:

我是 laravel 框架的新手,我不清楚 laravel 对象的创建。 laravel 如何创建类对象?

喜欢例如。我有一个名为 class MyTestController 的控制器,它定义了名为 MyMethod()

的方法

这是这个控制器的路由, Route::get('Test',[MyTestController::class,'MyMethod']);

当我点击 -- http://localhost:81/laravel_project/Test,

MyMethod() 被调用。 我还没有使用 new 关键字创建 MyTestController 类对象,那么它的方法是如何调用的?

框架是否在幕后创建对象。

【问题讨论】:

欢迎来到 SO。简短的回答是 php.net/call_user_func 。也许 laravel 正在使用另一种方式,例如反射之类的。 它使用自己的dependency injection mechanism 【参考方案1】:

换句话说,是的,Laravel 在幕后创建对象,但是根据我的经验,不建议/很少在 Laravel 框架中创建声明的对象(例如控制器、模型等),因为那是框架的作用,它们使您更简单。以模型为例,通过在模型名称后添加where($id)->first() 代码(最终代码为Model::where($id)->first()),Laravel 将在调用first() 方法时根据查询结果为您创建模型对象。有很多方法与first() 具有相同的行为,get() 也是其中之一,不同之处在于first() 只会给你一个对象,而get() 会给你一个包含结果,即使它只匹配 1。

在你的情况下,即控制器,基本上 hassan 和 apokryfos 已经为你解答了。

【讨论】:

【参考方案2】:

试试这个

Route::get('Test', function()
$object = new MyTestController();
 var_dump($object);      
 );

【讨论】:

以上是关于1如何声明一个类?如何创建类的对象?的主要内容,如果未能解决你的问题,请参考以下文章

类对象的数组[关闭]

面向对象

java里如何声明一个颜色类?

枚举类和注解

java中string类创建对象

构造器