Posted on 2006-05-22 15:51
糊里糊涂 阅读(586)
评论(1) 编辑 收藏
今天在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(){}
}