关于java的构造函数

Posted on 2006-05-22 15:54 糊里糊涂 阅读(307) 评论(0)  编辑  收藏 所属分类: Java

今天在csdn上看到有人提出这样一个问题:

1. class A {
2. A() { }
3. }
4.
5. class B extends A {
6. }
Which two statements are true? (Choose two)
A. Class B's constructor is public.
B. Class B's constructor has no arguments.
C. Class B's constructor includes a call to this().
D. Class B's constructor includes a call to super().

个人认为A,B,D都是对的。为什么只有两个答案呢?

当时回答给他的答案是,默认类的构造函数是friendly的,所以A是错误的,但是又看了下楼主发布的测试代码

很高兴大家的关注;
A.java
package packa;
class A
{

}
B.java
package packb;
import packa.A;
class B
{
     public static void main(String[] args)
     {
         A a=new A();
     }
}
编译,运行是ok的。
可是把A类写成
class A
{
    A(){}
}
就会出现A() is not public in packa.A; cannot be accessed from outside package
的错误提示。
这不是说明默认的A类构造函数是public的吗?
希望大家继续帮忙解惑!

     当时直接看了这个代码,自己也没有考虑是否正确,就误认为是正确的,开始疑惑起来了。接着又做了下面的测试才发现真正的原因:

  •  类的默认构造函数(非手工实现)的访问权限是跟类的访问权限相关的,可以见下面的测试。

比如,一个类:

A{}

用javap进行反编译查看代码为:

class A extends java.lang.Object

{

    A(){}

}

如果写成

public class A{}

反编译后为:

public class A extends java.lang.Object

{

  public A(){}

}


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 2, comments - 2, trackbacks - 0, articles - 4

Copyright © 糊里糊涂