本文并没有什么新鲜的。我只是收集了一些不太重要的Java语句,但这些语句可能对初级程序员来说很重要。也就是些无聊的旧东西。
如果以下的这些你都知道的话,那么你比Java的了解已经超过了对一个平常的家庭主妇的了解。我不知道清楚所有的这些是否是有意义的。即使不知道其中的一些特性,你照样也可以成为一个相当不错的Java程序员。然而,本文中许多的新信息可能表明你还有很大的发展空间。
Java中有四种不同的访问类型(而不是三种)这四种类型包括:private, package private (包访问权限,无修饰符,又叫default, 译者注)。如果你在类中定义一个元素时并不加任何访问类型修饰符,它将被默认设置为包访问权限(package private),而不是public或者protected。
Java有四个级别的访问类型。
从另一方面来说,如果在接口中,你不指定方法的访问修饰符,那么它将是public类型的。你也可以显式地指定它为public类型, 但这并不符合SONAR(一个开源代码质量管理平台,译者注)的代码质量管理思想。
访问类型是传递的
我的“在Java中允许选择性的在接口的方法中写public”的观点是一个技术错误。
同样你也可在接口的字段前写final,甚至是static。这说明这些字段可以是非静态或非final吗?不是的,接口中的字段中总是final和static的。
Protected和package private是不一样的Package private(或者default)访问类型可以使得相同包(package)下其他类能够访问这些字段或方法。保护类型(protected)的方法和字段可以被相同包下的类使用(这和package private是一样的),同时它也可以被其他类使用,只要那个类继承了这个包含这些protected方法或字段的类。
Protected是可传递的如果有三个包a、b、c,每个包都分别包含A、B、C类,而且B继承A,C继承B,那么C可以访问A中的protected字段和方法。
package a;
publicclass A {
protectedvoid a(){
}
}
package b;
import a.A;
publicclass B extends A {
protectedvoid b(){
a();
}
}
package c;
import b.B;
publicclass C extends B {
protectedvoid c(){
a();
}
}
接口不能定义protected方法很多人认为可以在接口中定义protected方法。如果你这么做的话,编译器很快就会毫不留情地给你报错。顺便说下,这也就是我为什么认为允许public关键字在接口中是一个技术错误,它会让人觉得还可以写其他访问类型似的。
private是一种新的public
如果你还想在一个接口的方法中声明protected方法,你可能还不理解封装的含义。
此private非彼private私有变量和方法在编译单元内是可见的。如果这听起来太神秘的话,换种说法:几乎就是在同一个Java文件中。这比“在它们被定义的类中”听起来好理解些。它们在同一编译单元的类和接口中也是可见的。嵌套类可以看到类中封装的私有字段和方法。然而,当前封闭类也可以看到该类下任何深度下类中的私有方法和字段。
package a;
classPrivate{
privateclassPrivateInPrivate{
privateObjectobject;
}
Object m(){
returnnewPrivateInPrivate().object;
}
}
后者并不广为人知,事实上也很少有用到。
Private是类的访问级别而不是对象