导航:首页 > 编程语言 > javastatic构造函数

javastatic构造函数

发布时间:2022-05-26 08:21:00

‘壹’ java 构造函数

每个类必须有一个无参的构造方法,如果一个类没有写构造方法,编译器会自动为该类添加一个无参的构造方法。所以在代码中默认可以不写。

你写了以下几行代码后,添加了一个有参的构造方法。这时候编译器可以查找到构造方法,就不会再添加默认的无参构造方法,所以报错。

m(Stringwords){
this.words=words;
}

添加如下代码:

publicm(){
}

欢迎追问

‘贰’ java的构造函数

构造方法用public修饰,因为建立这个类的实例对象的时候系统需要调用它,但是没有返回值类型,构造方法的特点就是:
1.和类名相同
2.不可使用return返回数值
3.没有返回类型修饰词
符合的就是构造函数,当你建立这个类的实例对象的时候如Fruit s=new Fruit();这样写的时候,系统就会调用第一个构造方法,应为它没有传任何参数,要是这样写Fruit s=new Fruit(new String("aaa"),double w);系统会自动调用第二个构造方法。一个类可以有多个构造方法。
void setName(String n)
{
name = n;
}
String getName()
{
return name;
}
这个分开写主要是为了安全性考虑,不让其他人直接调用修改成员变量,只通过类的内部方法进行调用。你这个里面的name应该用private修饰!
我知道的就这么多了!

‘叁’ java中构造函数的名称是什么

JAVA中的构造函数就是构造方法!是构造方法,不是构造函数,后者是C++的概念!深层次理解的话其实函数名称也就是内存的首地址!

首先要注意的是Java的构造器并不是函数,所以他并不能被继承,这在我们extends的时候写子类的构造器时比较的常见,即使子类构造器参数和父类的完全一样,我们也要写super就是因为这个原因。
构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象、同步、静态等等访问限制以外的形式。
因为构造器不是函数,所以它是没有返回值的,也不允许有返回值。但是这里要说明一下,构造器中允许存在return语句,但是return什么都不返回,如果你指定了返回值,虽然编译器不会报出任何错误,但是JVM会认为他是一个与构造器同名的函数罢了,这样就会出现一些莫名其妙的无法找到构造器的错误,这里是要加倍注意的。

在我们extends一个子类的时候经常会出现一些意想不到的问题,我在这里说一些和构造器有关的。
首先说一下Java在构造实例时的顺序(不讨论装载类的过程)
构造的粗略过程如下
1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
2、执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)
3、执行构造器
4、将变量关联到堆中的对象上

介绍一下准备知识,以备一会来详细说明这个的流程
this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行, 在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误,注意此处,我们经常在继承父类的时候构造器中并不写和父类有关的内容,此时如果父类没有缺省构造器,就会出现编译器添加的缺省构造器给你添麻烦的问题了哦。例如:Class b extends a{public b(){}}就没有任何有关父类构造器的信息,这时父类的缺省构造器就会被调用。

举个SL-275中的例子
1 public class Manager extends Employee {
2 private String department;
3
4 public Manager(String name, double salary, String dept)
{
5 super(name, salary);
6 department = dept;
7 }
8 public Manager(String n, String dept) {
9 super(name);
10 department = dept;
11 }
12 public Manager(String dept) { // 这里就没有super(),编译器会自动地添加一个空参数的缺省super构造器,此时如果Employee类中没有空参数的缺省构造器,那就会导致一个编译错误
13 department = d;
14 }
15 }

你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器

在具体构造类实例的过程中,上边过程的第二步和第三步是有一些变化的,这里的顺序是这样的,分配了对象空间及对象成员初始化为默认值之后,构造器就递归的从继承树由根部向下调用,每个构造器的执行过程是这样的:
1、Bind构造器的参数
2、如果显式的调用了this,那就递归调用this构造器然后跳到步骤5
3、递归调用显式或者隐式的父类构造器,除了Object以外,因为它没有父类
4、执行显式的实例变量初始化(也就是上边的流程中的第二步,调用返回以后执行,这个步骤相当于在父构造器执行后隐含执行的,看样子像一个特殊处理)
5、执行构造器的其它部分

