我们都知道,如果我们没有专门定义构造函数,编译器会插入一个不可见的零参数构造函数.我认为它的访问修饰符是公开的,但在处理内部类问题时,我发现也许我错了.这是我的代码:
public class Outer {
protected class ProtectedInner {
// adding a public constructor will solve the error in SubOuterInAnotherPackage class
//public ProtectedInner() {}
}
}
Run Code Online (Sandbox Code Playgroud)
并且Outer在另一个包中有一个子类:
public class SubOuterInAnotherPackage extends Outer {
public static void main(String[] args) {
SubOuterInAnotherPackage.ProtectedInner protectedInner
= new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can't access the default constructor
}
}
Run Code Online (Sandbox Code Playgroud)
您将在main()方法中收到错误,但如果向ProtectedInner类中添加公共构造函数,则会解决该错误.这就是为什么我认为默认构造函数的修饰符不公开!那么有谁能告诉我默认构造函数的访问修饰符是什么?
在我最近的工作中,我遇到了一个问题,即一些操作数的数字推广.以下是演示代码:
int num1 = 9999999;
int num2 = 65536;
double result = num1*num2*1.0;
Run Code Online (Sandbox Code Playgroud)
在我看来,我认为num1和num2都会自动升级为double,然后计算结果,因为其中一个操作数是double,而结果让我感到震惊.我得到一个负数.然后我查看JLS,它还说应该进行数字促销,见下文:
"如果二元运算符的至少一个操作数是浮点类型,则操作是浮点运算,即使另一个是整数运算.
如果数值运算符的至少一个操作数是double类型,则使用64位浮点运算执行运算,并且数值运算符的结果是double类型的值.如果另一个操作数不是double,则首先将其扩展(第5.1.5节)以通过数字提升(第5.6节)键入double.
否则,使用32位浮点运算执行运算,并且数值运算符的结果是float类型的值.(如果另一个操作数不是浮点数,则首先将其扩展为通过数字提升键入float.)"
如果我将结果更改为1.0*num1*num2,它将给我正确的答案.有人能告诉我这到底是什么意思吗?