本文没有新内容。 我只是收集了一些琐碎的语句,对于某些初级程序员来说,这可能并非琐碎。 无聊的旧东西。
如果您发生了所有这些事情,那么您对Java的了解将比普通的家庭妻子要多。 我不知道是否有必要了解所有这些内容。 如果您不了解其中某些功能,则可以成为一名相当不错的Java程序员。 但是,本文中的许多新信息可能表明您还有发展空间。
有4种不同的保护类型
在Java中(不是三个)。 这些是private
,打包的私有的, protected
和public
。 如果在类中定义元素时未指定任何保护修饰符,则它将被包装为私有(而不是公共且不受保护)。
另一方面,如果您未在接口的方法声明前指定保护修饰符:它将是公共的。 您可以将其指定为显式public
但是它对Java没有影响,SONAR不会像您那样做。
我对Java的看法是,这是技术错误,它允许您选择是否在接口的方法前面编写public
。
同样,您可以在接口中字段的前面甚至是static
编写final
。 这可能暗示它们可能是非静态的或非最终的:不正确。 接口的字段是final和static。 总是。
受保护和私有包不一样
程序包私有(或默认)保护将使同一程序包的其他类可以访问方法或字段。 受保护的方法和字段可以在同一包中的类中使用(到目前为止与私有包相同),此外,还可以从扩展包含受保护的字段或方法的类的其他类中使用受保护的方法和字段。
受保护是可传递的
如果有三个包a
, b
和c
,每个包含一个已命名的类A
, B
和C
使得B
延伸A
和C
延伸B
那么类C
可以访问的受保护的字段和方法A
。
package a;
public class A {
protected void a() {
}
}
package b;
import a.A;
public class B extends A {
protected void b() {
a();
}
}
package c;
import b.B;
public class C extends B {
protected void c() {
a();
}
}
接口无法定义受保护的方法
许多人认为您还可以在接口中定义protected
方法。 在对程序进行编程时,编译器可以快速而残酷地使它变得显而易见:您不能。 顺便说一句:这就是为什么我认为在界面中允许使用public
关键字是技术上的错误:它使人们认为它也可能是其他东西。
如果要在接口中声明一个protected
方法,则可能不了解封装。
私人不是那么私人
专用变量和方法在编译单元内部可见。 如果听起来太神秘了:在同一个Java文件中(几乎)。 这比“在定义它们的类中”要多。 从同一编译单元中的类和接口也可以看到它们。 内部类和嵌套类可以看到私有字段和包含它们的类的方法。 但是,封闭类也可以看到它们封闭到任何深度的类的私有方法和字段。
package a;
class Private {
private class PrivateInPrivate {
private Object object;
}
Object m() {
return new PrivateInPrivate().object;
}
}
后者并不广为人知。 事实上,它很少有用。
私有不是课程级别的对象
如果可以访问变量或方法,则无论它属于哪个对象,都可以访问它。 如果this.a
是可访问的则another.a
也接近假定another
是同一个类的实例。 属于同一类实例的对象可以互相愚弄变量或方法。 虽然很少有这样的代码。 现实生活中的异常是equals()
(由Eclipse第15和18行生成):
package a;
public class PrivateIsClass {
private Object object;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PrivateIsClass other = (PrivateIsClass) obj;
if (object == null) {
if (other.object != null)
return false;
} else if (!object.equals(other.object))
return false;
return true;
}
}
静态类可能有很多实例
不应具有任何实例的类通常称为实用程序类。 它们仅包含静态字段和静态方法,并且唯一的构造函数是私有的,不会从该类的任何静态方法中调用。 在Java 8中,您可以在接口中实现这种野兽,因为Java 8接口中可以包含静态方法。 我不认为我们应该使用该功能而不是实用程序类。 我并不完全相信我们应该完全使用实用程序类。
静态类始终位于另一个类(或接口)中。 它们是嵌套类。 它们是静态的,就像静态方法无法访问类的实例方法和字段一样,静态嵌套类也无法访问嵌入类的实例方法和字段。 这是因为嵌套类没有对嵌入类实例的引用(如果需要,可以使用指针)。 与嵌套类相反,内部类是非静态的,没有嵌入类的实例就无法创建。 内部类的每个实例都有对嵌入类的一个实例的引用,因此内部类可以访问嵌入类的实例方法和字段。
因此,如果没有周围类的实例,就无法创建内部类。 如果这是当前对象(也称为this
,则无需指定它。 在这种情况下,您可以编写new
,在这种情况下,它只是this.new
的简写形式。 在静态环境中,例如从静态方法中,您必须指定内部类应使用哪个封闭类实例创建内部类。 参见第10行:
package a;
class Nesting {
static class Nested {}
class Inner {}
void method(){
Inner inner = new Inner();
}
static void staticMethod(){
Inner inner = new Nesting().new Inner();
}
}
匿名类只能访问最终变量
当在方法内部定义匿名类时,它可以访问局部变量(如果它们是最终的)。 但这是含糊的。 他们必须被宣布为final
并且他们也必须是有效的决赛。 这是Java 8中发布的内容。您无需将此类变量声明为final
但它们仍必须是有效的final。
无论如何,为什么必须要声明final的东西呢? 像方法参数一样。 他们也必须是决赛。 您说这不是Java的要求吗? 好吧,你是对的。 这是良好风格编程的要求。
翻译自: https://www.javacodegeeks.com/2014/11/some-sentences-about-java.html