Java中构造函数的用途
构造函数的目的是什么? 我在学校学习Java,在我看来,就像我们迄今为止所做的那样,构造函数在很大程度上是多余的。 目的是否还有待观察,但迄今为止,这对我来说似乎毫无意义。 例如,以下两段代码有什么区别?
public class Program { public constructor () { function(); } private void function () { //do stuff } public static void main(String[] args) { constructor a = new constructor(); } }
这就是我们被教导如何做事情的任务,但不会在下面做同样的交易?
public class Program { public static void main(String[] args) { function(); } private void function() { //do stuff } }
构造函数的目的是逃避我,但是到目前为止,我们所做的一切都是非常简单的。
构造函数用于初始化类的实例。 您可以使用一个构造函数来创build新的对象,通常使用指定初始状态或其他有关该对象的重要信息的参数
从官方的Java教程 :
一个类包含被调用来从类蓝图创build对象的构造函数 。 构造函数声明看起来像方法声明 – 除了它们使用类的名称并且没有返回types。 例如,Bicycle有一个构造函数:
public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; }
为了创build一个名为
myBike
的新的自行车对象,一个构造函数被新的运算符调用:自行车myBike =新自行车(30,0,8);
new Bicycle(30, 0, 8)
为对象创build内存空间并初始化其字段。虽然Bicycle只有一个构造函数,但它也可以有其他构造函数,包括一个无参数的构造函数:
公共自行车(){齿轮= 1; 节奏= 10; 速度= 0; }
Bicycle yourBike = new Bicycle();
调用无参构造函数来创build一个名为yourBike的新的Bicycle对象。
构造函数基本上是一个方法,您可以使用它来确保您的类的对象是天生有效的 。 这是构造函数的主要动机。
假设你想让你的类有一个单一的整数字段,它应该总是大于零。 你如何以一种可靠的方式做到这一点?
public class C { private int number; public C(int number) { setNumber(number); } public void setNumber(int number) { if (number < 1) { throws IllegalArgumentException("C cannot store anything smaller than 1"); } this.number = number; } }
在上面的代码中,它可能看起来像是在做一些多余的事情,但实际上你确保这个数字总是有效的,不pipe是什么。
“初始化类的实例”是一个构造函数,但不是我们有构造函数的原因。 问题是关于构造函数的目的。 你也可以在上面的例子中使用c.setNumber(10)
来初始化外部类的实例。 所以构造函数不是初始化实例的唯一方法。
构造函数是这样做的,但是安全 。 换句话说,仅仅一个类就解决了确保对象始终处于有效状态的整个问题。 不使用构造函数会将这种validation留给外界,这是不好的devise。
这是另一个例子:
public class Interval { private long start; private long end; public Interval(long start, long end) { changeInterval(start, end); } public void changeInterval(long start, long end) { if (start >= end) { throw new IllegalArgumentException("Invalid interval."); } this.start = start; this.end = end; } public long duration() { return end - start; } }
Interval类表示一个时间间隔。 时间长存储。 有一个时间间隔结束之前没有任何意义。 通过使用像上面那样的构造函数,在系统中任何时候任何时候都不可能有一个Interval的实例,存储一个没有意义的区间。
正如LotusUNSW中所提到的答案构造函数用于初始化类的实例。
例:
假设你有一个类似的Animal
类
class Animal{ private String name; private String type; }
让我们看看当你尝试创build一个Animal类的实例时会发生什么,比如一个名为Puppy
的Dog
。 现在你必须初始化name = Puppy
和type = Dog
。 那么,你怎么能做到这一点。 这样做的一个方法是像一个构造函数
Animal(String nameProvided, String typeProvided){ this.name = nameProvided; this.type = typeProvided; }
现在当你创build一个类Animal
的对象时,像Animal dog = new Animal("Puppy", "Dog");
你的构造函数被调用,并初始化名称和types为您提供的值,分别为小狗和狗。
现在你可能会问,如果我没有提供一个参数给我的构造函数的话
Animal xyz = new Animal();
这是一个default Constructor
,初始化对象的默认值,即在我们的Animal
类的name
和type
值对应的xyz
对象将是name = null
和type = null
- 通过一个构造函数(带参数),你可以“请求”该类的用户所需的依赖关系。
- 它用于初始化实例variables
- 并将parameter passing给一个超级类(
super(...)
)的构造函数,它基本上是一样的 - 它可以用代码初始化(最终)实例variables,这可能会抛出exception,而不是实例初始化器的作用域
- 一个人不应该盲目地从构造函数中调用方法,因为初始化可能不会在本地或派生类中完成/足够。
构造函数在创build时初始化一个对象。 它和它的类具有相同的名称,在语法上类似于一个方法,但构造函数没有返回types。 通常情况下,我们使用构造函数为类定义的实例variables赋予初始值,或者执行任何其他需要创build完全形成的对象的启动过程。
这是一个构造函数的例子:
class queen(){ int beauty; queen(){ beauty = 98; } } class constructor demo{ public static void main(String[] args){ queen arth = new queen(); queen y = new queen(); System.out.println(arth.beauty+" "+y.beauty); } }
输出是:
98 98
这里的build设是:
queen(){ beauty =98; }
现在轮到参数化的构造函数。
class queen(){ int beauty; queen(int x){ beauty = x; } } class constructor demo{ public static void main(String[] args){ queen arth = new queen(100); queen y = new queen(98); System.out.println(arth.beauty+" "+y.beauty); } }
输出是:
100 98
它被用来设置你的课程的内容和状态。 虽然这是真的,你可以使用主要方法更简单的例子,每个应用程序只有一个主要的方法,所以它不是一个明智的做法。
考虑简单地启动你的程序的主要方法,应该只知道如何做到这一点。 还要注意,main()是静态的,所以不能调用需要类实例和相关状态的函数。 主要的方法应该调用新的Program()。函数()和程序构造函数不应该调用函数(),除非它是需要的类的设置。
类定义为您的类定义了API。 换句话说,这是一个蓝图,它定义了类和客户之间存在的契约 – 使用这个类的所有其他代码。 合约指出哪些方法可用,如何调用它们,以及期望得到什么回报。
但是类定义是一个规范。 直到你有这个阶级的实际对象,合同只是“一张纸”。 这是构造函数进来的地方。
构造函数是通过在内存中创build对象并返回对其的引用来创build类的实例的方法。 应该在构造函数中发生的事情是对象处于适当的初始状态,以便对对象的后续操作有意义。
从构造函数返回的这个对象现在将遵守类定义中指定的契约,并且可以使用这个对象来做真正的工作。
想想这样。 如果你看过保时捷网站,你会看到它能做什么 – 马力,扭矩等等。但是,直到你有一辆保时捷才能驾驶,这并不好玩。
希望有所帮助。
构造函数基本上用于在创build对象时初始化variables
Java构造函数与它所属的类的名称相同。
构造函数的语法不包含返回types,因为构造函数从不返回值。
构造函数总是在创build对象时调用。 例如: – 默认构造函数
class Student3{ int id; String name; void display(){System.out.println(id+" "+name);} public static void main(String args[]){ Student3 s1=new Student3(); Student3 s2=new Student3(); s1.display(); s2.display(); } }
输出:
0 null 0 null
说明:在上面的类中,没有创build任何构造函数,因此编译器为您提供了一个默认的构造函数。这里默认的构造函数提供了0和空值。
参数化构造函数的示例
在这个例子中,我们创build了具有两个参数的Student类的构造函数。 我们可以在构造函数中有任意数量的参数。
class Student4{ int id; String name; Student4(int i,String n){ id = i; name = n; } void display(){System.out.println(id+" "+name);} public static void main(String args[]){ Student4 s1 = new Student4(111,"Karan"); Student4 s2 = new Student4(222,"Aryan"); s1.display(); s2.display(); } }
输出:
111 Karan 222 Aryan
我认为一个构造函数可能像一个数据库,只有它定义variables和方法来控制它们
然后我看到使用未在其构造函数中定义的variables和方法的对象。 因此,对我来说最有意义的讨论就是对variables值进行有效性testing的讨论,但是类可以创build未在构造函数中定义的variables和方法 – 不像数据库那样,更像是蒸汽上的超压阀机车。 它不控制车轮等。
比我想象的要less得多的定义。
构造函数将有助于防止实例获取不真实的值。 举个例子,身高,体重的人不能有0m和0kg的人