我是 Java 新手,对内部类有以下疑问:
实现内部类时,是否需要声明其属性和方法范围,即公共、私有、受保护?
编辑:由于没有委托(如在 C# 中),有人可以提到如何最好地在 Java 中实现一个能够在多个表单(Jframe)之间进行通信的消息传递系统?
我已经读过我可以为此使用内部类,但我也被告知我不应该实现超过几行大小的内部类。我应该去哪个学校?
我是 Java 新手,对内部类有以下疑问:
实现内部类时,是否需要声明其属性和方法范围,即公共、私有、受保护?
编辑:由于没有委托(如在 C# 中),有人可以提到如何最好地在 Java 中实现一个能够在多个表单(Jframe)之间进行通信的消息传递系统?
我已经读过我可以为此使用内部类,但我也被告知我不应该实现超过几行大小的内部类。我应该去哪个学校?
如果你想。
内部类大致与任何其他类一样。(除非您不将其声明为静态,否则它将具有 EnclosureClass.this 引用。)
在实现内部类时,我是否需要声明其属性和方法范围,即公共、私有、受保护?
这完全取决于您希望内部类的行为方式。默认情况下,内部类是非静态的:
public class Example1
{
int a;
public class Example2
{
int b;
void test () {}
}
}
非静态内部类只能在外部类的非静态方法中实例化。这是因为非静态内部类的每个实例都必须与外部类的一个实例相关联。从某种意义上说,非静态内部类的每个实例都存在于外部类的实例“内部”。外部类的单个实例可能与内部类的多个实例相关联。
因为非静态内部类的实例具有外部类的关联实例,所以内部类的方法可以直接访问外部类实例的任何成员(字段或方法)。比如上面定义的测试方法可以直接访问a和b
在另一个类中定义的类称为嵌套类。与类的其他成员一样,嵌套类可以声明为静态的,也可以不声明。非静态嵌套类称为内部类。内部类的实例只能存在于其封闭类的实例中,并且可以访问其封闭类的成员,即使它们被声明为私有。下表显示了嵌套类的类型:
嵌套类的类型 类型 范围 内部静态嵌套类成员 否 内部 [非静态] 类成员 是 本地类 本地 是 匿名类 仅限于定义点 是
I would suggest treating inner classes as private
.
In Java, an outer class and all of its nested (including inner) classes can fiddle with each others private
s. (The generated bytecode may be pointlessly verbose with additional synthetic access methods, but this is highly unlikely to matter.)
From an interface point of view, a class having weird inner class types is a bit weird. And more difficult to test if you are into that sort of thing. Too often nested type are created because creating a new file in a bad IDE is a bit of a pain - don't be tempted with nasty shortcuts.
Having said that inner classes are very useful. Use them with taste.
尽管这不是您的问题的答案,但请确保您了解内部类的“静态”修饰符。
public class Stuff {
public static class SubStuff {
//private or protected
}
}
与此不同:
public class Stuff {
public class SubStuff {
//only private
}
}
如果你有一个静态内部类,那么你可能需要受保护的变量、受保护的方法等等。但是对于不是静态的内部类,您通常希望所有内容都是私有的。
谷歌的区别。
只有封闭类才能看到内部。它主要用于在类中实现实用功能。让我们以门和密码为例。
public class Door {
public boolean isPassword(String key) {
//local inner class - its hidden from the world
class Password{
public boolean isPassword(String key) {
if(!key.equals("xyz")) {
System.out.println("Not Password. Door is locked");
return false;
}else {
System.out.println("Password corect. Door is opened");
return true;
}
}
}
return new Password().isPassword(key);
}
}