为什么构造器不能是abstract, static, final, native or synchronized的?

Unlike methods, a constructor cannot be abstract, static, final, native  or synchronized.

1. A constructor is not inherited, so there is no need to declare it final

2. As the same reason above, an abstract constructor could never be implemented.

3. A constructor is always invoked with respect to an object, so it makes no sense for a constructor to be static.

4.
There is no practical need for a constructor to be synchronized,
because it would lock the object under construction, which is normally
not made available to other threads until all constructors for the
object have completed their work.

5. The lack of native
constructors is an arbitrary language design choice that makes it easy
for an implementation of the Java virtual machine to verify that
superclass constructors are always properly invoked during object
creation.

翻译如下:

不同于方法,构造器不能是abstract, static, final, native, strictfp, 或者synchronized的.

1.构造器不是通过继承得到的,所以没有必要把它声明为final的。

2.同理,一个抽象的构造器将永远不会被实现。(所以也不能声明为abstract的)

3.构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。

4.没有实际的需要把构造器定义成同步的,因为它将会在构造的时候锁住该对象,直到所有的构造器完成它们的工作,这个构造的过程对其它线程来说,通常是不可访问的。

5.没有本地的构造器是任意一种语言的设计选择,这样会使得在创建对象的过程中JVM实现很容易去校验父类的构造器是否总是被正确地调用了。

(本地化的方法情况特别复杂,所以JVM调用起来非常麻烦,需要考虑很多种情况,没有native关键字的情况下,JVM实现起来比较容易。)

转自:http://www.blogjava.net/realsmy/archive/2007/04/10/109256.html

时间: 2024-11-07 08:52:22

为什么构造器不能是abstract, static, final, native or synchronized的?的相关文章

关于Abstract,static,final的理解

Abstract,static,final理解 一 . Abstract 抽象 1> 修饰类 一个类被Abstract修饰之后,就不能new对象了,修饰父类 被Abstract修饰的说明是一个不是一个具体的类型,是一个类别,是一个父类,不应该被具体化 说明这个类不完整,不够具体,抽象类无法独立存在 为子类输出共性 作用: 1> 可以被子类继承,提供共性属性和方法 2> 可声明为引用,强制使用多态 3> 抽象父类可以是子类的组成部分,依附于子类对象的存在 4> 由父类共性+子类

Java修饰符abstract,static,final的区别

注意:有抽象方法的类一定是抽象类.但是抽象类中不一定都是抽象方法,也可以全是具体方法.abstract修饰符在修饰类时必须放在类名前. abstract修饰方法就是要求其子类覆盖(实现)这个方法.调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类. 注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类.抽象类中可以有构造方法,是子类在构造子类对

Java修饰符 abstract,static,final 的区别详解

一:static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就是全类公有.(共有的类变量与对象无关,只和类有关). 类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载.JVM(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件. 类变量

浅析java修饰符之public default protected private static final abstract

浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 二   分类(大致分两类) 1.访问修饰符,包括:public default protected private 2.非访问修饰符,包括:static final abstract 三 访问修饰符--Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权

static final public synchronized abstract

1.static final public synchronized 可以混用 而且顺序不限 2.abstract 只能与public或protected连用,不能用default或private 也不能与static final  synchronized中的任意一个连用 原因: abstract要继承(多态) 但static的是编译期绑定,拒绝多态 synchronized没有继承性,父类加锁 子类默认不加锁 ,所以加了synchtonizd也没用 final本身就是阻止重写的

为什么接口要规定成员变量必须是public static final的呢?(转)

在interface里面的变量默认都是public static final 的.所以可以直接省略修饰符: String param="ssm"://变量需要初始化 为什么接口要规定成员变量必须是public static final的呢? 答: 首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static

【Java关键字-Interface】为什么Interface中的变量只能是 public static final

三个关键字在接口中的存在原因:public:接口可以被其他接口继承,也可以被类实现,类与接口.接口与接口可能会形成多层级关系,采用public可以满足变量的访问范围: static:如果变量不是static的,那么接口必须实例化才可以访问自己的变量,接口不能被实例化,故非static的变量是无效的: final:如果变量不是final的,而方法是abstract的,因此接口中的方法又不可以修改变量值,虽然可以直接修改静态成员变量,但所有实现类对应的值都被修改了,此做法等同于抽象类,故需要fina

Java static,final 基本概念

(转载自http://blog.kenyang.net/2011/03/java-staticfinal.html) 從很久以前我就了解到, 不僅僅要知道know how, 還要知道know why, 舉個例子,當我派工作給底下的人做時, 例如要他做出一個發送mail的功能出來, 恩,拜Google大神所賜,通常很快都可以找到發送mail的code. 但是當我細下去問每一行code的用途時, 大多是...."恩...不知道". 我覺得此風不可長. 甚至有些學弟們搞不清楚何時要用stat

抽象方法不能是static或native或synchroniz 原因及误解

在网上看到过这么一篇文章,是关于抽象方法不能是static或native或synchroniz 的原因.其中提到了这些关键字的意义以及与 abstract 关键字的冲突,大体内容如下: 1.abstract是抽象的,指的是方法只有声明而没有实现,他的实现要放入声明该类的子类中实现. 2.static是静态的,是一种属于类而不属于对象的方法或者属性,而我们知道,类其实也是一个对象,他是在class文件加载到虚拟机以后就会产生的对象,通常来说它是单例的,就是整个虚拟机中只有一个这样的类对象(当然,如