クラス内のアクセスルール
- 内部クラスは、直接プライベートメンバーを含む、外側のクラスのメンバーにアクセスすることができます。
内部クラスが外部クラスへの参照を保持しているため、形式は次のとおりです。外部クラス名.this - クラスの内部クラスの外にアクセスするために、我々は、内部オブジェクトを確立する必要があります。
class Outer { //外部类
private int x = 1;
class Inner{ //内部类
int x = 2;
void function() {
int x = 3;
System.out.println(x);
System.out.println(this.x);
System.out.println(Outer.this.x);
}
}
void method() {
Inner in = new Inner();
in.function();
}
}
public class InnerClassDemo {
public static void main(String[] args) {
Outer out = new Outer();
out.method();
Outer.Inner in = new Outer().new Inner();
in.function();
}
}
結果:
3
2
1
3
2
1
アクセス
- 場合クラスで定義されたクラスの外側部材、および非独占の内側の位置は、他のクラスで直接外部クラスのオブジェクト内に確立されてもよいです。
フォーマット:外部内部クラス名クラス名の外部オブジェクト変数名=内部クラスオブジェクト;. - クラス上の位置にあるとき、内側部材、メンバーは、改質修飾することができます。
たとえば、次のように外側のクラスにカプセル化されたプライベートな内部クラス。
静的:内部クラスには、静的そのような特性を持っています。(内部の静的クラスが変更されたときは、直接アクセスには制限があった、外側のクラスの静的メンバーのみにアクセスすることができます。)
静的な内部クラス
- 他の外部のクラスには、どのように直接アクセス非静的メンバ静的な内部クラス
class Outer {
private static int x = 1;
static class Inner {
void function() {
System.out.println(x);
}
}
}
public class InnerDemo2 {
public static void main(String[] args) {
new Outer.Inner().function();
}
}
- 他の外部のクラスでは、どのように直接アクセス静的メンバ静的な内部クラス
class Outer {
private static int x = 1;
static class Inner {
static void function() {
System.out.println(x);
}
}
}
public class InnerDemo3 {
public static void main(String[] args) {
Outer.Inner.function();
}
}
- 内部クラスが定義されたときに内部クラスの静的メンバは、静的である必要があり
コンパイル次のコードはコンパイルエラーが発生
class Outer {
private static int x = 1;
class Inner { //此内部类中定义了静态成员但是此内部类不为静态
static void function() {
System.out.println(x);
}
}
}
public class InnerDemo3 {
public static void main(String[] args) {
Outer.Inner.function();
}
}
- 内部クラスの外部クラスの静的メソッドへのアクセスは、クラスも内部の静的でなければならないとき。
原則定義された内部クラス
事を説明するとき、生き物物事の内側に、インナークラス内でこの時点で物事を説明する必要があります。
部分的な内部クラス
- 局所における内部クラス定義:
- メンバーは、修飾子を変更することはできません。
- 外側のクラスのメンバーへの直接アクセスは、のように、外部クラスへの参照を保持しています。しかし、あなたは唯一、最終的な変更のローカル変数にアクセスすることができ、ローカル変数にアクセスすることはできません。(最終的なJDKの現在のバージョンは、省略してもよいです)
class Outer {
void method(final int x) {
class Inner {
void function() {
System.out.println(x);
}
}
new Inner().function();
}
}
public class InnerDemo4 {
public static void main(String[] args) {
Outer out = new Outer();
out.method(7);
out.method(8);//因为局部变量在栈内存中,每次一调用入栈,使用结束出栈。所以虽然是被final修饰,但是仍然可以重复调用。
}
}
結果:
7
8
匿名内部クラス
- 匿名内部クラスは、実際に速記形式内部クラスです。
- 前提は匿名内部クラスを定義:
内部クラスは、クラスを継承するか、インタフェースを実装する必要があります。 - 匿名の内部クラスフォーマット:新しい親クラスまたはインタフェース(){}サブクラス化コンテンツ
abstract class Abs {
abstract void method();
}
class Outer {
int x = 3;
/*class Inner extends Abs {
@Override
void mthod() {
System.out.println(x);
}
}*/
public void function() {
//new Inner().mthod();
new Abs() {
@Override
void method() {
System.out.println(x);
}
}.method();
}
}
public class InnerDemo5 {
public static void main(String[] args) {
new Outer().function();
}
}
業績
3
コード上のコメント部は、匿名の内部クラスのフォームが出て反射されます。
- 匿名匿名内部クラスは、サブクラスのオブジェクトです。それは、その内容をオブジェクトとして理解することができます。
- 匿名内部クラスのメソッドではない3つ以下の最良の定義されています。
- クラスでもどちらも親クラス継承インタフェースを実装する場合は、匿名の内部クラスを作成するには、Objectクラスを使用することができます。
例えば:
public class InnerClassTest {
public static void main(String[] args) {
new Object() { //如果左边有Object类型引用(Object ob = ),将无法调用method方法
public void method() {
System.out.println("method run");
}
}.method();
}
}
練習
interface Inter {
void method();
}
class Test {
//补足代码,通过匿名内部类
}
public class InnerClassTest {
public static void main(String[] args) {
Test.function().method();
}
}
分析Test.function()メソッド();.コードのこの行は関数()は静的テストクラスのメソッド、関数法後および方法()()の呼び出しであるべきである見つけることができ、指定し通話機能()メソッドがなければならないことあなたは法()メソッドをコールし続けることができるようにそれは、対象とインナータイプのオブジェクトを返します。
あなたは以下のコードを取得することができます:
interface Inter {
void method();
}
class Test {
//补足代码,通过匿名内部类
static Inter function() { //这里返回值类型为Inner
return new Inter(){
@Override
public void method() {
System.out.println("Hello World");
}
};
}
}
public class InnerClassTest {
public static void main(String[] args) {
Test.function().method();
}
}