这里的步骤很重要哦!!!!!

从这个步骤中可以很明显的发现这个实例初始化时的递归调用过程,估计看过这个你应该能够理解这个递归构造链是怎么样回事了。

这里还是给出SL-275中的一个例子,让你充分理解一下这个递归的过程。

public class Object {
...
public Object() {}
...
}
public class Employee extends Object {
private String name;
private double salary = 15000.00;
private Date birthDate;
public Employee(String n, Date DoB) {
// implicit super();
name = n;
birthDate = DoB;
}
public Employee(String n) {
this(n, null);
}
}

public class Manager extends Employee {
private String department;
public Manager(String n, String d) {
super(n);
department = d;
}
}

在创建Manager("Joe Smith","Sales"):时,步骤如下
0 basic initialization
0.1 allocate memory for the complete Manager object
0.2 initialize all instance variables to their default values (0 or null)
1 call constructor: Manager("Joe Smith", "Sales")
1.1 bind constructor parameters: n="Joe Smith", d="Sales"
1.2 no explicit this() call
1.3 call super(n) for Employee(String)
1.3.1 bind constructor parameters: n="Joe Smith"
1.3.2 call this(n, null) for Employee(String, Date)
1.3.2.1 bind constructor parameters: n="Joe Smith", DoB=null
1.3.2.2 no explicit this() call
1.3.2.3 call super() for Object()
1.3.2.3.1 no binding necessary
1.3.2.3.2 no this() call
1.3.2.3.3 no super() call (Object is the root)
1.3.2.3.4 no explicit variable initialization for Object
1.3.2.3.5 no method body to call
1.3.2.4 initialize explicit Employee variables: salary=15000.00;注意:在父构造器返回后子类才会初始化实例变量的值。
1.3.2.5 execute body: name="Joe Smith"; date=null;
1.3.3 - 1.3.4 steps skipped
1.3.5 execute body: no body in Employee(String)
1.4 no explicit initializers for Manager
1.5 execute body: department="Sales"

这个流程就说明了一切,这个步骤是要注意的。一会还有些内容是要涉及到这里的。

写在后边的一些在使用构造器中的注意事项。

一、构造器中一定不要创建自身的实例,否则会造成调用栈溢出错误。这个规则也适用于对象的实例变量,如果对象中有自身的引用,这个引用一定不能在定义中或者构造器中初始化。

class a
{
a _a = new a();

public a()
{
_a = new a();
a _b = new a();
}
}

以上三种情况都会造成栈溢出,呵呵,这样会造成一个无穷递归的调用栈。

二、如果父类是一个抽象类,那通过调用父类的构造器,也可以将它初始化,并且初始化其中的数据。
三、如果你要在构造器中调用一个方法时,将该方法声明为private。
对于这个规则是需要一些说明的,假使你的父类构造器中要调用一个非静态方法,而这个方法不是private的又被子类所重载,这样在实际创建子类的过程中递归调用到了父类的构造器时,父类构造器对这个方法的调用就会由于多态而实际上调用了子类的方法,当这个子类方法需要用到子类中实例变量的时候,就会由于变量没有初始化而出现异常(至于为什么子类中的实例变量没有初始化可以参考上边的实例初始化过程),这是Java不想看到的情况。而当父类构造器中调用的方法是一个private方法时,多态就不会出现,也就不会出现父类构造器调用子类方法的情况,这样可以保证父类始终调用自己的方法,即使这个方法中调用了父类中的实例变量也不会出现变量未初始化的情况(变量初始化总是在当前类构造器主体执行之前进行)。

‘肆’ java为什么构造方法不能够加static

1,构造方法不能继承(否则乱伦)
2,重写必须先继承
3,静态方法可以继承
4,静态方法是独立于对象的类级别的方法。不创建实例 构造函数的调用也不需要实例,构造函数是由jvm创建类实例时自动调用

