Java构造函数 为什么需要无参构造函数

Java构造函数 为什么需要无参构造函数,第1张

补充下楼上的回答~~“但是如果你创造了一个带有参数的构造方法,那么无参的构造方法必须显式的写出来,否则会编译失败"这句话有点不妥,应该这么理解:每个类至少要有一个构造函数,如果你自己构建了一个带有参数的构造函数而没有再显示的写出无参的构造函数也是可以的,不过当你尝试通过一个无参的构造函数来构建(new)时,此时编译器才会报错,因为找不到这个无参的构造函数。也就是说当一个类你没有给他构造函数,则编译器会自动补上一个无参的,若有的话就不会,你需要显示将此无参的构造函数写出来。

另一个问题:无参的构造函数,只是为了比较好的构造类(new),具体情况要根据你的类是如何设计的,呵呵。

创建对象的时候(一般都是new 一个对象,也有比如单例模式给一个方法,其实内部还是new),会调用构造方法,构造方法名和类名一致,默认的构造方式是无参数的方法,如public User(){}

再说下构造方法重载,重载的意思就是方法名相同,参数列表不同,如 public User(String id){ thisid = id;}

或者多个参数

public User(String id,String username){ thisid = id; thisusername=username;}

java 不支持复制构造方法,就是没有复制构造方法这一说

构造方法是一种特殊的方法,与一般的方法不同是:

1构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。

2构造方法的调用是在创建一个对象时使用new *** 作进行的。构造方法的作用是初始化对象。

3不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。

class RectConstructor{

double length;

double width;

double area(){

return lengthwidth;

}

//下面这个方法就是所谓的构造方法,没有返回值,方法名与类名相同~~~

RectConstructor(double width,double length){//带参数的构造方法

thislength=length;

thiswidth=width;

}

}

其实构造方法就是为了给类中成员赋初值~~~~~~~~~~~~~

函数这个东西是在C语言和C++里的叫法,而在Java里面被称为方法(估计是翻译导致的叫法差异),所以按理说Java里应该只有“构造方法”的,但是先学过C语言和C++的人说函数说习惯了,在Java里就也把方法称之为函数了,本质上没区别。

ansn001

20:19:31

不可以

构造函数

是针对于类的

类可以有构造函数

main是一个特殊的

静态方法

摩羯座

20:19:55

主函数也在一个类里面啊

ansn001

20:20:04

那是局部分类

部分类

那个构造函数也是在类里的

单独在方法里写构造函数是错的。

构造函数的本质就是来初始对象的

摩羯座

20:20:59

public

class

GG

{

public

static

void

main(String

a[])

{

GG

cc=new

GG();

。。。。。

}

那这里的new

GG();是在干什么?

ansn001

20:21:37

。。。。。这个是创建对象呀。这个不是构造函数

摩羯座

20:21:49

那我写到main之外,public类之内可以不?

ansn001

20:21:52

构造函数应该是这样的

public

class

GG{

public

GG(){}

}

摩羯座

20:22:06

他也是在调用构造函数噻

ansn001

20:22:13

可以。它就成为一个成员变量,或者叫字段

它是在调用构造函数。可是它现在是在创建一个对象

我们说了构造函数是作用于类的初始化的

摩羯座

20:22:32

估计也没多大必要是吧?

ansn001

20:22:52

啥???没必要?

摩羯座

20:23:30

写个构造函数在main之外,public类之内

ansn001

20:23:54

这主要看你有没有需求

摩羯座

20:24:00

创建一个对象肯定就调用了它的构造函数嘛

ansn001

20:24:05

一般不写在带有Main的类中有构造函数

这个类也叫主类

摩羯座

20:24:25

我从未见过public类里有构造函数。。。

ansn001

20:24:39

。。。呵呵,那是你还没学到

这样吧。我小个小demo

摩羯座

20:25:03

虽没学到,但是我想到了,哈哈

ansn001

20:25:20

恩。等我一分钟

摩羯座

20:25:46

ansn001

20:26:57

public

class

Student

{

public

String

name;

public

int

age;

//无参构造函数

public

Student(){}

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}

public

static

void

main(String[]

args)

{

Student

stu1=new

Student();

Student

stu2=new

Student("1",1);

Student

stu3=new

Student();

stu3name="1";

stu3age=11;

}

}

前面两个构造函数

一个无参一个带参

具体用途你看main方法

第一种。我们不知道学生信息,可以这样new

第二种,我直接带名字和年龄

第三种,也是带名字和年龄。不过要赋值

显示第二种比第三种,方便

而且关键的是如果我现在一个系统。要求学生必须带名字和年龄的话

摩羯座

20:28:37

哦,那看来public类里还是有个默认的无参构造函数

ansn001

20:28:45

我的Student里只有

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}其他的都无效

是的

系统自动提供一个默认的构造函数

前提是你自己没写构造函数

一定你自己手写的话,这个

默认构造函数

失效

比如

public

String

name;

public

int

age;

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}

public

static

void

main(String[]

args)

{

Student

stu1=new

Student();

Student

stu2=new

Student("1",1);

}

摩羯座

20:29:31

我的Student里只有

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}其他的都无效

ansn001

20:29:37

此时第一个new会报错

摩羯座

20:29:38

这是什么意思?

我的Student里只有

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}其他的都无效这是什么意思?

ansn001

20:30:26

public

String

name;

public

int

age;

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}

public

static

void

main(String[]

args)

{

Student

stu1=new

Student();

Student

stu2=new

Student("1",1);

}

发错了

看这个

public

String

name;

public

int

age;

public

Student(String

name,int

age){

thisname=name;

thisage=age;

}

public

static

void

main(String[]

args)

{

Student

stu1=new

Student();//会报错

Student

stu3=new

Student("1");//会报错

Student

stu2=new

Student("1",1);//必须完全匹配才OK

}

摩羯座

20:31:05

嗯,这个看得懂

ansn001

20:31:09

在严谨的程序中会提供各种各校的构造函数

一般不会有空的构造函数

一是防止因为手误少写参数

导致程序意外错误

第二个减少代码

摩羯座

20:32:08

哦,谢谢啦

其实就是普通的set方法,设置一些属性。这里它每一个setXxx方法都返回一个Builder类型的变量,

所以就一直setA(x)setB(y)setC(z)最后才build()

就是一个语句。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12180996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存