‘伍’ Java有静态构造函数吗

不可能有的,这个完全违背了面向对象的一些规则。
构造函数,是为了将一个类实例化一个对象才需要使用的,进行一些必备的初始化操作(即使你没写任何代码,实际上运行库也帮你添了很多操作)。何为静态,就是全局的,已经初始化过的,静态函数就是指该函数不和具体对象相关,只和类相关,但是构造函数是和对象直接关联的,这两个东西从面向对象的概念上完全不可能融合在一起。

‘陆’ java中当static块和构造函数同时出现,顺序是什么样

静态块先于构造函数执行

class Student {
int age;
String name;
static int count;

public Student() {
System.out.println("in constructor");
}
/*只执行一次。*/
static {
System.out.println("hello");
count = 0;
}
}

public class Test {
public static void main(String[] args) {
。。。。。。。。。。。。。。。。详情网上找“马克-to-win”,参考他的网站或他的网络空间:java第2章的内容

‘柒’ JAVA中一个类里的 static{.....} 是什么 是静态构造函数么

这个叫static代码块,这个代码块里面的语句,比构造器里面的语句执行的还要早。和static变量同时被初始化,然后再去执行构造器里的语句。:

如果你new People();那么,执行顺序如下:

public class People{
static int peopleNum=0; //先执行这个
static {
.... //再执行这里面的语句
}
public People(){
...//最后执行构造器里的语句

}
}
综上,
一个类里面,所有标注了static修饰符的花括号代码块或变量,都会按照你的书写顺序,先后被初始化。是变量的,则初始化该变量;是语句块的,则执行该语句块。

JAVA里的static代码块就跟static变量一样,你可以把这个花括号语句块也当成一个变量,他的生命周期和static变量一样长。

‘捌’ Java 中能不能有静态的构造函数

不可能有的,这个完全违背了面向对象的一些规则。 构造函数,是为了将一个类实例化一个对象才需要使用的,进行一些必备的初始化操作(即使你没写任何代码,实际上运行库也帮你添了很多操作)。何为静态,就是全局的,已经初始化过的,静态函数就是指该函数不和具体对象相关,只和类相关,但是构造函数是和对象直接关联的,这两个东西从面向对象的概念上完全不可能融合在一起。

‘玖’ 为什么Java中不能有静态的构造函数

JAVA中静态的东西都是属于类的,为类服务,
构造函数
是为了初始化对象,为对象服务。构造函数是用来生成实例,既然是实例就不是static的。这两者是相互矛盾的

‘拾’ 为什么java里面,静态类也可以有构造函数

构造函数一般是用于实例化的,即使一个类没有写任何构造函数,其实也是有一个默认的空构造函数的。
静态类没有说不能被继承,也没有说不能被实例化,是不需要实例化。
所谓静态就是程序一启动这个被加静态属性的类,方法,变量都已经被第一时间加载到内存中了!所以你直接调用就可以了!还有别说是静态类的静态方法不用调用,就是普通类的静态方法也是不用实例化的!这样效率更高!

阅读全文

与javastatic构造函数相关的资料

热点内容
android4书籍 浏览:639
pdf阅读器电脑版exe 浏览:907
易语言加壳怎么编译 浏览:523
qt下编译生成mqtt库 浏览:543
南京中兴招收专科程序员吗 浏览:299
代理商php源码 浏览:985
苹果手机怎么解压软件app 浏览:652
游戏资源被编译 浏览:154
代码编译后黑屏 浏览:8
程序员情侣写真 浏览:505
python3孪生素数 浏览:36
计算杨辉三角Python 浏览:404
linux目录重命名 浏览:196
算法设计的最终形态是代码 浏览:262
程序员社团招新横幅 浏览:238
拖鞋解压视频大全 浏览:887
租服务器主机链接软件叫什么 浏览:856
交叉编译工具的linux版本号 浏览:156
python开发应用软件 浏览:32
hdl综合器与c编译器的区别 浏览:899